1. 程式人生 > 實用技巧 >對stm32中斷的理解

對stm32中斷的理解

​ 最開始在串列埠通訊那裡第一次看到關於中斷的描述,但是一直以來都沒搞清楚中斷是怎麼觸發的,中斷標誌位也不太理解。今天學外部中斷的時候好像弄明白了一點點,記錄一下。

​ 上圖是正點原子家的按鍵部分的電路圖,這個外部中斷實驗的內容是通過按鍵產生輸入中斷控制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,這樣就正常了。