×
单片机 > 单片机程序设计 > 详情

STM32 串口发送来龙去脉以及一些问题的分析

发布时间:2020-05-28 发布时间:
|

1.介绍的串口部分会有如下优缺点:

优点:简单,适合很少量数据传输。(只要求这个优点,其实本可以不用串口中断,但是为了知道来龙去脉,避免串口故弄玄虚,故加入中断进行串口发送的分析。)

缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失。

2.了解一些基础知识:

TXE=1代表发送数据寄存器空。

TC=1代表移位寄存器传输完成。

TXEIE允许在TXE标志为'1'时产生中断

TCIE允许在TC标志为'1'时产生中断

画个图介绍数据传输:

串口发送数据

3.采用判断TC的方式进行串口中断发送字符串.

a.首先按照官网上的配置进行(这么晚了,码字太难了,直接上手写版)

官网配置

配置完了就得使能TC:

USART_ITCongfig(USART1,USART_IT_TC,ENABLE);

注意:此时使能了TC,在上述第6步里面会有 发送空闲帧的步骤。发送完毕,要是不加个清除TC标志的程序,可能会丢失第1个字节的数据,所以我们加上。

DelayMs(10);

USART_ClearFlag(USART1, USART_FLAG_TC);

注意:加完了还是会出现错误,空闲帧没发完,就清零发送完成标志,导致使能TC之后就开始进入中断,故中间还加个延时,如上。

2.发送数据函数

void USART_SendDataString( u8 *pData )

{   pDataByte = pData;    

    USART_ClearFlag(USART1, USART_FLAG_TC);//作用和上面一样,清除传输完成标志位,否则可能会丢失第1个字节的数据.       

USART_SendData(USART1, *(pDataByte++) ); //必须要++,不然会把第一个字符t发送两次}

3.中断处理函数

void USART1_IRQHandler(void){   

 if( USART_GetITStatus(USART1, USART_IT_TC) == SET  )   

 {        if( *pDataByte == '\0' )//待发送的字节发到末尾NULL了

USART_ClearFlag(USART1, USART_FLAG_TC);//不然TC一直是set, TCIE也是打开的,导致会不停进入中断. clear掉即可,不用关掉TCIE        

else            

USART_SendData(USART1, *pDataByte++ )//我觉得此句为多余

  }}

发送完字符串后,不用关闭TC的中断使能TCIE,只需要清掉标志位TC;这样就能避免TC == SET 导致反复进入中断了。

最后一定得注意,无论在哪里配置:

USART_ITCongfig(USART1,USART_IT_TC,ENABLE);

都不能立即跟上一个清除TC标志位函数。。。。否者,结果如上。


关键字:STM32  串口发送

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
关于89C52单片机11.0592M晶振产生115200波特率的方法