EXTI_SWIER作用:允許我們通過程序控制就可以啟動中斷/事件線
1、產生事件的線路最終的產物是一個脈沖信號,這個脈沖信號可以給其他外設電路使用,比如定時器TIM、模擬數字轉換器ADC等等。
2、產生中斷線路目的是把輸入信號輸入到NVIC,進一步會運行中斷服務函數,實現功能,這樣是軟件級的。而產生事件線路目的就是傳輸一個脈沖信號給其他外設使用,並且是電路級別的信號傳輸,屬於硬件級的。
關於外部中斷寄存器EXTI->SWIER的用途,剛開始我也是雲里霧里,感覺手冊說的不是很清楚。憑借自己對EXTI->SWIER功能的理解,自己寫了驗證程序,做了一個實驗。實驗成功了;實驗平台是野火mini開發板。
實驗原理是:定義兩個中斷線EXTI0(PA0)和EXTI13(PC13)用來管理兩個按鍵KEY0和KEY1,然后編寫中斷服務函數,中斷服務函數的思路是,按下KEY0時,在LCD上顯示“SWIER+KEY0:”;按下KEY1時就將LCD上顯示的“SWIER+KEY0:”清除掉以證明KEY1按鍵已按下,同時也證明了外部中斷線EXTI13已經觸發(主函數會有相關的操作)。下面是兩個中斷服務函數(至於配置和分組函數就不貼出來了):
void EXTI0_IRQHandler(void) //KEY0按鍵
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
LCD_DispStr(20, 80, (uint8_t *)"SWIER+KEY0:", RED); //顯示SWIER+KEY0:
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
void EXTI15_10_IRQHandler(void) //KEY1按鍵
{
if(EXTI_GetITStatus(EXTI_Line13) != RESET)
{
// LCD_DispStr(20, 60, (uint8_t *)"SWIER+KEY1:", RED);
LCD_DispStr(20, 80, (uint8_t *)"SWIER+KEY0:", WHITE); //清除LCD顯示的SWIER+KEY0:
EXTI_ClearITPendingBit(EXTI_Line13);
EXTI->SWIER=0; //清除EXTI->SWIER寄存器相應的位,這種寫法有點不規范,其實是應該將EXTI->SWIER寄存器的bit13清零即復位
}
}
主函數:
int main(void)
{ u8 m=0;
LCD_Init();
LED_GPIO_Config();
delay_init();
uart_init(9600);
EXTI_PC13_Config();
EXTI_PA0_Config();
LCD_Clear(0, 0, 240, 320, WHITE);
EXTI->IMR|=1<<13;//
EXTI->EMR|=1<<13;//
EXTI->SWIER=0;
while( 1 )
{
m++;
LCD_DispNumber(100, 100, m, WHITE); //顯示m的值
delay_ms(500);
if(m==10)
{
EXTI->SWIER|=1<<13; //軟件觸發中斷線13,
m=0;
}
}
主函數其實很簡單,程序運行之后,先按下KEY0按鍵這時會在LCD上顯示“SWIER+KEY0”;同時,在LCD上每隔500ms顯示一次m的值,當m等於10的時候程序將 EXTI->SWIER寄存器的bit13位置1,這時就相當於按下KEY1按鍵只不過是由程序執行的而已,這時LCD上顯示的“SWIER+KEY0”會被清除;證明外部中斷線EXTI13已經觸發。