stm32 SysTick/EXTI/USART中斷過程

這個我會發表於2020-09-25

本文中例子所使用的是stm32f103+標準庫函式, 宣告.

SysTick中斷過程

SysTick是配置好重灌載計數器(STK_LOAD)後, 並使能了SysTick.

SysTick功能框圖
SysTick功能框圖
每當隨著STK_CLK, 只要遞減計數器(STK_VAL)慢慢減到0後, 就會發生一次中斷, 進入到SysTick的中斷服務函式中.
也就是每過(STK_LOAD/STK_CLK)時間, 就發生一次中斷, 進入到中斷服務函式中.


EXTI中斷過程

EXTI功能框圖
EXTI功能框圖

EXTI是外部中斷, 配置好某個GPIO口, 並配置對應的EXTI, 設定為上升沿/下降沿/雙邊沿.
每當這個GPIO口發生了上升沿/下降沿/雙邊沿, 就發生一次中斷, 進入到EXTI的中斷服務函式中.


USART中斷過程

USART的中斷過程是配置USART函式中, 使能了一些中斷.
USART中斷事件
USART中斷事件
上列表格是所有USART可以發生的中斷, 若要允許中斷, 則要載USART_CR1中進行配置, 標準庫函式中USART_ITConfig()函式進行配置.

例如下列程式碼

USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);    //使能串列埠接收暫存器不為空中斷
USART_ITConfig ( DEBUG_USARTx, USART_IT_IDLE, ENABLE ); //使能串列埠匯流排空閒中斷

RXNE是接收暫存器不為空, 就是接收到一個位元組產生中斷
IDLE就是空閒線路, 也就是接收到一幀資料後產生中斷, 一幀資料就是這一次傳送的資料

例如當有一幀資料從USART傳送到stm32中
第一個位元組到接收暫存器後, RXNE被置1, 發生RXNE中斷
然後進入中斷服務函式, 執行程式, 清除RXNE
第二個位元組到接收暫存器後, RXNE被置1, 發生RXNE中斷
然後進入中斷服務函式, 執行程式, 清除RXNE
然後繼續接收, 等到這幀資料都接收完了
IDLE被置1, 發生IDLE中斷
然後進入中斷服務函式, 執行程式, 清除IDLE

標準庫中用USART_GetITStatus()函式來檢測標誌位是否被置1

在中斷服務函式快要結束要記得清除相應的中斷標誌位, 清除方法參考手冊中都有
對於RXNE: 對USART_DR讀操作或用USART_ClearITPendingBit()函式寫0
對於IDLE: 先讀USART_SR, 然後讀USART_DR (這個比較特殊, 不要被坑了!!!)


SHOUT OUT TO
STM32F系列USART的IDLE中斷要注意了
stm32串列埠中斷接收一幀資料

相關文章