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