目录
该博客文章初衷是记录本人在嵌入式路上学习和实践的足迹,意在巩固与记录。记录的同时也希望能对你有所帮助。
HAL库更新之后增加了空闲中断函数,在学习HAL库的过程中发现其优点明显,且网上并没有找到相关的讲解和实例,故作此分享。
空闲中断的理解:
在串口通信中,发送的两个字符之间间隔非常短,所以在两个字符之间不叫空闲。空闲的定义是总线上在一个字节的时间内没有再接收到数据,空闲中断是检测到有数据被接收后,总线上在一个字节的时间内没有再接收到数据的时候发生的。
当总线一个数据帧发送完成,一个字节时间内没有接收到数据后,系统开启空闲中断。所以串口的空闲中断也叫帧中断。
空闲函数的优点:
如果没有帧中断,必须在接收中断中判断每一个接收数据与帧头帧尾是否相符,效率极低。使用空闲中断后,只需识别缓冲区的帧头即可。注意,这里不是在接收时判断,而是接收完成后判断。
代码示例:
重定义回调函数:
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)//空闲中断回调函数
{
//执行自己编写的代码
HAL_UARTEx_ReceiveToIdle_IT(&huart1,rxbuff,10);
//重新开启空闲中断接收
}
main函数里面要先开启一次空闲中断接收:
int main(void)
{
HAL_UARTEx_ReceiveToIdle_IT(&huart1,rxbuff,5);
while(1)
{
}
}
rxbuff是自己定义的接收缓冲区;
多串口开启空闲中断接收:
在做项目时还遇到一点,stm32内部串口的接收缓冲区是共用的,所以想要多串口开启空闲中断接收就需要串口轮流使用接收缓冲区,也就是轮流开启空闲中断接收。
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)//空闲中断回调函数
{
if(huart->Instance==USART1)
{
if(rxbuff[0] == 0x14)//判断帧头
{
//处理函数
HAL_UARTEx_ReceiveToIdle_IT(&huart3,rxbuff,10);
}
else
{
//数据有误,重新接收
HAL_UARTEx_ReceiveToIdle_IT(&huart1,rxbuff,5);
}
}
else if(huart->Instance==USART3)
{
if(rxbuff[0] == 0xFF)//判断帧头
{
//处理函数
HAL_UARTEx_ReceiveToIdle_IT(&huart1,rxbuff,5);
}
else
{ //数据有误,重新接收
HAL_UARTEx_ReceiveToIdle_IT(&huart3,rxbuff,10);
}
}
}
接收缓冲区在重新开启空闲中断时就已经清除;
若有不当欢迎指正或补充。