stm32中断优先级快速入门
1.基本概念
STM32(Cortex-M3架構)中有兩個優先級的概念——搶占式優先級和響應優先級.有人把響應優先級稱作'亞優先級'或'副優先級',每個中斷源都需要被指定這兩種優先級。?
具有高搶占式優先級的中斷可以在具有低搶占式優先級的中斷處理過程中被響應,即中斷嵌套。
當兩個中斷源的搶占式優先級相同時,這兩個中斷將沒有嵌套關系,當一個中斷到來后,如果正在處理另一個中斷,這個后到來的中斷就要等到前一個中斷處理完之后才能被處理。如果這兩個中斷同時到達,則中斷控制器根據他們的響應優先級高低來決定先處理哪一個;如果他們的搶占式優先級和響應優先級都相等,則根據他們在中斷表中的排位順序決定先處理哪一個。
2.優先級分組?
既然每個中斷源都需要被指定這兩種優先級,就需要有相應的寄存器位記錄每個中斷的優先級;STM32用4個比特來指定這兩種優先級。但是怎么分配,取決于組的選擇。
第0組:所有4位用于指定響應優先級?
第1組:最高1位用于指定搶占式優先級,最低3位用于指定響應優先級?
第2組:最高2位用于指定搶占式優先級,最低2位用于指定響應優先級?
第3組:最高3位用于指定搶占式優先級,最低1位用于指定響應優先級?
第4組:所有4位用于指定搶占式優先級 ?
3.中斷源的優先級配置
假設已經分組了,比如第三組,那么搶占優先級就是(000-111,8個級別,000最高,111最低),響應優先級就是(0-1,2個級別)。
對于每個中斷源,都應該配置為以上級別中的一個(8選一加上2選一)
4.代碼舉例
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
這個是選擇分組的函數,函數的參數是定義好的宏:
#define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority4 bits for subpriority */ #define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*!< 1 bits for pre-emption priority3 bits for subpriority */ #define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*!< 2 bits for pre-emption priority2 bits for subpriority */ #define NVIC_PriorityGroup_3 ((uint32_t)0x400) /*!< 3 bits for pre-emption priority1 bits for subpriority */ #define NVIC_PriorityGroup_4 ((uint32_t)0x300) /*!< 4 bits for pre-emption priority0 bits for subpriority */ 要注意的是 ,在系統復位初始化之后,默認使用的是第0組優先級分組,也就是說,中斷不可嵌套(復位,NMI 和硬 fault除外,他們可以搶占其他中斷)
<span style="font-size:18px;">void AMIC_NVIC_Initial(void) {NVIC_InitTypeDef NVIC_InitStructure;/* Enable and set GDO1 EXTI Interrupt to the lowest priority */NVIC_InitStructure.NVIC_IRQChannel = AMIC_GIO1_EXTI_IRQn;<span style="color:#ff6666;">NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;</span>NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); } </span> 以上兩行用于指定搶占優先級和響應優先級。
本文只是粗略的介紹了stm32中的中斷優先級配置,很多問題并沒有深入。歡迎博友補充和深挖。
總結
以上是生活随笔為你收集整理的stm32中断优先级快速入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 势在人为:人才吸引力报告2020
- 下一篇: 面试官问我如何做产品分析