stm32f4xx 的EXTI使用的一般步骤
使用 IO 口外部中斷的一般步驟:
1)初始化 IO 口為輸入。
2)開啟 IO 口復(fù)用時鐘,設(shè)置 IO 口與中斷線的映射關(guān)系。
3)初始化線上中斷,設(shè)置觸發(fā)條件等。
4)配置中斷分組(NVIC),并使能中斷。
5)編寫中斷服務(wù)函數(shù)。
?
基礎(chǔ)知識略過,
第一步.配置 GPIO 與中斷線的映射關(guān)系的函數(shù)
1 void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)配置實(shí)例:
1 void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOI, uint8_t EXTI_PinSource8) 將中斷線 8 與 GPIOI 映射起來,那么很顯然是 GPIOI.8 與 EXTI8 中斷線連接了。設(shè)置好中斷線映射之后,那么到底來自這個IO口的中斷時通過什么方式出發(fā)的呢?接下來我們就要設(shè)置該中斷線上中斷的初始化參數(shù)了。
第二步.中斷線上中斷的初始化是通過函數(shù) EXTI_Init()實(shí)現(xiàn)的。EXTI_Init()函數(shù)的定義是:
下面我們用一個使用范例來說明這個函數(shù)的使用:
1 EXTI_InitTypeDef EXTI_InitStructure; 2 EXTI_InitStructure.EXTI_Line=EXTI_Line8; 3 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 4 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; 5 EXTI_InitStructure.EXTI_LineCmd = ENABLE; 6 EXTI_Init(&EXTI_InitStructure); //根據(jù) EXTI_InitStruct 中指定的 7 //參數(shù)初始化外設(shè) EXTI 寄存器 STM32 的外設(shè)的初始化都是通過結(jié)構(gòu)體來設(shè)
置初始值的,這里就不羅嗦結(jié)構(gòu)體初始化的過程了。我們來看看結(jié)構(gòu)體 EXTI_InitTypeDef 的成員變量:
簡單介紹一下:第一個EXTI_Line,中斷線;第二個EXTI_Mode:可選值為中斷 EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event;第三個參數(shù)是觸發(fā)方式,可以是下降沿觸發(fā) EXTI_Trigger_Falling,上升沿觸發(fā) EXTI_Trigger_Rising,或者任意電平(上升沿和下降沿)觸發(fā)EXTI_Trigger_Rising_Falling
我們設(shè)置好中斷線和 GPIO 映射關(guān)系,然后又設(shè)置好了中斷的觸發(fā)模式等初始化參數(shù)。 既然是外部中斷,涉及到中斷我們當(dāng)然還要設(shè)置 NVIC 中斷優(yōu)先級。
?
第三步,配置中斷優(yōu)先級組 和 NVIC 結(jié)構(gòu)體初始化
中斷優(yōu)先級組:
1 void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); 1 /** 2 * @brief Configures the priority grouping: pre-emption priority and subpriority. 3 * @param NVIC_PriorityGroup: specifies the priority grouping bits length. 4 * This parameter can be one of the following values: 5 * @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority 6 * 4 bits for subpriority 7 * @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority 8 * 3 bits for subpriority 9 * @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority 10 * 2 bits for subpriority 11 * @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority 12 * 1 bits for subpriority 13 * @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority 14 * 0 bits for subpriority 15 * @note When the NVIC_PriorityGroup_0 is selected, IRQ pre-emption is no more possible. 16 * The pending IRQ priority will be managed only by the subpriority. 17 * @retval None 18 */ 中斷優(yōu)先級組 函數(shù)說明NVIC結(jié)構(gòu)體:
1 void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) 1 typedef struct 2 { 3 uint8_t NVIC_IRQChannel; /*!< Specifies the IRQ channel to be enabled or disabled. 4 This parameter can be an enumerator of @ref IRQn_Type 5 enumeration (For the complete STM32 Devices IRQ Channels 6 list, please refer to stm32f4xx.h file) */ 7 8 uint8_t NVIC_IRQChannelPreemptionPriority; /*!< Specifies the pre-emption priority for the IRQ channel 9 specified in NVIC_IRQChannel. This parameter can be a value 10 between 0 and 15 as described in the table @ref MISC_NVIC_Priority_Table 11 A lower priority value indicates a higher priority */ 12 13 uint8_t NVIC_IRQChannelSubPriority; /*!< Specifies the subpriority level for the IRQ channel specified 14 in NVIC_IRQChannel. This parameter can be a value 15 between 0 and 15 as described in the table @ref MISC_NVIC_Priority_Table 16 A lower priority value indicates a higher priority */ 17 18 FunctionalState NVIC_IRQChannelCmd; /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel 19 will be enabled or disabled. 20 This parameter can be set either to ENABLE or DISABLE */ 21 } NVIC_InitTypeDef; NVIC結(jié)構(gòu)體及其說明再來個配置實(shí)例:
1 NVIC_InitTypeDef NVIC_InitStructure; 2 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 3 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; 4 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 5 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 6 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 7 NVIC_Init(&NVIC_InitStructure); NVIC配置實(shí)例
第四步.中斷服務(wù)ISR 我們配置完中斷優(yōu)先級之后,接著我們要做的就是編寫中斷服務(wù)函數(shù)。中斷服務(wù)函數(shù)的名
字是在 MDK 中事先有定義的。這里需要說明一下,STM32 的 IO 口外部中斷函數(shù)只有 6 個,
分別為:
中斷線 0-4 每個中斷線對應(yīng)一個中斷函數(shù),中斷線 5-9 共用中斷函數(shù) EXTI9_5_IRQHandler,中斷線 10-15 共用中斷函數(shù) EXTI15_10_IRQHandler。 在編寫中斷服務(wù)函數(shù)的時候會經(jīng)常使用到兩個函數(shù),第一個函數(shù)是判斷某個中斷線上的中斷是否發(fā)生(標(biāo)志位是否置位) :
1 ITStatus EXTI_GetITStatus ( uint32_t EXTI_Line )這個函數(shù)一般使用在中斷服務(wù)函數(shù)的開頭判斷中斷是否發(fā)生。另一個函數(shù)是清除某個中斷線上的中斷標(biāo)志位:
1 void EXTI_ClearITPendingBit ( uint32_t EXTI_Line )這個函數(shù)一般應(yīng)用在中斷服務(wù)函數(shù)結(jié)束之前,清除中斷標(biāo)志位。常用的中斷服務(wù)函數(shù)格式為:
void EXTI2_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line8)!=RESET)//判斷某個線上的中斷是否發(fā)生 { 中斷邏輯… EXTI_ClearITPendingBit(EXTI_Line8); //清除 LINE 上的中斷標(biāo)志位 } }在這里需要說明一下,固件庫還提供了兩個函數(shù)用來判斷外部中斷狀態(tài)以及清除外部狀態(tài)標(biāo)志位的函數(shù) EXTI_GetFlagStatus 和 EXTI_ClearFlag,他們的作用和前面兩個函數(shù)的作用類似。只是EXTI_GetITStatus 函數(shù)中會先判斷這種中斷是否使能,使能了才去判斷中斷標(biāo)志位,而EXTI_GetFlagStatus 直接用來判斷狀態(tài)標(biāo)志位。
?
轉(zhuǎn)載于:https://www.cnblogs.com/kalo1111/p/3335043.html
總結(jié)
以上是生活随笔為你收集整理的stm32f4xx 的EXTI使用的一般步骤的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android源码编译过程
- 下一篇: sql 判断