外部中斷配置過程

①初始化GPIO;
②初始化NVIC;;
③初始化EXTI
④編寫中斷服務函數。

①初始化GPIO

  1. 開啓所有外部中斷源管腳對應的GPIO時鐘和AFIO時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx|RCC_APB2Periph_AFIO, ENABLE)
  1. 定義GPIO初始化結構變量,
GPIO_InitTypeDef GPIO_InitStructure;
  1. 賦值結構變量各成員
GPIO_InitStructure.GPIO_Pin=管腳號0~15 ; .mode= GPIO_Mode_IN_FLOATING(浮空輸入);
  1. 調用GPIO初始化函數:GPIO_Init(& GPIO_InitStructure);
  2. 如果有多箇中斷源,重複步驟3~4。

②初始化NVIC;

  1. 設置優先級分組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_n);
  1. 定義NVIC初始化結構變量,並賦值結構變量各成員
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel =中斷號;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =搶佔優先級;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =子優先級;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  1. 調用NVIC初始化函數。
NVIC_Init(&NVIC_InitStructure);
  1. 如果有多箇中斷源,重複步驟2~3

③初始化EXTI

  1. 定義EXTI初始化結構變量 EXTI_InitTypeDef EXTI_InitStructure;
  2. 選擇EXTI的信號源,設置外部中斷配置寄存器AFIO_EXTICR相關位
GPIO_EXTILineConfig()
  1. 賦值結構變量各成員
EXTI_InitStructure.EXTI_Line =信號源
EXTI_InitStructure.EXTI_Mode =中斷模式
EXTI_InitStructure.EXTI_Trigger =觸發方式
  1. 調用EXTI初始化函數
EXTI_Init(&EXTI_InitStructure);

如果有多個外部中斷源,重複步驟2~4.

④編寫中斷服務函數。

• 在啓動文件startup_stm32f10x_hd.s 中我們預先爲每個中斷都寫了一箇中斷服務函數,只是這些中斷函數都是爲空,爲的只是初始化中斷向量表。實際的中斷服務函數都需要我們重新編寫,爲了方便管理,可以把中斷服務函數統一寫在stm32f10x_it.c 這個庫文件中。
• 關於中斷服務函數的函數名必須跟啓動文件裏面預先設置的一樣,如果寫錯,系統就在中斷向量表中找不到中斷服務函數的入口,直接跳轉到啓動文件裏面預先寫好的空函數,並且在裏面無限循環,實現不了中斷。
• 對每個中斷號編寫中斷服務函數,對於EXTI9-5 和EXTI15-10,多箇中斷源公用同一個中斷號時,可以在中斷服務函數中判斷具體是哪一個中斷源被觸發,然後根據中斷源編制相應的響應程序。
void EXTIx_IRQHandler(void); void EXTI9_5_IRQHandler(void)
• 重要提醒,中斷服務函數中,爲確保確實產生了中斷請求,通常需要檢查一下狀態標識位確認確實產生了該中斷。同時,爲避免一次中斷請求執行多次中斷服務程序,中斷服務程序最後需要清除該中斷標識位。例如:

if(EXTI_GetITStatus(KEY3_INT_EXTI_LINE) != RESET) //確保是否產生了EXTI Line中斷
{EXTI_ClearITPendingBit(KEY3_INT_EXTI_LINE); //清除中斷標誌位
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章