背景
- STM32中每個(gè)中斷都可以獨(dú)立設(shè)置搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)
- 優(yōu)先設(shè)置的級(jí)數(shù)值越小扛芽,優(yōu)先級(jí)越高
- 中斷優(yōu)先級(jí)控制的寄存器組,在mdk中的定義是bit IP[240]畜疾,而F103有60個(gè)中斷我注,這意味著每個(gè)中斷只能使用4bit來表示自己的搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)
- 靈活考慮,可以通過軟件配置來設(shè)定4bit中肚医,幾個(gè)bit表示搶占優(yōu)先級(jí)绢馍,幾個(gè)bit表示響應(yīng)優(yōu)先級(jí)。
中斷分組
中斷分組肠套,按我的理解就是中斷寄存器控制位的分配方式舰涌,一共有0~4,五種:
- 組0你稚,0位用于搶占優(yōu)先級(jí)瓷耙,4位用于響應(yīng)優(yōu)先級(jí)
- 組1,1位用于搶占優(yōu)先級(jí)刁赖,3位用于響應(yīng)優(yōu)先級(jí)
- 組2搁痛,2位用于搶占優(yōu)先級(jí),2位用于響應(yīng)優(yōu)先級(jí)
- 組3宇弛,3位用于搶占優(yōu)先級(jí)鸡典,1位用于響應(yīng)優(yōu)先級(jí)
- 組4,4位用于搶占優(yōu)先級(jí)枪芒,0位用于響應(yīng)優(yōu)先級(jí)
何為搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)
搶占彻况,是指打斷其他中斷的屬性,即因?yàn)榫哂羞@個(gè)屬性會(huì)出現(xiàn)嵌套中斷(在執(zhí)行中斷
服務(wù)函數(shù)A的過程中被搶占優(yōu)先級(jí)更高的中斷B打斷舅踪,執(zhí)行完中斷服務(wù)函數(shù)B 再繼續(xù)執(zhí)行中斷服務(wù)函數(shù)A)纽甘,而響應(yīng)屬性則應(yīng)用在搶占屬性相同的情況下,當(dāng)兩個(gè)中斷向量的搶占優(yōu)先級(jí)相同時(shí)抽碌,如果兩個(gè)中斷同時(shí)到達(dá)悍赢, 則先處理響應(yīng)優(yōu)先級(jí)高的中斷。
使用HAL庫函數(shù)來配置中斷分組
調(diào)用void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)即可货徙。
其中PriorityGroup必須是NVIC_PRIORITYGROUP_x左权,x可以是0~4
對(duì)每個(gè)中斷定義其搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)
// 參數(shù)依次是:中斷號(hào),搶占優(yōu)先級(jí)痴颊,響應(yīng)優(yōu)先級(jí)
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority);
// 可以用于使能/失能中斷
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);
void HAL_NVIC_DisableIRQ(IRQn_Type IRQn);