STM32F4學(xué)習(xí)筆記4——外部中斷
EXTI每個(gè)中斷/事件都有獨(dú)立的觸發(fā)和屏蔽,每個(gè)中斷線專用的狀態(tài)位,支寬度持多達(dá)23個(gè)軟件的中斷/事件請(qǐng)求,在檢測(cè)脈沖寬度低于APB2時(shí)鐘寬度的外部信號(hào)參見(jiàn)數(shù)據(jù)手冊(cè)中的電氣特性部分。
STM32F4xx可以處理外部或內(nèi)部事件來(lái)喚醒內(nèi)核(WFE),喚醒事件可以在外設(shè)的控制寄存器使能一個(gè)中斷,但不在NVIC中使能,同時(shí)在M4的FPU系統(tǒng)控制寄存器中使能SEVONPEND位,當(dāng)CPU從內(nèi)核WFE中恢復(fù)后,取藥清楚相應(yīng)外設(shè)的中斷刮起位和外設(shè)NVIC中斷通道掛起位;或者配置一個(gè)外部或內(nèi)部EXTI線為事件模式,當(dāng)CPU從WFE恢復(fù)后,因?yàn)閷?duì)應(yīng)時(shí)間的掛起為沒(méi)有被置位,不必清除相應(yīng)外設(shè)的中斷掛起位或NVIC中斷通道掛起位。
要產(chǎn)生中斷必須先配置好并使能中斷線,根據(jù)需要的邊沿檢測(cè)設(shè)置兩個(gè)觸發(fā)寄存器,同時(shí)在中斷屏蔽寄存器相應(yīng)位寫”1”允許中斷請(qǐng)求。當(dāng)外部中斷線發(fā)生了期待的邊沿時(shí),將產(chǎn)生一個(gè)中斷請(qǐng)求,對(duì)應(yīng)掛起為被置”1”,在掛起寄存器對(duì)應(yīng)位寫1將清除該中斷。如果需要產(chǎn)生事件,必須先配置好病史能事件線。根據(jù)需要的邊沿檢測(cè)通過(guò)設(shè)置兩個(gè)觸發(fā)寄存器,同時(shí)在事件屏蔽寄存器的相應(yīng)位寫1允許事件請(qǐng)求,當(dāng)事件線上發(fā)生了需要的邊沿時(shí),將產(chǎn)生一個(gè)事件請(qǐng)求脈沖,對(duì)應(yīng)掛起為不被置1。通過(guò)在軟件中斷/事件寄存器寫1,也可以通過(guò)軟件產(chǎn)生中斷/事件請(qǐng)求。
硬件中斷選擇配置
·配置 23 個(gè)中斷線的屏蔽位(EXTI_IMR)
·配置所選中斷線的觸發(fā)選擇位(EXTI_RTSR 和 EXTI_FTSR)
·配置對(duì)應(yīng)到外部中斷控制器(EXTI)的 NVIC 中斷通道的使能和屏蔽位,使得 23 個(gè)中斷線中的請(qǐng)求可以被正確地響應(yīng)。
硬件事件選擇配置
·配置 23 個(gè)事件線的屏蔽位(EXTI_EMR)
·配置事件線的觸發(fā)選擇位(EXTI_RTSR 和 EXTI_FTSR)
軟件中斷/事件選擇配置
·配置 23 個(gè)中斷/事件線屏蔽位(EXTI_IMR, EXTI_EMR)
·設(shè)置軟件中斷寄存器的請(qǐng)求位(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庫(kù)
·通過(guò)函數(shù) GPIO_Init()配置相應(yīng) I/O 是輸入模式
·通過(guò)函數(shù) SYSCFG_EXTILineConfig()將 I/O 復(fù)用到中斷線
·通過(guò)函數(shù) EXTI_Init()選擇中斷模式(interrupt, event)和觸發(fā)方式(Rising, falling or both)
·通過(guò)函數(shù) NVIC_Init(),將中斷線映射到相應(yīng)的 NVIC 中斷通道。
void EXTI_DeInit(void)初始化EXTI寄存器到默認(rèn)的復(fù)位值
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
通過(guò)上面的函數(shù)可以發(fā)現(xiàn),外部中斷 5-9 是在一個(gè)中斷服務(wù)服務(wù)程序,還有 10-15 也是這樣。我們就需要利用if條件語(yǔ)句在中斷五福程序中加以區(qū)分。
void EXTI_StructInit(EXTI_InitTypeDef*EXTI_InitStruct)用于EXTI結(jié)構(gòu)成員初始化
void EXTI_GenerateSWInterrupt(unit32_t EXTI_Line)實(shí)現(xiàn)軟件方式的中斷觸發(fā)
FlagStatus EXTI_GetFlagStatus(unit32_t EXTI_Line)查詢外部中斷標(biāo)志,判斷中斷是否發(fā)生
ITStatus EXTI_GetITStatus(unit32_t EXTI_Line)同上查詢外部中斷標(biāo)志,判斷中斷是否發(fā)生
void EXTI_ClearFlag(unit32_t EXTI_Line)清除中斷標(biāo)志,不清除會(huì)一直進(jìn)入中斷
void EXTI_ClearITPendingBit(unit32_t EXTI_Line同上)清除中斷標(biāo)志,不清除會(huì)一直進(jìn)入中斷