各位老鐵,上一篇文章 咱們討論了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從小到大,做大做強,勇創輝煌!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294050.html
標籤:其他
上一篇:IoT Master 物聯大師
