STM32外部中断(EXTI)分析和应用

发布者:落霞与孤鹜最新更新时间:2017-10-07 来源: eefocus关键字:STM32  外部中断  EXTI 手机看文章 扫描二维码
随时随地手机看文章

学过51单片机的外部中断的话入门会很快; 
本篇博文基于STM32F103ZET6芯片,与大多数STM32F10x芯片兼容; 
代码基于ST官网提供的3.5.0标准库 
如有不足之处,还望前辈多多指教;

一些需要了解的基础知识 
1. STM32每个GPIO口都可以作为外部中断输入口使用 
2. 每个中断都设有状态位 
3. 每个中断/事件都有独立的触发和屏蔽设置。 
4. STM32103有19个外部中断(但是供GPIO口使用的中断只有16个) 
分别是: 
0~15:对应外部中断IO的输入中断 
16 : 连接到PVD输出 
17 :连接到RTC闹钟时间 
18 :连接到USB唤醒事件

这里会容易出现一个问题说:STM32F103ZET6的GPIO管脚一共有6*16即96个GPIO管脚,如何对应只有0~15共16个的外部中断机制;请看下图: 
这里写图片描述 
图片反映GPIO管脚和外部中断的对应关系

通过上面的图能看出来每个管脚所对应的外部中断线,但是我们在应用的时候不会将所有的GPIO管脚都去配置,所以这时候就需要我们去通过调用库函数去人为的去配置寄存器;下面说程序配置的过程

编写程序的步骤 
1. 初始化GPIO口为输入; 
2. 开启GPIO口复用时钟,设置GPIO口与中断线的映射关系; 
3. 初始化线上中断,设置触发条件等; 
4. 配置中断分组(NVIC),并使能中断; 
5. 编写中断服务函数

编程步骤的实现以及对应库函数的讲解 
本例程将实现一个按键的按下触发对应的GPIO口的外部中断,中断函数内部实现一个对LED灯的控制;

  1. 初始化GPIO口为输入

    //定义两个结构体变量,在后面的程序中分别用于配置管脚和配置中断;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;123
//按键初始化函数//PE.2的外部电路是外部下拉,配置管脚的时候将它设置为上拉输入void KEY_Init(void) //IO初始化{ 
    GPIO_InitTypeDef GPIO_InitStructure;                          
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);              //使能GPIOE时钟
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2;                        //确定要操作的管脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                     //设置此管脚为上拉输入      
    GPIO_Init(GPIOE, &GPIO_InitStructure);                            //初始化GPIOE2}12345678910

2.开启GPIO口复用时钟,设置GPIO口与中断线的映射关系

   void GPIO_EXTILineConfig(uint8_t  GPIO_PortSource , uint8_t  GPIO_PinSource);     //开启对应管脚和外部中断线的连接1

例:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE , GPIO_PinSource2); //中断线2与GPIOE连接,即与EXTI2中断线连接;

  1. 初始化线上中断,设置触发条件等;

    EXTI_InitStructure.EXTI_Line=EXTI_Line2;                     //配置中断线标号;范围从EXTI_Line0 ~ EXTI_Line15;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;          //设置模式为中断模式; 可选EXTI_Trigger_interrupt和EXTI_Trigger_Event;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;      //设置触发方式为下降沿;可选下降沿触发:EXTI_Trigger_Falling;上升沿触发:EXTI_Trigger_Rising;上升沿和下降沿都触发:EXTI_Rising_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;                    //使能此中断线
    EXTI_Init(&EXTI_InitStructure);     //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器12345
  1. 配置中断分组(NVIC),并使能中断;

    NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;                   //使能按键KEY2所在的外部中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;       //抢占优先级2, 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;              //子优先级2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                    //使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);12345
  1. 编写中断服务函数 
    STM32的GPIO口外部中断函数只有6个,分别是: 
    EXPORT EXT0_IRQHandler 
    EXPORT EXT1_IRQHandler 
    EXPORT EXT2_IRQHandler 
    EXPORT EXT3_IRQHandler 
    EXPORT EXT4_IRQHandler 
    EXPORT EXT9_5_IRQHandler 
    EXPORT EXT15_10_IRQHandler 
    这里需要解释:

  2. 中断线0~4每个中断线对应一个中断函数 
    举个例子:PA0,PB0,PC0,PD0,PE0,PF0 共用 void EXT0_IRQHandler(void)中断函数; 
    PA1,PB1,PC1,PD1,PE1,PF1 共用 void EXTI1_IRQHandler(void)中断函数; 
    …… 
    …… 
    PA4,PB4,PC4,PD4,PE4,PF4 共用 void EXTI4_IRQHandler(void)中断函数;

  3. 中断线5~9共用一个中断函数:EXTI_9_5_IRQHandler 
    PA5,PA6,PA7,PA8,PA9 
    PB5,PB6,PB7,PB8,PB9 
    PC5,PC6,PC7,PC8,PC9 
    PD5,PD6,PD7,PD8,PD9 
    PE5,PE6,PE7,PE8,PE9

  4. 中断线10~15共用中断函数EXTI15_10_IRQHandler 
    PA10,PA11,PA12,PA13,PA14,PA15 
    PB10,PB11,PB12,PB13,PB14,PB15 
    PC10,PC11,PC12,PC13,PC14,PC15 
    PD10,PD11,PD12,PD13,PD14,PD15 
    PE10,PE11,PE12,PE13,PE14,PE15

判断中断线上中断是否发生的函数(中断标志位是否置位)

ITStatus EXTI_GetITStatis(uint32_t EXTI_Line);      //一般放在中断程序的开头检查所检查的中断线是否发生中断1

清除中断标志位函数(这个有点像C51单片机里边的IT还是TI忘记了,反正就是中断标志位)

void EXTI_ClearITPendingBit(uint32_t  EXTI_Line);1

应用中的中断服务函数格式:

void EXTI2_IRQHandler(void){    if(!(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)))  //判断按键是否被按下
    {
        中断逻辑……

    }    EXTI_ClearITPendingBit(EXTI_Line2);   //清除Line上的中断标志位}123456789

有关寄存器 
中断屏蔽寄存器EXTI_IMR 
事件屏蔽寄存器EXTI_EMR 
上升沿触发选择寄存器EXTI_RTSR 
下降沿触发选择寄存器EXTI_FTSR 
软件中断时间寄存器EXTI_SWIER 
挂起寄存器EXTI_PR


关键字:STM32  外部中断  EXTI 引用地址:STM32外部中断(EXTI)分析和应用

上一篇:STM32的NVIC和中断的总结
下一篇:STM32F10X时钟系统学习笔记

推荐阅读最新更新时间:2024-03-16 15:39

STM32,RTC周期性唤醒(wakeup)中断
STM32L151: int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); LED_ON(); MX_DMA_Init(); MX_SPI1_Init(); MX_SPI2_Init(); MX_TIM3_Init(); MX_USART2_UART_Init(); //MX_IWDG_Init(); MX_RTC_Init(); MX_USART3_UART_Init(); MX_USART1_UART_Init(); printf( init complete...\r\n ); LED_OFF(); uns
[单片机]
STM32 基础系列教程 25 - USB_HID_mouse
前言 学习stm32 USB接口使用,学会用CUBE工具快速创建USB设备工程及调试,关于usb的相关知道请读者提前准备并学习,当然如果不想深究其中原理的话,跟着本文来操作就可以实现基于USB的设备开发了。需要提示的是,stm32在使用usb接口功能是一般需要在DP引脚上上拉一个1.5K电阻到3.3V(部分MCU内部会上拉)。 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。 本示例所用的最小系统板原理图: 从本节开始,关于CUBEMX工具及KEIL工具的操作将不再细讲,如
[单片机]
<font color='red'>STM32</font> 基础系列教程 25 - USB_HID_mouse
stm32---DAC
DAC即数字模拟转换器,它可以将数字信 号转换为模拟信号。 它的功能与 ADC 相反。在常见的数字信号系统中,大部分传 感器信号被转化成电压信号,而 ADC 把电压模拟信号转换成易于计算机存储、 处理的数字编码,由计算机处理完成后,再由 DAC 输出电压模拟信号,该电压 模拟信号常常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还 原就是这样一个过程。 触发方式 前面是定时器TIM,中间是外部中断9,后面是软件触发 dac.c #include dac.h void DAC1_Init() { GPIO_InitTypeDef GPIO_InitStructure; DAC_InitTyp
[单片机]
stm32:查询法使用pt2262/pt2272无线模块
pt2262/pt2272的工作原理就是按下遥控器的按键之后,接收器的相对应引脚上就会产生一个高电平。该程序实现的功能就是遥控器按下之后,红灯亮起。采用查询法检测引脚是否为高电平。 //初始化接收器的相对应的IO口 void KEY1_Config(void) { GPIO_InitTypeDef GPIO_Struct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //由于检测高电平,所以设置为下拉模式,可理解为,该io口为低电平 GPIO_Struct.GPIO_Mode=GPIO_Mode_IPD; GPIO_Struct.GPIO_
[单片机]
STM32 调试 24L01 心得
大部分使用STM32开发nrf24L01的用户基本都是照搬常见的几个开发板的源代码,在这里我做一些总结: 1.源代码中在while(1)的循环中有 NRF24L01_TX_Mode();或NRF24L01_RX_Mode();类似这样的代码,因为源码中需要检测按键以便切换的不同的模式,对于正常使用来讲,都是发送接收方确定了的,所有,只需要一次即可,没必要放到while中。 2.接收方和发送方的ADDRESS必须一致,这一点尤为重要。 3.发射的通道即频率必须一致,这个好理解。速率,数据长度,也要一致! 4.接收方无论是在中断中接收还是在while中接收,接收后必须清掉FIFO寄存器,否则会出现发送1-3次就不能正确发送的现象。
[单片机]
IAR在STM32的配置方法
1. 建立工程项目文件 新建一个文件夹来存放整个工程项目,在该项目文件夹下建立几个子文件夹存放不同类别的文件: i.将官方模板中的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h和空白main.c文件复制到该项目文件夹下; ii. Obj-存放工程文件,将官方模板中的cortexm3_macro.s、lnkarm_flash.xcl、lnkarm_ram.xcl和stm32f10x_vector.c文件复制到该文件夹下。 iii.library-存放STM32 FWLib文件,将官方提供的固件库library复制到该文件夹下。 2. 在IAR中建立工程 打开IAR,在Project菜
[单片机]
IAR在<font color='red'>STM32</font>的配置方法
STM32的can现场总线的特点及工作流程分析
最近在搞stm32实验板的can现场总线实验,之前只是搞过STC51的串口通信,相比之下,发觉can总线都挺复杂的。开始时,知道自己是新手,只知道can总线跟串行通信,485通信,I2C通信一样都是用来传输数据通信的,对其工作原理一窍不通,还是从基础开始看书看资料,先了解它的基本原理吧。 原来can总线有以下特点: 主要特点 支持CAN协议2.0A和2.0B主动模式 波特率最高可达1兆位/秒 支持时间触发通信功能 发送 3个发送邮箱 发送报文的优先级特性可软件配置 记录发送SOF时刻的时间戳 接收 3级深度的2个接收FIFO 14个位宽可变的过滤器组-由整个CAN共享 标识符列表 FIFO溢出处理方式可配置 记录接
[单片机]
<font color='red'>STM32</font>的can现场总线的特点及工作流程分析
STM32按键控制LED的亮灭
使用一个按键控制 LED 的亮灭,按键按下时LED亮起,按键松开时LED熄灭。通过按键控制实验来介绍下 IO 口作为输入的使用。本例中用到了GPIOE的PE3管脚。 LED和按键的电路图。 按键 K_LEFT、K_DOWN、K_RIGHT 分别连接在 STM32 F1 芯片 的 PE2、PE3、PE4引脚上。 按键另一端是全部接在 GND 上,这个和我们学习 51单片机 是一样的,采用独立式按键接法,按下时输入到芯片管脚即为低电平。 整个程序实现的流程步骤如下: 初始化按键使用的 端口 及 时钟 按键 检测 处理 按键控制处理 工程文件目录如下。 IO口初始化程序代码在key.c文件中。 /**********
[单片机]
<font color='red'>STM32</font>按键控制LED的亮灭
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved