1. 程式人生 > 其它 >【STM32】NVIC巢狀中斷向量控制器與外部中斷

【STM32】NVIC巢狀中斷向量控制器與外部中斷

兩種優先順序

搶佔優先順序PreemptPriority中斷服務函式正在執行時,搶佔優先順序高的可以打斷搶佔優先順序低的,實現中斷的巢狀,相當於51的“高優先順序”

響應優先順序(子優先順序)SubPriority:搶佔優先順序相同的情況下,當兩個中斷同時被觸發時,為避免中斷的阻塞,高響應優先順序的中斷源會被優先觸發,但高響應優先順序不能打斷低相應優先順序,相當於51的“自然優先順序”

特性:數字越小優先順序越高,其中Reset,Hard fault,NMI優先順序為負數且不可變,高於普通的中斷優先順序

優先順序組的配置

簡述:每個可遮蔽中斷都有對應的優先順序暫存器IP,例如F429有91個可遮蔽中斷,對應IP[0]~IP[90],對於M3/4/7的核心,IP有八位,可設定2^8 = 256級優先順序,但ST只用了高四位[7:4],可以實現2^4 = 16級優先順序,由於存在兩類優先順序,因此需要將這四位分給兩個優先順序用於配置優先級別,我們將不同的分分配方式成為優先順序分組(NVIC_PriorityGroup),由暫存器SCB->AIRCR的10~8bit控制

API:HAL_NVIC_SetPriorityGrouping(NVIC_PriorityGroup_n)

以上函數出現在HAL_Init() 中,用於對優先順序分組進行設定,n = 0~4

例如:HAL_NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2)//採用優先順序分組2

優先順序的設定

API:void HAL_NVIC_SetPriority(IRQn_Type IRQn,//中斷號,此處由列舉IRQn_Type對映

uint32_t PreemptPriority,

//搶佔優先順序

uint32_t SubPriority)//響應優先順序(子優先順序)

例如:HAL_NVIC_SetPriority(TIM3_IRQn,1,3);

void HAL_NVIC_EnableIRQ(IRQn_Tpye IRQn) //中斷使能,同樣由Disable,不贅述

例如:HAL_NVIC_EnableIRQ(TIM3_IRQn);