STM32 串口首次发送数据 会丢失第一个字节

查阅stm32f10x参考手册,找到这样一句话:

TC:发送完成

当包含有数据的一帧发送完成后,由硬件将该位置位。如果USART_CR1中的TCIE为1,则产生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)。TC位也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。

0:发送还未完成;

1:发送完成。

注意到这一句:由软件序列清除该位(先读USART_SR,然后写入USART_DR)。 也就是说,要先read USART_SR,然后write USART_DR,才能完成TC状态位的清除。而硬件复位后,串口发送的首个数据之前没有read SR的操作,是直接write DR,也就是说,TC###没有被清除掉。

硬件复位后,串口发送首个数据之前,先读取一下USART_SR,则能够保证首个数据发送时,不出现覆盖的情况。当然,也有别的方法,比如先清除TC状态位,

USART_ClearFlag(USART1, USART_FLAG_TC);USART1->SR&=~(1<<7);

转载自http://t.zoukankan.com/longbiao831-p-4556288.html

posted @ 2022-06-17 08:07  huameixiao  阅读(311)  评论(0编辑  收藏  举报