实验目的:实现字符/字符串收发
一,总线相关
1,总线:各个部件之间传输的一种媒介
芯片内部总线:核与芯片内部控制器进行连接
A7---AHB4总线---GPIO控制器
A7---AHB4总线---RCC控制器
芯片外部总线:SOC与各个外设这件连接
PC---UART总线---Target
SOC---IIC总线---温湿度传感器
SOC---SPI总线---数码管
2,串行总线 / 并行总线:
串行总线 :在同一时刻,根据时钟线的变化,数据线只能收发一位数据,优点:占用引脚资源少,缺点:收发数据比较慢
并行总线:在同一时刻可以收发多位数据,优点:传输速度比较快,缺点:占用引脚资源多
3,单工 / 半双工 / 全双工:
单工:要么发送,要么接收,只能选一个
半双工:可以收,可以发,不能同时收发
全双工:可以同时进行收发
4,同步 / 异步:
1,同步:双方通讯时,共用一个时钟源,一根时钟线
2,异步:双方通讯时,有各自的时钟源,不存在时钟线,需要配置时钟源一致
5,连接方式:
1,直连
2,USB转串口连接方式
串口电平:RS232电平
SOC:TTL电平
3,ST-LINK仿真器连接方式
ST-LINK仿真器作用:完成USB协议和串口协议之间转换
在ST-LINK仿真器,有一个芯片STM32F103,在芯片内部固化一端代码 === 完成协议之间转换
这段代码不开源,通电自动工作
二,串口通信信息(异步串行全双工总线)
1,配置信息
波特率:115200 ====1s可以收发115200bits数据
单位:bps(二进制 / 秒),比特率
8:8位数据位
N:无校验位
1:1位停止位
2,串口通讯协议
1,空闲态:总线不进行数据传输时,处于空闲态,高电平
2,起始位:通讯开始的标志,低电平
3,数据传输:收据收发,先发送低位,再发送高位
4,校验位:奇校验:数据中1个数为奇数,补0,数据中1个数为偶数,补1
偶校验:数据中1个数为奇数,补1,数据中1个数为偶数,补0
5,停止位:收发结束标志,高电平
校验时钟源:异步通讯,双方有各自的时钟源,每发一帧数据,数据都会产生误差,误差会累积,所以需要校准时钟源
三,分析电路
USART / UART:Universal synchronous/asynchronous receiver transmitter 通用同步 / 异步接收 / 发送
网络编号 === 引脚编号
UART4_TX === PG11
UART4_RX === PB2
1,框图
1,分析RCC / GPIO / UART章节
2,RCC:使能 GPIOB / GPIOG / UART4组
3,GPIO:1)设置复用功能模式,2)设置引脚对应功能
4,UART:1)初始化相关操作,2)实现数据收发
四,分析RCC章节
1,确定总线连接
A7---AHB4总线----RCC控制器 / GPIO控制器
A7---APB1总线---UART控制器
2,基地址
GPIOF:0x50008000
GPIOB:0x50003000
RCC:0x50000000
UART4:0x40010000
3,分析寄存器
1,分析RCC_MP_AHB4ENSETR寄存器
作用:使能GPIO组控制器
地址:0x50000000 + 0xA28 = 0x50000A28
伪代码:RCC_MP_AHB4ENSETR [1] = 1 === GPIOB
RCC_MP_AHB4ENSETR [6] = 1 === GPIOG
2,分析RCC_MP_APB1ENSETR寄存器
作用:使能UART组控制器
地址:0x50000000 + 0xA00 = 0x50000A00
伪代码:RCC_MP_APB1ENSETR [16] = 1
五,分析GPIO章节
1,分析GPIOx_MODER寄存器
作用:设置GPIO引脚模式为复用功能模式(输入,输出,复用,模拟)
地址:0x50003000 + 0x00 = 0x50003000 === GPIOB
0x50008000 + 0x00 = 0x50008000 === GPIOG
伪代码:GPIOB_MODER [5:4] = 01 === GPIOB
GPIOG_MODER [23:22] = 01 === GPIOG
2,分析GPIOx_AFRL寄存器
作用:设置GPIO引脚(0~7引脚)复用功能
地址:0x50003000 + 0x20 = 0x50003020
伪代码:GPIOB_AFRL [11:8] = 1000 === GPIOB
2,分析GPIOx_AFRH寄存器
作用:设置GPIO引脚(8~15引脚)复用功能
地址:0x50008000 + 0x24 = 0x50008024
伪代码:GPIOG_AFRL [15:12] = 1000 === GPIOG
六,分析UART章节
1,内部框图
2,芯片内部协议
3,发送一个字符流程
4,接收一个字符流程
5,分析寄存器
1,分析USART_CR1寄存器
作用:初始化 / 使能操作
地址:0x40010000 + 0x00 = 0x40010000
伪代码:USART_CR1[28[12] = 00 ==== 设置串口1位起始位,8位数据位
USART_CR1[15] = 0 ==== 设置串口16倍采样率,和波特率设置有关
USART_CR1[10] = 0 ==== 设置串口无校验位
USART_CR1[3] = 1 ==== 设置串口发送位使能
USART_CR1[2] = 1 ==== 设置串口接收位使能
USART_CR1[0] = 1 ==== 设置串口使能
2,分析USART_CR2寄存器
作用:设置串口停止位
地址:0x40010000 + 0x04 = 0x40010004
伪代码:USART_CR2[13:12] = 00 ==== 设置串口1位停止位
3,分析USART_BRR寄存器
作用:设置串口波特率为 115200
地址:0x40010000 + 0x0C = 0x4001000C
伪代码:USART_BRR = 0x22B 公式:主频64MHz / 115200 = 0x22B
4,分析USART_RDR寄存器
作用:设置串口接收数据寄存器
地址:0x40010000 + 0x24 = 0x40010024
伪代码:ch = USART_RDR
5,分析USART_TDR寄存器
作用:用来存放串口发送数据
地址:0x40010000 + 0x28 = 0x40010028
伪代码:USART_TDR = ch
6,分析USART_PRESC寄存器
作用:设置串口分频,本实验设置位不分频
地址:0x40010000 + 0x2C = 0x4001002C
伪代码:USART_PRESC [3:0] = 0000 设置位不分频
7,分析USART_ISR寄存器
作用:判断收发寄存器状态
地址:0x40010000 + 0xC0 = 0x400100C0
伪代码:
USART_ISR [7] ==== 判断发送数据寄存器是否为空:发送寄存器满,需要等待,直到发送数据寄存器为空才可以发送下一位数据
0:发送数据寄存器满,需要等待 1:发送数据寄存器空,可以发送下一位数据
USART_ISR [6] ==== 判断一帧数据是否发送完成
0:没有发送完成,需要等待 1:发送完成,可以发送下一帧数据
USART_ISR [5] ==== 判断接收数据寄存器中是否有数据可以读
0:没有收到数据,需要等待 1:接收到数据,可以读