對stm32中斷的理解
阿新 • • 發佈:2020-07-23
最開始在串列埠通訊那裡第一次看到關於中斷的描述,但是一直以來都沒搞清楚中斷是怎麼觸發的,中斷標誌位也不太理解。今天學外部中斷的時候好像弄明白了一點點,記錄一下。
上圖是正點原子家的按鍵部分的電路圖,這個外部中斷實驗的內容是通過按鍵產生輸入中斷控制LED燈。 可以看到KEY2連線引腳PE2,於是將中斷線EXTI2連線到PE2,下面是部分初始化程式碼:
KEY_Init(); // 按鍵埠初始化 ...... GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2); EXTI_InitStructure.EXTI_Line=EXTI_Line2; //KEY2 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);
//按鍵初始化KEY_Init()部分程式碼
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設定成上拉輸入
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
從電路圖知道,KEY2按下時使引腳接地電位為0,於是初始化時按鍵將PE2上拉,在KEY2未按下時,PE2置高電位,按下時置低電位。同時,在配置中斷時,將觸發方式設定為沿下降沿觸發,於是一旦按下KEY2則會引起中斷,進入EXTI2_IRQHandler():
void EXTI2_IRQHandler(void)
{
delay_ms(10);//消抖
if(KEY2==0) //按鍵KEY2
{
LED0=!LED0;
}
EXTI_ClearITPendingBit(EXTI_Line2); //清除LINE2上的中斷標誌位
}
中斷函式裡KEY2是巨集定義的引腳PE2的電位檢測,進入中斷後,檢測電位為低電位則說明按下了KEY2,LED變化,然後清除標誌位,否則會一直中斷。
而在串列埠中斷裡面,一旦接收到資料就會發生中斷,同時收到資料就會清除標識位(好像是這樣,我忘記那個問答是哪個平臺看到的了),所以沒有清除標誌位串列埠也正常工作。通用定時器中斷則是在計數器向上\向下溢位時,計數器初始化的時候產生中斷,但是這個就需要手動清除標誌位了。
最後我想電位下降了不是又要回到高電位嗎,所以我也嘗試把沿下降沿設定為沿上升沿觸發,發現按鍵有的時候有用,大多數時候沒用,後來意識到,沿著上升沿觸發之後引腳電位應該判斷是不是高電位,所以中斷函式裡面需要判斷的是KEY2==1,這樣就正常了。