STM32 HAL库 串口中断

Posted 乐观的果实521

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 HAL库 串口中断相关的知识,希望对你有一定的参考价值。

     各位老铁,上一篇文章 咱们讨论了STM32中断家族中的外部中断 。下面就和各位老铁分享下串口中断的奥秘。

  (一)            串口中断是干什么?就是接受数据的,接受一个数据中断就执行一次,直到数据

接受 结束。下面我们以接受一个字符串“LXH/r/n”为例解释一下。  

  (二)                                          USART_RX_STA

BIT15BIT14BIT13~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库 串口中断的主要内容,如果未能解决你的问题,请参考以下文章

细究STM32 HAL库的中断式串口接收

HAL库 STM32CubeMX--USART串口通信--补充

STM32使用HAL库实现串口通讯——实战操作

STM32HAL 串口发送(中断方式)

基于STM32的串口收发讲解(HAL库)

基于STM32的串口收发讲解(HAL库)