|
關(guān)于外部中斷寄存器EXTI->SWIER的用途,剛開(kāi)始我也是云里霧里,感覺(jué)手冊(cè)說(shuō)的不是很清楚。憑借自己對(duì)EXTI->SWIER功能的理解,自己寫(xiě)了驗(yàn)證程序,做了一個(gè)實(shí)驗(yàn)。實(shí)驗(yàn)成功了;實(shí)驗(yàn)平臺(tái)是野火mini開(kāi)發(fā)板。
實(shí)驗(yàn)原理是:定義兩個(gè)中斷線EXTI0(PA0)和EXTI13(PC13)用來(lái)管理兩個(gè)按鍵KEY0和KEY1,然后編寫(xiě)中斷服務(wù)函數(shù),中斷服務(wù)函數(shù)的思路是,按下KEY0時(shí),在LCD上顯示“SWIER+KEY0:”;按下KEY1時(shí)就將LCD上顯示的“SWIER+KEY0:”清除掉以證明KEY1按鍵已按下,同時(shí)也證明了外部中斷線EXTI13已經(jīng)觸發(fā)(主函數(shù)會(huì)有相關(guān)的操作)。下面是兩個(gè)中斷服務(wù)函數(shù)(至于配置和分組函數(shù)就不貼出來(lái)了):
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寄存器相應(yīng)的位,這種寫(xiě)法有點(diǎn)不規(guī)范,其實(shí)是應(yīng)該將EXTI->SWIER寄存器的bit13清零即復(fù)位
}
}
主函數(shù):
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; //軟件觸發(fā)中斷線13,
m=0;
}
}
主函數(shù)其實(shí)很簡(jiǎn)單,程序運(yùn)行之后,先按下KEY0按鍵這時(shí)會(huì)在LCD上顯示“SWIER+KEY0”;同時(shí),在LCD上每隔500ms顯示一次m的值,當(dāng)m等于10的時(shí)候程序?qū)?EXTI->SWIER寄存器的bit13位置1,這時(shí)就相當(dāng)于按下KEY1按鍵只不過(guò)是由程序執(zhí)行的而已,這時(shí)LCD上顯示的“SWIER+KEY0”會(huì)被清除;證明外部中斷線EXTI13已經(jīng)觸發(fā)。
|
|