STM32學習14:EXTI(外部中斷事件控制器)
阿新 • • 發佈:2019-02-09
EXTI管理了控制器的23箇中斷/事件線。每個中斷/事件線都對應有一個邊沿檢測器,可以實現輸入訊號的上升沿檢測和下降沿的檢測。EXTI可以實現對每個中斷/事件線進行單獨配置,可以單獨配置為中斷或者事件,以及觸發事件的屬性。
程式設計思路:
1、配置NVIC。初始化NVIC(實現過程:先初始化NVIC結構體,再寫NVICInit()函式)。
2、配置按鍵中斷。在這個函式中,因為我們要使用IO口作為中斷輸入, 所以第一步我們要使能相應的IO時鐘。(因為GPIO 和中斷線對映關係是在暫存器 SYSCFG_EXTICR1~ SYSCFG_EXTICR4 中配置的。所以我們要配置外部中斷,還需要開啟 SYSCFG 時鐘。)第二步,初始化相應GPIO
注意:中斷源(NVIC_IRQChannel的名字需是f4xx.h檔案內中斷源的名字,而中斷服務函式的名字,需是在.s的啟動檔案中的中斷服務函式的名字。)
哎,就引導這麼多了,貼上程式,具體流程程式中可以體現。
/** ****************************************************************************** * @file main.c * @author fire * @version V1.0 * @date 2015-xx-xx * @brief 使用外部中斷EXTI檢測按鍵,控制彩燈。 ****************************************************************************** * @attention * * 實驗平臺:秉火 STM32 F429 開發板 * 論壇 :http://www.firebbs.cn * 淘寶 :http://firestm32.taobao.com * ****************************************************************************** */ #include "stm32f4xx.h" #include "./led/bsp_led.h" #include "./key/bsp_exti.h" void Delay(__IO u32 nCount); /** * @brief 主函式 * @param 無 * @retval 無 */ int main(void) { /* LED 埠初始化 */ LED_GPIO_Config(); /* 初始化EXTI中斷,按下按鍵會觸發中斷, * 觸發中斷會進入stm32f4xx_it.c檔案中的函式 * KEY1_IRQHandler和KEY2_IRQHandler,處理中斷,反轉LED燈。 */ EXTI_Key_Config(); /* 等待中斷,由於使用中斷方式,CPU不用輪詢按鍵 */ while(1) { } } /*********************************************END OF FILE**********************/
#ifndef __EXTI_H #define __EXTI_H #include "stm32f4xx.h" //引腳定義 /*******************************************************/ #define KEY1_INT_GPIO_PORT GPIOA #define KEY1_INT_GPIO_CLK RCC_AHB1Periph_GPIOA #define KEY1_INT_GPIO_PIN GPIO_Pin_0 #define KEY1_INT_EXTI_PORTSOURCE EXTI_PortSourceGPIOA #define KEY1_INT_EXTI_PINSOURCE EXTI_PinSource0 #define KEY1_INT_EXTI_LINE EXTI_Line0 #define KEY1_INT_EXTI_IRQ EXTI0_IRQn #define KEY1_IRQHandler EXTI0_IRQHandler #define KEY2_INT_GPIO_PORT GPIOC #define KEY2_INT_GPIO_CLK RCC_AHB1Periph_GPIOC #define KEY2_INT_GPIO_PIN GPIO_Pin_13 #define KEY2_INT_EXTI_PORTSOURCE EXTI_PortSourceGPIOC #define KEY2_INT_EXTI_PINSOURCE EXTI_PinSource13 #define KEY2_INT_EXTI_LINE EXTI_Line13 #define KEY2_INT_EXTI_IRQ EXTI15_10_IRQn #define KEY2_IRQHandler EXTI15_10_IRQHandler /*******************************************************/ void EXTI_Key_Config(void); #endif /* __EXTI_H */
/**
******************************************************************************
* @file Project/STM32F4xx_StdPeriph_Templates/stm32f4xx_it.c
* @author MCD Application Team
* @version V1.5.0
* @date 06-March-2015
* @brief Main Interrupt Service Routines.
* This file provides template for all exceptions handler and
* peripherals interrupt service routine.
******************************************************************************
* @attention
*
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_it.h"
#include "./led/bsp_led.h"
#include "./key/bsp_exti.h"
/** @addtogroup STM32F429I_DISCOVERY_Examples
* @{
*/
/** @addtogroup FMC_SDRAM
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
/* Cortex-M4 Processor Exceptions Handlers */
/******************************************************************************/
/**
* @brief This function handles NMI exception.
* @param None
* @retval None
*/
void NMI_Handler(void)
{
}
/**
* @brief This function handles Hard Fault exception.
* @param None
* @retval None
*/
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{}
}
/**
* @brief This function handles Memory Manage exception.
* @param None
* @retval None
*/
void MemManage_Handler(void)
{
/* Go to infinite loop when Memory Manage exception occurs */
while (1)
{}
}
/**
* @brief This function handles Bus Fault exception.
* @param None
* @retval None
*/
void BusFault_Handler(void)
{
/* Go to infinite loop when Bus Fault exception occurs */
while (1)
{}
}
/**
* @brief This function handles Usage Fault exception.
* @param None
* @retval None
*/
void UsageFault_Handler(void)
{
/* Go to infinite loop when Usage Fault exception occurs */
while (1)
{}
}
/**
* @brief This function handles Debug Monitor exception.
* @param None
* @retval None
*/
void DebugMon_Handler(void)
{}
/**
* @brief This function handles SVCall exception.
* @param None
* @retval None
*/
void SVC_Handler(void)
{}
/**
* @brief This function handles PendSV_Handler exception.
* @param None
* @retval None
*/
void PendSV_Handler(void)
{}
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{}
/******************************************************************************/
/* STM32F4xx Peripherals Interrupt Handlers */
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
/* available peripheral interrupt handler's name please refer to the startup */
/* file (startup_stm32f429_439xx.s). */
/******************************************************************************/
/**
* @}
*/
void KEY1_IRQHandler(void)
{
//確保是否產生了EXTI Line中斷
if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
{
// LED1 取反
LED1_TOGGLE;
//清除中斷標誌位
EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
}
}
void KEY2_IRQHandler(void)
{
//確保是否產生了EXTI Line中斷
if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET)
{
// LED2 取反
LED2_TOGGLE;
//清除中斷標誌位
EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);
}
}
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
#ifndef __EXTI_H
#define __EXTI_H
#include "stm32f4xx.h"
//引腳定義
/*******************************************************/
#define KEY1_INT_GPIO_PORT GPIOA
#define KEY1_INT_GPIO_CLK RCC_AHB1Periph_GPIOA
#define KEY1_INT_GPIO_PIN GPIO_Pin_0
#define KEY1_INT_EXTI_PORTSOURCE EXTI_PortSourceGPIOA
#define KEY1_INT_EXTI_PINSOURCE EXTI_PinSource0
#define KEY1_INT_EXTI_LINE EXTI_Line0
#define KEY1_INT_EXTI_IRQ EXTI0_IRQn
#define KEY1_IRQHandler EXTI0_IRQHandler
#define KEY2_INT_GPIO_PORT GPIOC
#define KEY2_INT_GPIO_CLK RCC_AHB1Periph_GPIOC
#define KEY2_INT_GPIO_PIN GPIO_Pin_13
#define KEY2_INT_EXTI_PORTSOURCE EXTI_PortSourceGPIOC
#define KEY2_INT_EXTI_PINSOURCE EXTI_PinSource13
#define KEY2_INT_EXTI_LINE EXTI_Line13
#define KEY2_INT_EXTI_IRQ EXTI15_10_IRQn
#define KEY2_IRQHandler EXTI15_10_IRQHandler
/*******************************************************/
void EXTI_Key_Config(void);
#endif /* __EXTI_H */
/**
******************************************************************************
* @file bsp_exti.c
* @author fire
* @version V1.0
* @date 2015-xx-xx
* @brief I/O線中斷應用bsp
******************************************************************************
* @attention
*
* 實驗平臺:秉火 STM32 F429 開發板
* 論壇 :http://www.firebbs.cn
* 淘寶 :http://firestm32.taobao.com
*
******************************************************************************
*/
#include "./key/bsp_exti.h"
/**
* @brief 配置巢狀向量中斷控制器NVIC
* @param 無
* @retval 無
*/
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 配置NVIC為優先順序組1 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 配置中斷源:按鍵1 */
NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
/* 配置搶佔優先順序:1 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* 配置子優先順序:1 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/* 使能中斷通道 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* 配置中斷源:按鍵2,其他使用上面相關配置 */
NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;
NVIC_Init(&NVIC_InitStructure);
}
/**
* @brief 配置 PA0 為線中斷口,並設定中斷優先順序
* @param 無
* @retval 無
*/
void EXTI_Key_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/*開啟按鍵GPIO口的時鐘*/
RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK|KEY2_INT_GPIO_CLK ,ENABLE);
/* 使能 SYSCFG 時鐘 ,使用GPIO外部中斷時必須使能SYSCFG時鐘。因為GPIO和中斷線對映關係是在暫存器 SYSCFG_EXTICR1~ SYSCFG_EXTICR4 中配置的*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* 配置 NVIC */
NVIC_Configuration();
/* 選擇按鍵1的引腳 */
GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;
/* 設定引腳為輸入模式 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
/* 設定引腳不上拉也不下拉 */
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
/* 使用上面的結構體初始化按鍵 */
GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure);
/* 連線 EXTI 中斷源 到key1引腳 */
SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);
/* 選擇 EXTI 中斷源 */
EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;
/* 中斷模式 */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
/* 下降沿觸發 */
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
/* 使能中斷/事件線 */
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* 選擇按鍵2的引腳 */
GPIO_InitStructure.GPIO_Pin = KEY2_INT_GPIO_PIN;
/* 其他配置與上面相同 */
GPIO_Init(KEY2_INT_GPIO_PORT, &GPIO_InitStructure);
/* 連線 EXTI 中斷源 到key2 引腳 */
SYSCFG_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE,KEY2_INT_EXTI_PINSOURCE);
/* 選擇 EXTI 中斷源 */
EXTI_InitStructure.EXTI_Line = KEY2_INT_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
/* 上升沿觸發 */
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
/*********************************************END OF FILE**********************/