1. 程式人生 > >STM32F4學習筆記4——外部中斷

STM32F4學習筆記4——外部中斷

EXTI每個中斷/事件都有獨立的觸發和遮蔽,每個中斷線專用的狀態位,支寬度持多達23個軟體的中斷/事件請求,在檢測脈衝寬度低於APB2時鐘寬度的外部訊號參見資料手冊中的電氣特性部分。

STM32F4xx可以處理外部或內部事件來喚醒核心(WFE),喚醒事件可以在外設的控制暫存器使能一箇中斷,但不在NVIC中使能,同時在M4的FPU系統控制暫存器中使能SEVONPEND位,當CPU從核心WFE中恢復後,取藥清楚相應外設的中斷颳起位和外設NVIC中斷通道掛起位;或者配置一個外部或內部EXTI線為事件模式,當CPU從WFE恢復後,因為對應時間的掛起為沒有被置位,不必清除相應外設的中斷掛起位或NVIC中斷通道掛起位。

要產生中斷必須先配置好並使能中斷線,根據需要的邊沿檢測設定兩個觸發暫存器,同時在中斷遮蔽暫存器相應位寫”1”允許中斷請求。當外部中斷線發生了期待的邊沿時,將產生一箇中斷請求,對應掛起為被置”1”,在掛起暫存器對應位寫1將清除該中斷。如果需要產生事件,必須先配置好病史能事件線。根據需要的邊沿檢測通過設定兩個觸發暫存器,同時在事件遮蔽暫存器的相應位寫1允許事件請求,當事件線上發生了需要的邊沿時,將產生一個事件請求脈衝,對應掛起為不被置1。通過在軟體中斷/事件暫存器寫1,也可以通過軟體產生中斷/事件請求。
硬體中斷選擇配置
·配置 23 箇中斷線的遮蔽位(EXTI_IMR)
·配置所選中斷線的觸發選擇位(EXTI_RTSR 和 EXTI_FTSR)
·配置對應到外部中斷控制器(EXTI)的 NVIC 中斷通道的使能和遮蔽位,使得 23 箇中斷線中的請求可以被正確地響應。
硬體事件選擇配置
·配置 23 個事件線的遮蔽位(EXTI_EMR)
·配置事件線的觸發選擇位(EXTI_RTSR 和 EXTI_FTSR)
軟體中斷/事件選擇配置
·配置 23 箇中斷/事件線遮蔽位(EXTI_IMR, EXTI_EMR)
·設定軟體中斷暫存器的請求位(EXTI_SWIER)

外部中斷/事件線路映像
·EXTI 線 0-15 線連線到各埠Pin的 0-15
·EXTI 線 16 連線到 PVD 輸出
·EXTI 線 17 連線到 RTC 鬧鐘事件
·EXTI 線 18 連線到 USB OTG FS Wakeup 事件
·EXTI 線 19 連線到 Ethernet Wakeup 事件
·EXTI 線 20 連線到 USB OTG HS (configured in FS) Wakeup 事件
·EXTI 線 21 連線到 RTC Tamper and TimeStamp 事件
·EXTI 線 22 連線到 RTC Wakeup 事件

STM32F4的EXTI庫
·通過函式 GPIO_Init()配置相應 I/O 是輸入模式
·通過函式 SYSCFG_EXTILineConfig()將 I/O 複用到中斷線
·通過函式 EXTI_Init()選擇中斷模式(interrupt, event)和觸發方式(Rising, falling or both)
·通過函式 NVIC_Init(),將中斷線對映到相應的 NVIC 中斷通道。

void EXTI_DeInit(void)初始化EXTI暫存器到預設的復位值
void EXTI_Init(EXTI_InitTypeDef*EXXTI_InitStruct)初始化配置EXTI
/* Configure EXTI Line0 */
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
在中斷線的選擇上要注意
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
通過上面的函式可以發現,外部中斷 5-9 是在一箇中斷服務服務程式,還有 10-15 也是這樣。我們就需要利用if條件語句在中斷五福程式中加以區分。
void EXTI_StructInit(EXTI_InitTypeDef*EXTI_InitStruct)用於EXTI結構成員初始化
void EXTI_GenerateSWInterrupt(unit32_t EXTI_Line)實現軟體方式的中斷觸發
FlagStatus EXTI_GetFlagStatus(unit32_t EXTI_Line)查詢外部中斷標誌,判斷中斷是否發生
ITStatus EXTI_GetITStatus(unit32_t EXTI_Line)同上查詢外部中斷標誌,判斷中斷是否發生
void EXTI_ClearFlag(unit32_t EXTI_Line)清除中斷標誌,不清除會一直進入中斷
void EXTI_ClearITPendingBit(unit32_t EXTI_Line同上)清除中斷標誌,不清除會一直進入中斷