日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

stm32f4xx 的EXTI使用的一般步骤

發布時間:2023/12/13 综合教程 35 生活家
生活随笔 收集整理的這篇文章主要介紹了 stm32f4xx 的EXTI使用的一般步骤 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用 IO 口外部中斷的一般步驟:
1)初始化 IO 口為輸入。
2)開啟 IO 口復用時鐘,設置 IO 口與中斷線的映射關系。
3)初始化線上中斷,設置觸發條件等。
4)配置中斷分組(NVIC),并使能中斷。
5)編寫中斷服務函數。

基礎知識略過,

第一步.配置 GPIO 與中斷線的映射關系的函數

1 void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)

配置實例:

1 void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOI, uint8_t EXTI_PinSource8)

  將中斷線 8 與 GPIOI 映射起來,那么很顯然是 GPIOI.8 與 EXTI8 中斷線連接了。設置好中斷線映射之后,那么到底來自這個IO口的中斷時通過什么方式出發的呢?接下來我們就要設置該中斷線上中斷的初始化參數了。

第二步.中斷線上中斷的初始化是通過函數 EXTI_Init()實現的。EXTI_Init()函數的定義是:

1 void EXTI_Init  ( EXTI_InitTypeDef *  EXTI_InitStruct )  

下面我們用一個使用范例來說明這個函數的使用:

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);      //根據 EXTI_InitStruct 中指定的
7 //參數初始化外設 EXTI 寄存器

  STM32 的外設的初始化都是通過結構體來設
  置初始值的,這里就不羅嗦結構體初始化的過程了。我們來看看結構體 EXTI_InitTypeDef 的成員變量:

 1 typedef struct
 2 {
 3   uint32_t EXTI_Line;               /*!< Specifies the EXTI lines to be enabled or disabled.
 4                                          This parameter can be any combination value of @ref EXTI_Lines */
 5    
 6   EXTIMode_TypeDef EXTI_Mode;       /*!< Specifies the mode for the EXTI lines.
 7                                          This parameter can be a value of @ref EXTIMode_TypeDef */
 8 
 9   EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines.
10                                          This parameter can be a value of @ref EXTITrigger_TypeDef */
11 
12   FunctionalState EXTI_LineCmd;     /*!< Specifies the new state of the selected EXTI lines.
13                                          This parameter can be set either to ENABLE or DISABLE */ 
14 }EXTI_InitTypeDef;

EXTI_InitTypeDef

簡單介紹一下:第一個EXTI_Line,中斷線;第二個EXTI_Mode:可選值為中斷 EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event;第三個參數是觸發方式,可以是下降沿觸發 EXTI_Trigger_Falling,上升沿觸發 EXTI_Trigger_Rising,或者任意電平(上升沿和下降沿)觸發EXTI_Trigger_Rising_Falling  

我們設置好中斷線和 GPIO 映射關系,然后又設置好了中斷的觸發模式等初始化參數。 既然是外部中斷,涉及到中斷我們當然還要設置 NVIC 中斷優先級。

第三步,配置中斷優先級組 和 NVIC 結構體初始化

中斷優先級組:

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   */

中斷優先級組 函數說明

NVIC結構體:

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結構體及其說明

再來個配置實例:

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配置實例

 

第四步.中斷服務ISR 我們配置完中斷優先級之后,接著我們要做的就是編寫中斷服務函數。中斷服務函數的名
  字是在 MDK 中事先有定義的。這里需要說明一下,STM32 的 IO 口外部中斷函數只有 6 個,
  分別為:

1 EXPORT   EXTI0_IRQHandler          
2 EXPORT   EXTI1_IRQHandler       
3 EXPORT   EXTI2_IRQHandler         
4 EXPORT   EXTI3_IRQHandler        
5 EXPORT   EXTI4_IRQHandler          
6 EXPORT   EXTI9_5_IRQHandler        
7 EXPORT   EXTI15_10_IRQHandler   

中斷線 0-4 每個中斷線對應一個中斷函數,中斷線 5-9 共用中斷函數 EXTI9_5_IRQHandler,中斷線 10-15 共用中斷函數 EXTI15_10_IRQHandler。 在編寫中斷服務函數的時候會經常使用到兩個函數,第一個函數是判斷某個中斷線上的中斷是否發生(標志位是否置位) :

1 ITStatus EXTI_GetITStatus  ( uint32_t  EXTI_Line ) 

這個函數一般使用在中斷服務函數的開頭判斷中斷是否發生。另一個函數是清除某個中斷線上的中斷標志位:

1 void EXTI_ClearITPendingBit  ( uint32_t  EXTI_Line ) 

這個函數一般應用在中斷服務函數結束之前,清除中斷標志位。常用的中斷服務函數格式為:

void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line8)!=RESET)//判斷某個線上的中斷是否發生 
{
中斷邏輯…
EXTI_ClearITPendingBit(EXTI_Line8);   //清除 LINE 上的中斷標志位
}     
}

在這里需要說明一下,固件庫還提供了兩個函數用來判斷外部中斷狀態以及清除外部狀態標志位的函數 EXTI_GetFlagStatus 和 EXTI_ClearFlag,他們的作用和前面兩個函數的作用類似。只是EXTI_GetITStatus 函數中會先判斷這種中斷是否使能,使能了才去判斷中斷標志位,而EXTI_GetFlagStatus 直接用來判斷狀態標志位。

總結

以上是生活随笔為你收集整理的stm32f4xx 的EXTI使用的一般步骤的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。