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

发布者:创意航海最新更新时间:2019-04-22 来源: eefocus关键字:STM32  EXTI  外部中断事件控制器 手机看文章 扫描二维码
随时随地手机看文章

        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

[1] [2]
关键字:STM32  EXTI  外部中断事件控制器 引用地址:STM32学习14:EXTI(外部中断事件控制器)

上一篇:多外部中断的优先级配置
下一篇:STM32系统学习——EXTI(外部中断)

推荐阅读最新更新时间:2024-11-10 08:12

STM32在C文件中使用C++文件时,编译错误Error
最近,在做ARM开发时遇到问题,发现C文件调用C++文件时,编译出现如下错误:Error:identifier class is undefined 解决办法如下: 1、打开工程设置页面; 2、选择 C/C++ 选项卡,找到下面的 Misc Controls (下方倒数第二行); 3、加入 --cpp11 (没有引号),如果这一栏有其他东西就在最后面加上 ,--cpp11 (去掉引号); 4、确认。 问题解决
[单片机]
STM32开发笔记24:STM32L0低功耗设计
这几篇日志将详细记录,自己应用stm32进行低功耗设计的全过程。 使用芯片:STM32L053R8T6 运行模式: Range 1:电源电压限制在1.71-3.6V,CPU最大运行频率为32MHz。 Range 2:CPU最大运行频率为16MHz。 Range 3:CPU最大运行频率4.2MHz 低功耗模式: Sleep mode(睡眠模式)、Low-power run mode(低功耗运行模式)、Low-power sleep mode(低功耗睡眠模式)、Stop mode with RTC(带有RTC的停止模式)、Stop mode without R
[单片机]
<font color='red'>STM32</font>开发笔记24:STM32L0低功耗设计
stm32专题十八:SPI框图及通讯过程
stm32的SPI外设: 1 通讯引脚和结构框图 不同的SPI设备(由于挂载在不同的总线上),通讯速率不同 结构框图: 2 通讯速度 由控制寄存器CR1的BR 位来控制,主要就是对Fpclk(APB1时钟为72M,APB2时钟为36M)进行分频。 3 数据控制逻辑 SPI的MOSI及MISO都连接到数据移位寄存器上,数据移位寄存器的数据来源来源于接收缓冲区及发送缓冲区。 通过写SPI的“数据寄存器DR”把数据填充到发送缓冲区中。 通过读“数据寄存器DR”,可以获取接收缓冲区中的内容。 其中数据帧长度可以通过“控制寄存器CR1”的“DFF位”配置成8位及16位 模式;配置“LSBFIRST位”可选
[单片机]
<font color='red'>stm32</font>专题十八:SPI框图及通讯过程
STM32之BKP后备域库函数介绍
1.BKP_DeInit函数的功能是将外设BKP的全部寄存器重设为默认值。 2.BKP_TamperPinLevelConfig函数的功能是设置侵入检测引脚的有效电平。 .BKP_TamperPinLevel可取的值有.BKP_TamperPinLevel_High/_Low.分别是检测高低电平。 3.BKP_TamperPinCmd函数的功能是使能或失能引脚的侵入检测功能。 BKP_TamperPinCmd(enable); 4.BKP_WriteBackupRegister函数的功能是想指定的后备寄存器中写入用户程序数据。他分别可以选用1~10不同的数据寄存器。 BKP_WriteBackupRegister(BKP_DR1,
[单片机]
STM32 BootLoader跳转APP跑飞 可能是因为找不到某些中断函数入口
在做嵌入式产品时,有时为方便更新设备程序(如远程更新或者只更新模块程序等原因),就要用到bootloader对设备进行必要的初始化,引导下载APP等。 STM官网下载的bootloader程序中并没有用到定时器等,很可能遇不到下面的问题。但是小猿猴如我等,会迫不及待的对其进行“魔改”,再经过二手三手,再加上运气不好,下面的问题就很容易暴露出来了: 现象: bootloader 下载并跳转某些 app 程序时,app运行正常; 对于某些app来说,却根本跑不起来; app本身运行没有问题; bootlaoder+app运行,J-Link在线仿真时,发现报硬件错误; 原因之一: bootloader 中开启了某些中断(并编写了中断
[单片机]
如何学习STM32STM32入门学习经验总结
一、入门总结 1.1为什么要把时间花在“犹豫”上? 每当我们在入门之前(ARM是这样,DSP也一样),总会有很多疑问,会有很多顾虑。我们渴望知道学习STM32前景如何?需要啥基础?难不难?适不适合我?但是什么时候能心潮澎湃地、相当着急地开始学STM32?日子在一天一天过去!你开始行动了吗?没有行动的思索,永远都不可能入门!把这些时间用来看书吧,效果能好一万倍。 大家可能是从51单片机过来的,回想一下,我们之前学单片机时如何入门呢?实际上都是先看书(理论),再玩板子(实践)。严格地说,应该是模仿实验。熟悉之后才会自己写程序代码实现某个功能。因此,如果你正在咨询STM32;如果你正对STM32心潮澎湃;如果你想入门STM32;那么
[单片机]
STM32-(24):PWM基础
PWM是Pulse Width Modulation的缩写,即脉冲宽度调制。其通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。 PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制,用来对一个具体模拟信号的电平进行编码。等效的实现是基于采样定理中的一个重要的结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量即指窄脉冲的面积。这里所说的效果基本相同,是指该环节的输出响应波形基本相同。 如把各输出波形用傅里叶变换分析,则它们的低频段特性非常接近,仅在高频段略有差异。 为了实现a的效果,可以通过b这种正弦波去模拟达到这种效果。(通过每一段的面积相同
[单片机]
STM32-(24):PWM基础
STM32-1-STM32时钟系统
在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法 如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理: 1)对于10
[单片机]
STM32-1-STM32时钟系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved