一、MCU中斷程序執(zhí)行過程
以MCU裸機程序框架為例,MCU 的主函數是個死循環(huán):
主函數:
main(void)
{
While(1)
{
//主程序
}
}
如果沒有中斷或異常產生會一直在while(1)里執(zhí)行主程序代碼。當中斷產生后,當前執(zhí)行的任務會被打斷,程序跳轉到中斷處理函數執(zhí)行,執(zhí)行完會返回之前的主程序斷點處繼續(xù)執(zhí)行。
中斷處理函數:
void IRQ_handler(void)
{
//中斷處理程序
//清除中斷標志,否則會不停的進入中斷處理程序。
}
在中斷處理函數中不要做復雜費時的事情,中斷內做的事情盡可能少。
二、中斷使用實例
STM32的IO都可以配置成外部中斷,但不是同時都可以配成外部中斷。需要遵循如下規(guī)則:
比如PA0設置成外部中斷,PB0,PC0,PD0就不能配成外部中斷。
比如PA1設置成外部中斷,PB1,PC1,PD1就不能配成外部中斷。
STM32的EXTI0-15中斷線分配給IO使用。PA0的中斷只能使用EXTI0的中斷請求;PA1中斷只能使用EXTI1的中斷請求。
每個外部中斷線可以獨立的配置觸發(fā)方式,包含上升沿,下降沿或者雙邊沿觸發(fā)。每個中斷可單獨使能/屏蔽。
STM32的中斷允許嵌套,搶占優(yōu)先級高的可以打斷搶占優(yōu)先級低的中斷執(zhí)行。搶占優(yōu)先級相同時,不能嵌套,不同響應優(yōu)先級中斷同時發(fā)生,優(yōu)先級高的先執(zhí)行。在程序設計時要根據具體情況分配好搶占優(yōu)先級和響應優(yōu)先級。
STM32的優(yōu)先級分搶占和響應兩種,具體選擇哪種分組組合可以通過如下函數配置:
NVIC_PriorityGroupConfig()
優(yōu)先級分組組合有5種:
第0組:所有4bit用于指定響應優(yōu)先級;
第1組:最高1位用于指定搶占式優(yōu)先級,后面3位用于指定響應優(yōu)先級;
第2組:最高2位用于指定搶占式優(yōu)先級,后面2位用于指定響應優(yōu)先級;
第3組:最高3位用于指定搶占式優(yōu)先級,后面1位用于指定響應優(yōu)先級;
第4組:所有4位用于指定搶占式優(yōu)先級。
以STM32為例,使用IO端口PB2的外部中斷功能需要做如下初始化配置:
1 使能PB2的端口clock及復用功能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)先級設置為1
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //響應中斷優(yōu)先級設置為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設置為外部中斷模式
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line = EXTI_Line2; //選擇中斷線路2
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //設置為中斷請求 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //觸發(fā)方式為上下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd=ENABLE; //外部中斷使能
EXTI_Init(&EXTI_InitStructure);
5 中斷處理函數
void EXTI2_IRQHandler(void)
{
//處理程序
//清空中斷標志位,防止連續(xù)進入中斷
EXTI_ClearITPendingBit(EXTI_Line2);
}
-
STM32
+關注
關注
2293文章
11031瀏覽量
364435 -
外部中斷
+關注
關注
1文章
133瀏覽量
16189 -
裸機
+關注
關注
0文章
40瀏覽量
6691 -
MCU芯片
+關注
關注
3文章
256瀏覽量
12091
發(fā)布評論請先 登錄
STM32 GPIO的外部中斷設計

STM32f10x 外部中斷及中斷分組

評論