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