|
今天我來介紹一下外部中斷。先打開數據手冊我用的時f103這款。不過大體上都差不多。首先介紹什么是外部中斷。所有的GPIO口都要外部中斷功能。如果要使用,必須使用外部中斷線(把GPIO口看做是中斷線),而且必須配置為輸入模式。EXIT控制器有如下特點:每個中斷都有獨立的觸發和屏蔽;中斷線都有對應得狀態位;多達20個中斷請求;檢測的脈沖信號低于APB2時鐘的脈沖寬度。主要分析流程圖。
分析完流程圖就知道編程思路,順騰摸瓜,從引腳開始,
1)配置數輸入,復用為中斷線,既然是復用肯定要開AFIO時鐘,
2)把IO復用為中斷線
3)來到了邊沿選擇寄存器。按鍵選擇上升沿,或者下降沿。
4)開啟EXIT中斷使能
5)開啟NVIC中斷
6)編寫中斷服務函數(3步曲:判斷中斷標志位,清中斷標志位,完成需要的功能)
void My_EXIT_Init()
{
//按鍵初始化
KEY_Init();
//開啟時鐘
RCC->APB2ENR |= (1<<0);
//PA0映射到EXTI0
AFIO->EXTICR[0] &=~(0xf<<(4*0));
//PE2-4映射到EXIT2-4
AFIO->EXTICR[0] &=~(0xf<<(4*2));
AFIO->EXTICR[0] |=(0x4<<(4*2));
AFIO->EXTICR[0] &=~(0xf<<(4*3));
AFIO->EXTICR[0] |=(0x4<<(4*3));
AFIO->EXTICR[1] &=~(0xf<<(4*0));
AFIO->EXTICR[1] |=(0x4<<(4*0));
//邊沿選擇寄存器,根據你需要的配置
EXTI->RTSR |= (1<<0);
EXTI->FTSR |= (1<<2)|(1<<3)|(1<<4);
/開啟EXIT中斷
EXTI->IMR |= ((1<<0)|(1<<2)|(1<<3)|(1<<4));
//開啟中斷
My_NVIC_Init(EXTI0_IRQn,7-3,6,1);
My_NVIC_Init(EXTI2_IRQn,7-3,5,1);
My_NVIC_Init(EXTI3_IRQn,7-3,4,1);
My_NVIC_Init(EXTI4_IRQn,7-3,3,1);
}
//中斷服務函數,注意要在.S文件找該函數名,不然可能寫錯
void EXTI0_IRQHandler()
{
if(EXTI->PR & (1<<0)) //判斷標志位
{
if( K_UP)
delay_ms(100);
LED1_ON;
EXTI->PR |= (1<<0); //清標志位
}
}
定時器中斷,軟件中斷和這個套路差不多。都是一個套路。
|
|