stm32接收中断标志位无法清零

编程入门 行业动态 更新时间:2024-10-09 01:14:01

stm32接收中断标志位无法<a href=https://www.elefans.com/category/jswz/34/1717504.html style=清零"/>

stm32接收中断标志位无法清零

标志位 和 中断标志位
思考:他们是怎么被置1的?一般是硬件置1,满足什么条件它会被置1
怎么被置零的:硬件置零还是程序员手动清零???

数据寄存器 移位寄存器 控制寄存器

接收相关标志位

USART_FLAG_RXNE是接收数据寄存器非空标志位,
USART_IT_RXNE为接收中断标志位,也就是说,串口一接收到数据,这两个标志位都会被置位

发送相关标志位

USART_FLAG_TC 发送完成标志
当发送移位寄存器中的1字节数据已经通过TX脚一位一位的移出去后,该标志位就会被置1,从而引发该事件的中断。所以,其实USART_FLAG_TC就是用来标志“发送移位寄存器中的数据有没有全部发送出去”这件事的。

USART_FLAG_TXE 发送缓冲区空标志
当发送数据寄存器中的数据已经取完了,该标志位就会被置1,从而引发该事件的中断。所以,其实USART_FLAG_TXE就是用来标志一个事件的,通过它的值可以知道该事件有没有发生(即发送数据寄存器中的数据有没有被取走)

STM32串口 IDLE中断

IDLE其实是 空闲的意思。IDLE中断叫空闲中断,不叫帧中断。那么什么叫空闲,怎么定义空闲呢?
在实际发送数据的时候,比如一串字符串,我们会采用如下方式发送

void uart1_putc(char dat){SBUF = dat;while (!TI);TI = 0;
}
void uart1_puts_n(char *str){while (*str)uart1_putc(*str++);
}
void uart1_puts_n("i am handsome");

其实发送的两个字符之间间隔非常短,所以在两个字符之间不叫空闲。空闲的定义是总线上在一个字节的时间内没有再接收到数据,空闲中断是检测到有数据被接收后,总线上在一个字节的时间内没有再接收到数据的时候发生的。
而总线在什么情况时,会有一个字节时间内没有接收到数据呢?一般就只有一个数据帧发送完成的情况,所以串口的空闲中断也叫帧中断。
要怎么开启帧中断呢?
其实其他串口配置不用改变,只需要在开启串口接收中断的时候加上一句话就Ok。

USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接收中断
USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//开启串口空闲中断

然后中断函数如下

void USART2_IRQHandler(void){                	//串口1中断服务程序int clear;if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){  //字符接收中断(接收到的数据必须是0x0d 0x0a结尾)USART2_RX_BUF[length++] = USART2->DR & 0x0FF;}else if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){//空闲帧中断if(USART2_RX_BUF[length - 1] == 0xff){clear = USART2->DR;clear = USART2->SR;length = clear;length = 0;USART2_RX_STA = 1;}else{;}}
}

在普通中断的时候仅仅保存数据,在帧中断的时候需要执行相应处理函数。
如果没有帧中断,必须在接收中断中判断每一个接收数据与帧头帧尾是否相符,效率极低。
之前一直以为天下串口都一样,还是有很多细节的,可以提升不少效率!

原文链接:添加链接描述

更多推荐

stm32接收中断标志位无法清零

本文发布于:2024-02-28 03:11:34,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1768097.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:清零   标志

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!