基础了解
- 单片机程序的调试,我们通过把printf的打印通过串口输出到电脑上,然后就可以很方便的进行软件程序的调试。
- 数据通信方式:串行通信、并行通信。
- 数据传输方向:单工(固定一个方向)、半双工(同时仅一个方向)、全双工(同时可以两个方向)。
- 数据同步方式:同步通信(双方按照同步时钟进行通信)、异步通信(没有同步时钟,数据中约定开始结束位;有些双方约定好传输速率)。
- 通信速率:比特率(bit/s)、波特率(码元/秒);码元-一定bit的数据信息量;
- 串口通信协议数据帧格式:
说明,校验位:奇校验(有效数据中1的个数为奇数,例如2个,则校验位置1);偶校验(有效数据中1的个数为偶数,例如2个,则校验位置0);0校验(校验位置0);1校验(校验位置1);无校验(不包含校验位)
STM32F1串口
stm32f1有2个UART和3个USART。USART1的时钟来源于APB2时钟,最大频率72MHZ;其它4个串口时钟来源于APB1时钟,最大频率36MHZ。
①USART信号引脚
TX:发送数据输出引脚
RX:接收数据输入引脚
SCLK:发送器时钟输出,适用于同步传输
SW_RX:数据接收引脚,属于内部引脚,用于智能卡模式
IrDA_RDI:IrDA 模式下的数据输入
IrDA_TDO:IrDA 模式下的数据输出
nRTS:发送请求,若是低电平,表示 USART 准备好接收数据
nCTS:清除发送,若是高电平,在当前数据传输结束时阻断下一次的数据发送
②数据寄存器
USART_DR由TDR和RDR组成,具有读写权限;
当发送数据时,数据会写入到TDR;当接收数据时,数据会存储在RDR;
USART_DR低9位数据有效,其它位保留。第9位是否有效由USART_CR1寄存器的M位决定,当M位为0则表示8位数据字长;当M位为1则表示9为数据字长。(一般使用8位数据字长)
当使能校验位(USART_CR1中PCE位置1)进行发送数据,MSB的值是校验位的值。
③控制器
USART有专门的发送控制器,接收控制器,唤醒单元、中断控制等等。
④时钟和波特率
USART配置时钟和波特率。
baud = fck/(16 * USARTDIV)
fck是给串口的时钟(USART2\3\4\5的时钟源是PCLK1,USART1的时钟源是PCLK2)
USARTDIV存放在USART_BRR寄存器的低16位,DIV_Mantissa[11:0]存放整数部分,DIV_Fractionp[3:0]存放小数部分。
例如:115200 = 72000000 / (16 ∗ USARTDIV)
USARTDIV = 39.0625, 整数39即0x27;小数0.625即0.625*16 = 1 ;所以USART_BRR = 0x271
- 发送配置步骤:
①通过在USART_CR1寄存器上置位UE位来激活USART
② 编程USART_CR1的M位来定义字长。
③ 在USART_CR2中编程停止位的位数。
④ 如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中
的描述配置DMA寄存器。
⑤ 利用USART_BRR寄存器选择要求的波特率。
⑥ 设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。
⑦ 把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。在只有一个缓冲器的情况
下,对每个待发送的数据重复步骤7。
⑧ 在USART_DR寄存器中写入最后一个数据字后,要等待TC=1,它表示最后一个数据帧的传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏最后一次传输。 - 接收配置步骤
① 将USART_CR1寄存器的UE置1来激活USART。
② 编程USART_CR1的M位定义字长
③ 在USART_CR2中编写停止位的个数
④ 如果需多缓冲器通信,选择USART_CR3中的DMA使能位(DMAR)。按多缓冲器通信所
要求的配置DMA寄存器。
⑤ 利用波特率寄存器USART_BRR选择希望的波特率。
⑥ 设置USART_CR1的RE位。激活接收器,使它开始寻找起始位。
串口寄存器了解
1)串口时钟使能
串口1时钟使能,APB2ENR寄存器的USART1EN位。其它串口时钟使能,由APB1ENR寄存器对应位控制。
APB2ENR
APB1ENR
2)串口复位
开始配置外设的时候,都会先执行复位该外设操作。
APB2RSTR
APB1RSTR
3)串口波特率设置
每个串口都有自己的波特率寄存器USART_BRR。
4)串口控制
每个串口都有3个控制寄存器USART_CR1~3。串口的很多配置都是通过这3个寄存器设置的。
USART_CR1,具体请查看手册
USART_CR2
USART_CR3
5)数据发送与接收
6)串口状态
串口状态可以通过串口状态寄存器USART_SR读取。
RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。
TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:
1)读 USART_SR,写 USART_DR。
2)直接向该位写 0。
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);//用于初始化异步模式的收发器。
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);//用于开启以中断的方式接收指定字节。数据接收在中断处理函数里面实现。
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);//该函数是 HAL 库中断处理公共函数,在串口中断服务函数中被调用。