当前位置: 代码迷 >> 综合 >> STM32学习14:EXTI(外部中断事件控制器)
  详细解决方案

STM32学习14:EXTI(外部中断事件控制器)

热度:16   发布时间:2023-09-28 02:45:37.0

        EXTI管理了控制器的23个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

STM32学习14:EXTI(外部中断事件控制器)

STM32学习14:EXTI(外部中断事件控制器)

编程思路:

1、配置NVIC。初始化NVIC(实现过程:先初始化NVIC结构体,再写NVICInit()函数)。

2、配置按键中断。在这个函数中,因为我们要使用IO口作为中断输入, 所以第一步我们要使能相应的IO时钟(因为GPIO 和中断线映射关系是在寄存器 SYSCFG_EXTICR1~ SYSCFG_EXTICR4 中配置的。所以我们要配置外部中断,还需要打开 SYSCFG 时钟。)第二步,初始化相应GPIO(实现过程:先初始化GPIO结构体,再写GPIOinit()函数)。第三步,使用SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)函数将相应的GPIO引脚连接到EXTI中断源上。

注意:中断源(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>&copy; 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**********************/