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和NRF24L01实现无线传输
下一篇:STM32的RTC闹钟唤醒待机模式
推荐阅读最新更新时间:2024-03-16 15:43