关于串口USART使用时相关注意事项

发布时间 2023-08-09 19:37:46作者: ZaiLi

1、关于串口波特率的计算

波特率计算公式如下:

TX/RX波特率=FCLK/(16*USARTDIV)

USARTDIV=DIV_Mantissa+(DIVFraction/16)

以USART1波特率115200为例,FCLK为72M,则USARTDIV值为39.0625,即

39.0625=DIV_Mantissa+(DIVFraction/16)

其中,DIV_Mantissa表示整数部分,为36,DIVFraction/16表示小数部分,为0.0625,则DIVFraction的值为1.

 

2、关于串口通信修改波特率

注意若要在串口数据传输过程中修改波特率,建议在完成一次数据通信之后再修改波特率,修改波特率时建议先关闭串口,调用函数USART_Cmd(USART2, DISABLE);,以免造成数据传输错误,出现乱码,修改完成后再使能开启串口,调用函数USART_Cmd(USART2, ENABLE)。

如果想要多次修改波特率值,可以写一个数组,里面包括你想要切换的波特率,实时监测切换就行。波特率修改可参考下列函数。

 

3、关于串口发送数据是上次DR中的数据问题

在 TC=1 和 写DR寄存器同时发生下,会出现发送的数据是上次DR中的数据。

解决方法,建议使用TC标志判断,因为软件会读,相当于有延时。确保写DR寄存器的时候,上一个数据不要正好发完。

 

4、关于串口空闲中断标志位清除问题

空闲中断是在检测到在数据收受后,总线上在一个字节的时间内没有再接收到数据时发生。即串口的RXNE位被置位之后才开始检测,检测到空闲之后,串口的CR1寄存器的IDLE位被硬件置1,必须采用软件将IDLE位清零才能避免反复进入空闲中断。具体的做法是先读取USART_SR,再读取USART_DR。需要注意的是,不能采用库函数USART_ClearFlag()或者USART_ClearItPending()来清除IDEL标注,因为这两个函数接收的中断标志位仅包括:

USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5).
USART_FLAG_LBD: LIN Break detection flag.
USART_FLAG_TC: Transmission Complete flag.
USART_FLAG_RXNE: Receive data register not empty flag.