STM32 HAL库 串口中断
Posted 乐观的果实521
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 HAL库 串口中断相关的知识,希望对你有一定的参考价值。
各位老铁,上一篇文章 咱们讨论了STM32中断家族中的外部中断 。下面就和各位老铁分享下串口中断的奥秘。
(一) 串口中断是干什么?就是接受数据的,接受一个数据中断就执行一次,直到数据
接受 结束。下面我们以接受一个字符串“LXH/r/n”为例解释一下。
(二) USART_RX_STA
BIT15 | BIT14 | BIT13~0 |
0X0A(\\n) | 0X0D(\\r) | 表示接收数据的个数
|
这是什么?这是串口接受状态标记,这里我们定义 U16 USART_RX_STA=0。
(三)设计思路:
if((__HAL_UART_GET_FLAG(&UART1_Handler,UART_IT_RXNE)!=RESET))
__HAL_UART_GET_FLAG : 这个函数是检查是否设置了指定的UART标志;USART_IT_RXNE为接收中断标志位,也就是说,串口一接收到数据,这个标志位都会被置位。
这里当接受到一个数据时,中断标志位中断被置SET,__HAL_UART_GET_FLAG:检查到 中断标位SET时,继续执行接受数据的步骤。
if((USART_RX_STA&0x8000)==0)//接收未完成
假设已经接受了一个数据,一共有三个数据,则没由接受完成。
这里 0000 0000 0000 0001(此时的USART_RX_STA为1)和1000 0000 0000 0000(\\n:第15位置1,接受数据完成的标志)进行与运算如果为零,则没有接受完数据。进行下一步:
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
数据结束的标志有两个一个\\n 一个\\r,如果此时接受到了倒数第二个标志 \\r ,也就是0000 0000 0000 0000 和0100 0000 0000 0000进行与运算;接着这里出现了一个数组 aRxBuffer[],这个数组的作用是显示数据内容,如果接受到了\\r而没有接收到\\n ,则接受错误,重新开始USART_RX_STA=0;否则接受完成,将第15位置1.接受完成这里用的是或运算。
else //还没收到0X0D
{
if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
否则还没接受到0x0D,很明显上面我们假如了三个数据,还有两个数据,没有接受到0x0d。
则有,进到了一个IF语句判断这次是不是接受到了0x0d,如果是,也就是说此时的USART_RX_STA经过自加运算从0增加到2(0000 0000 0000 0010),则是0000 0000 0000 0010和0100 0000 0000 0000进行或运算得到0100 0000 0000 0100也就是0x4002,也就是进行到了第三个数据;
那么此时我们还没有到第三个数据,我们仅仅才接受了一次数据,
则执行下面的else USART_RX_STA(0000 0000 0000 0001)&0X3FFF(0011 1111 1111 1111)得到
0000 0000 0000 0001也就是1,这个是用来计算数据的个数,数组计数是从0到i,上面我们假如了已经接受了一次数据,则此时就是1, 从0到1正好是两次。
最后一个IF语句表达的是如果接受的数据超过了最大数据接收字节,则会出现数据接受错误。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)//如果是串口1
{
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
这是整个串口中断回调的内容。
这个关于串口中断就说到这里,欢迎与各路大佬交流。
最后,祝所有 信息学子在STM32从小到大,做大做强,勇创辉煌!
以上是关于STM32 HAL库 串口中断的主要内容,如果未能解决你的问题,请参考以下文章