上篇文章介绍了串口数据帧检查问题,今天说说另两个问题,串口空闲和通信量问题。
4、 串口空闲
前面一直提到串口空闲,也大概明白串口的作用,但是一些细节问题还是需要好好说一下的。
第一个问题,如何清除串口空闲中断标志位?
很多人会使用 USART_ClearFlag 标准库函数进行清除,但是当你跳转到该函数原型时,你会看到如下说明:
你会看到很多标志位是无法通过该函数清除的。
那么该如何清除 IDLE 标志呢?其实上面的注释已经进行了说明。
PE、FE、NE、ORE、IDLE 标志位的清除是通过一个软件序列进行清除的:首先通过 USART_GetFlagStatus 读取 USART_SR 寄存器的值,然后通过 USART_ReceiveData 函数读取 USART_DR 的值即可。
那么这里就有一个问题,是否这些标志问题的清除都要单独编写清除序列呢?
答案是否定的。
因为这些标志位都是由同一种序列进行清除的,所以只要一个清除序列就会把所有的标志位都进行清除了(同样一旦执行了这个序列,也就意味着你无法再通过 USART_SR 寄存器获得标志位了)。
为了保证获取标志位,我们可以在清除序列之前把 USART_SR 寄存器的值保存到副本中&#