《概念問題:中斷與事件有什麼聯絡與區別?》
《***stm32之中斷與事件—中斷與事件的區別》
簡單概括下。
中斷:cpu單執行緒情況下只能處理單一任務,在有零時任務需要處理時,可以暫時放下當前任務,優先處理零時任務,再回過來處理之前的任務。多個中斷可以進行巢狀,比如產生了多個零時任務,那麼就可以按照優先順序處理這多個零時任務,再回過來處理當前任務。
事件:字面意思,就是發生的事情,發生的事件會產生相應的訊號給不同的服務,訊號給中斷服務就產生中斷,給dma就使用dma通道,就是說事件可以去觸發不同的任務。靈活的使用事件可以提高效率。
nvic全程nested vectoredinterrupt controller,用於控制中斷的優先順序。具體如下,
優先順序分組是用於分配搶占優先順序和子優先順序的個數,根據自己的需要選擇合適的優先順序分組。
中斷的優先順序規則是:先比搶占優先順序,搶占優先順序相同再比子優先順序,如果搶占優先順序和子優先順序都相同。搶占優先順序顧名思義,可以搶占優先執行,它可以打斷低優先順序的中斷,優先執行自己,所以可以巢狀。而響應優先順序不能巢狀,他不能打斷已經執行的中斷,只能在多個搶占優先順序相同情況下,排出順序,等待當前中斷函式執行結束後才能執行。
使用中斷的三步驟:
1.配置中斷向量(配置中斷優先順序)
2.配置中斷
3.編寫中斷函式
//建議所有中斷的優先順序配置只寫成乙個函式,因為這能更好地理清不同中斷之間的優先關係
void
nvic_config()
void
timer3_init()
void
tim3_irqhandler
(void
)}
外部中斷有很多種形式,這裡介紹最簡單的一種情況——按鍵。
void
nvic_config()
void
exit_config()
void
exti4_irqhandler()
exti_clearitpendingbit
(exti_line4)
;}
中斷實驗:
手中有一塊顯示屏,一顆板載led。
需要實現的功能如下:
1.串列埠接收到數字1時進入中斷,在中斷中點亮led兩秒鐘
2.延時由乙個定時器終端完成。
3.每300毫秒重新整理一次顯示屏,顯示屏顯示當前已經進入的中斷型別,它的優先順序最高。
在這裡我需要用到三個中斷,兩個定時器中斷。乙個用於延時,乙個用於定時300ms執行任務。
乙個串列埠接收中斷。按照描述我可以有以下nvic配置
中斷源搶占優先順序
響應優先順序
timer300
timer210
usart1_rx20
實現**:
(部分自定義函式不給出)
void
nvic_config()
//配置中斷向量
void
timer2_init()
//配置定時器2,用於延時
void
timer3_init()
//配置定時器3,用於定時任務
unsigned
char flag=0;
void
tim2_irqhandler
(void)}
unsigned
int u1_rx=0;
void
tim3_irqhandler
(void)}
void
usart1_irqhandler()
}usart_clearitpendingbit
(usart1,usart_it_rxne)
;//事實上在讀取dr的時候這個中斷標誌會自動清掉
usart_clearflag
(usart1,usart_flag_ore)
;//防止出錯
u1_rx=usart1->dr;
//防止出錯
u1_rx=0;
}int
main()
在上面的**中需要注意這幾個點:
1.在這裡的接收中斷中,會在中斷中延時兩秒,如果在這兩秒中收到了多個資料(也不能說全是這兩秒的鍋),會產生溢位錯誤,觸發overrun error detect,此時只要是優先順序較低的中斷和程式的主函式均會停止執行(卡住),對串列埠中斷發生錯誤時可以檢查usart_it_ore標誌位是否置1,可是這裡的溢位錯誤不能觸發ore置1,ore置1需要滿足兩個條件。解決這個卡住的問題,可以通過清掉***a_flag,然後再讀一邊dr暫存器。具體參考這篇文章:《stm32串列埠中斷卡死主迴圈問題分析》
2.關於usart_it_rxne這個標誌位,資料手冊有如下解釋
usart_receivedata();裡包含了對usart_dr的讀操作,任何對usart_dr的讀操作都可以使整個標誌位清零,在中斷中我們使用清除標誌位的函式對其進行二次操作,是為了防止不正常情況下進入中斷時,標誌位也能夠被清除。
STM32F10x系列UART中斷異常除錯經歷
硬體環境 stm32f105rct6 軟體環境 freertosv8 問題描述 採用中斷方式接收資料,然後將收到的一幀資料放入訊息佇列,然後有專門的乙個任務用來從訊息佇列中取資料並處理。jlink除錯以及燒錄執行都是可以的,但是當隨著通訊頻率的增加以及執行時間的加長,系統會出現 宕機 即,不停的進入...
stm32f10x 中斷程式設計框架
1,初始化nvic,用於處理中斷 2,初始化要連線到exti的gpio 3,初始化exti用於產生中斷 事件 4,編寫中斷服務函式 5,main函式 1 設定優先順序分組 misc.h中void nvic prioritygroupconfig uint32 t nvic prioritygroup...
STM32F10X入門 流水燈
2019 3 16 2019 3 19 core cm32.c stdin.h中定義了字元型 stm32f10x.h stm32f10x conf.h中定義了引用的外設標頭檔案 庫檔案之間的依賴呼叫關係 pngstm32f10x.h檢視位址對映 比如define gpioa base apb2per...