单片机
返回首页

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

2019-04-22 来源:eefocus

        EXTI管理了控制器的23个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。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

  *

  *

© COPYRIGHT 2015 STMicroelectronics

  *

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

 


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章