一、MCU中斷程序執(zhí)行過(guò)程
以MCU裸機(jī)程序框架為例,MCU 的主函數(shù)是個(gè)死循環(huán):
主函數(shù):
main(void)
{
While(1)
{
//主程序
}
}
如果沒(méi)有中斷或異常產(chǎn)生會(huì)一直在while(1)里執(zhí)行主程序代碼。當(dāng)中斷產(chǎn)生后,當(dāng)前執(zhí)行的任務(wù)會(huì)被打斷,程序跳轉(zhuǎn)到中斷處理函數(shù)執(zhí)行,執(zhí)行完會(huì)返回之前的主程序斷點(diǎn)處繼續(xù)執(zhí)行。
中斷處理函數(shù):
void IRQ_handler(void)
{
//中斷處理程序
//清除中斷標(biāo)志,否則會(huì)不停的進(jìn)入中斷處理程序。
}
在中斷處理函數(shù)中不要做復(fù)雜費(fèi)時(shí)的事情,中斷內(nèi)做的事情盡可能少。
二、中斷使用實(shí)例
STM32的IO都可以配置成外部中斷,但不是同時(shí)都可以配成外部中斷。需要遵循如下規(guī)則:
比如PA0設(shè)置成外部中斷,PB0,PC0,PD0就不能配成外部中斷。
比如PA1設(shè)置成外部中斷,PB1,PC1,PD1就不能配成外部中斷。
STM32的EXTI0-15中斷線分配給IO使用。PA0的中斷只能使用EXTI0的中斷請(qǐng)求;PA1中斷只能使用EXTI1的中斷請(qǐng)求。
每個(gè)外部中斷線可以獨(dú)立的配置觸發(fā)方式,包含上升沿,下降沿或者雙邊沿觸發(fā)。每個(gè)中斷可單獨(dú)使能/屏蔽。
STM32的中斷允許嵌套,搶占優(yōu)先級(jí)高的可以打斷搶占優(yōu)先級(jí)低的中斷執(zhí)行。搶占優(yōu)先級(jí)相同時(shí),不能嵌套,不同響應(yīng)優(yōu)先級(jí)中斷同時(shí)發(fā)生,優(yōu)先級(jí)高的先執(zhí)行。在程序設(shè)計(jì)時(shí)要根據(jù)具體情況分配好搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)。
STM32的優(yōu)先級(jí)分搶占和響應(yīng)兩種,具體選擇哪種分組組合可以通過(guò)如下函數(shù)配置:
NVIC_PriorityGroupConfig()
優(yōu)先級(jí)分組組合有5種:
第0組:所有4bit用于指定響應(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í)。
以STM32為例,使用IO端口PB2的外部中斷功能需要做如下初始化配置:
1 使能PB2的端口clock及復(fù)用功能clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
2 中斷優(yōu)先級(jí)初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//選擇中斷分組1
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQChannel; //選擇中斷通道2
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //搶占中斷優(yōu)先級(jí)設(shè)置為1
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //響應(yīng)中斷優(yōu)先級(jí)設(shè)置為2
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中斷
3 IO初始化
PIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //選擇引腳PB2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //輸出頻率最大50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;; //輸入
GPIO_Init(GPIOB,&GPIO_InitStructure);
4 把PB2設(shè)置為外部中斷模式
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line = EXTI_Line2; //選擇中斷線路2
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //設(shè)置為中斷請(qǐng)求 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //觸發(fā)方式為上下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd=ENABLE; //外部中斷使能
EXTI_Init(&EXTI_InitStructure);
5 中斷處理函數(shù)
void EXTI2_IRQHandler(void)
{
//處理程序
//清空中斷標(biāo)志位,防止連續(xù)進(jìn)入中斷
EXTI_ClearITPendingBit(EXTI_Line2);
}
-
STM32
+關(guān)注
關(guān)注
2264文章
10854瀏覽量
354224 -
外部中斷
+關(guān)注
關(guān)注
1文章
131瀏覽量
15768 -
裸機(jī)
+關(guān)注
關(guān)注
0文章
39瀏覽量
6329 -
MCU芯片
+關(guān)注
關(guān)注
3文章
246瀏覽量
11348
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論