跟著戰艦V3 資料盤里學習,關于中斷的練習,就是用中斷控制按鍵點燈,很簡單的程序,且有例程,可是我的還是出了些問題:
外部中斷和IO的對應關系設置:“STM32F103 的 EXTI 控制器支持 19 個外部中斷/事件請求:
STM32F103 的19 個外部中斷為:
線 0~15:對應外部 IO口的輸入中斷。
線 16:連接到 PVD輸出。
線 17:連接到 RTC 鬧鐘事件。
線 18:連接到 USB 喚醒事件。
外部 IO 口的中斷,需要一個寄存器配置,也就是 IO 復用里的外部中斷配置寄存器 EXTICR。這是因為 STM32 任何一個 IO 口都可以配置成中斷輸入口,但是 IO 口的數目遠大于中斷線數(16 個)。于是 STM32 就這樣設計,GPIOA~GPIOG 的[15:0]分別對應中斷線 15~0。這樣每個中斷線對應了最多 7 個 IO 口,以線 0為例:它對應了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而中斷線每次只能連接到1個IO口上,這樣就需要EXTICR來決定對應的中斷線配置到哪個GPIO上了。” 我的理解:斷口幾就只能對應線幾,比如GPIOC4就只能對應中斷線4,同時也就只能使用中斷4的中斷函數。“STM32F1的外部中斷0~4都有單獨的中斷服務函數,但是從5開始,他們就沒有單獨的服務函數了,而是多個中斷共用一個服務函數,比如外部中斷 5~9 的中斷服務函數為:void EXTI9_5_IRQHandler(void),類似的,void EXTI15_10_IRQHandler(void)就是外部中斷 10~15 的中斷服務函數。”?
主要程序如下:
//外部中斷4服務程序
void EXTI4_IRQHandler(void)
{
delay_ms(10); //消抖
if(KEY1==0) //WK_UP按鍵
{
LED9=!LED9;
}
EXTI->PR=1<<4; //清除LINE4上的中斷標志位
}
//外部中斷0服務程序
void EXTI0_IRQHandler(void)
{
delay_ms(10); //消抖
if(KEY2==0) //按鍵KEY2
{
LED10=!LED10;
}
EXTI->PR=1<<0; //清除LINE0上的中斷標志位
}
//外部中斷2服務程序
void EXTI2_IRQHandler(void)
{
delay_ms(10); //消抖
if(KEY3==0) //按鍵KEY1
{
? LED11=!LED11;
}
EXTI->PR=1<<2; //清除LINE2上的中斷標志位
}
//外部中斷8服務程序
void EXTI9_5_IRQHandler(void)
{
delay_ms(10); //消抖
if(KEY4==0) //按鍵KEY0
{
LED12=!LED12;
}
EXTI->PR=1<<8; //清除LINE8上的中斷標志位? ?這步千萬別忘了
}
//外部中斷初始化程序
//初始化PC4/PB0/PB2/PE8為中斷輸入.
void EXTIX_Init(void)
{
KEY_Init();
Ex_NVIC_Config(GPIO_C,4,FTIR); //上升沿觸發
Ex_NVIC_Config(GPIO_B,0,FTIR); //下降沿觸發
Ex_NVIC_Config(GPIO_B,2,FTIR); //下降沿觸發
Ex_NVIC_Config(GPIO_E,8,FTIR); //下降沿觸發
MY_NVIC_Init(2,3,EXTI4_IRQn,2); //搶占2,子優先級3,組2
MY_NVIC_Init(2,2,EXTI0_IRQn,2); //搶占2,子優先級2,組2
MY_NVIC_Init(2,1,EXTI2_IRQn,2); //搶占2,子優先級1,組2
MY_NVIC_Init(2,0,EXTI9_5_IRQn,2); //搶占2,子優先級0,組2
}
?
?
?
?