STM32(六)外部中断-EXTI

发布者:meirong最新更新时间:2020-02-29 来源: eefocus关键字:STM32  外部中断  EXTI 手机看文章 扫描二维码
随时随地手机看文章

一、外部中断叙述

1、STM32的每个IO都可以作为外部中断输入。


2、STM32的中断控制器支持19个外部中断/事件请求:

线0~15:对应外部IO口的输入中断。

线16:连接到PVD输出。

线17:连接到RTC闹钟事件。

线18:连接到USB唤醒事件。


3、每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。

从上面可以看出,STM32供IO使用的中断线只有16个,但是STM32F10x系列的IO口多达上百个,STM32F103ZET6(112),

STM32F103RCT6(51),那么中断线怎么跟io口对应呢?

    GPIOx.0映射到EXTI0

    GPIOx.1映射到EXTI1

    …

    GPIOx.15映射到EXTI15

4、对于每个中断线,可以设置相应的触发方式(上升沿触发,下降沿触发,边沿触发)以及使能。


5、IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数:

从表中可以看出,外部中断线5~9分配一个中断向量,共用一个服务函数

外部中断线10~15分配一个中断向量,共用一个中断服务函数。


二、外部中断常用库函数

①void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

   //设置IO口与中断线的映射关系

   exp:  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);

②  void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

 //初始化中断线:触发方式等

③  ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

//判断中断线中断状态,是否发生

④  void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

//清除中断线上的中断标志位


三、外部中断一般配置步骤

1、初始化IO口为输入。

       GPIO_Init();

2、开启IO口复用时钟。

       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

3、设置IO口与中断线的映射关系。

        void GPIO_EXTILineConfig();

4、初始化线上中断,设置触发条件等。

       EXTI_Init();

5、配置中断分组(NVIC),并使能中断。

       NVIC_Init();

6、编写中断服务函数。

      EXTIx_IRQHandler();

7、清除中断标志位

      EXTI_ClearITPendingBit();


四、硬件连接

五、代码驱动

#include "exti.h"

#include "led.h"

#include "key.h"

#include "delay.h"

#include "usart.h"

 

//外部中断初始化函数

void EXTIX_Init(void)

{

    EXTI_InitTypeDef EXTI_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟

KEY_Init();//初始化按键对应io模式

    //GPIOC.5 中断线以及中断初始化配置

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);

 

  EXTI_InitStructure.EXTI_Line=EXTI_Line5;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

 

    //GPIOA.15   中断线以及中断初始化配置

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);

 

  EXTI_InitStructure.EXTI_Line=EXTI_Line15;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

 

    //GPIOA.0   中断线以及中断初始化配置

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

 

    EXTI_InitStructure.EXTI_Line=EXTI_Line0;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

 

  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键所在的外部中断通道

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2 

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;  //子优先级1

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

  NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能按键所在的外部中断通道

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2, 

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

  NVIC_Init(&NVIC_InitStructure); 

 

    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;  //使能按键所在的外部中断通道

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2, 

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级1

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

  NVIC_Init(&NVIC_InitStructure); 

}

void EXTI0_IRQHandler(void)

{

  delay_ms(10);    //消抖

if(WK_UP==1)

{   

LED0=!LED0;

LED1=!LED1;

}

EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位

}

 void EXTI9_5_IRQHandler(void)

{

delay_ms(10);   //消抖  

if(KEY0==0) {

LED0=!LED0;

}

  EXTI_ClearITPendingBit(EXTI_Line5);    //清除LINE5上的中断标志位  

}

void EXTI15_10_IRQHandler(void)

{

  delay_ms(10);    //消抖  

  if(KEY1==0) {

LED1=!LED1;

}

EXTI_ClearITPendingBit(EXTI_Line15);  //清除LINE15线路挂起位

}

关键字:STM32  外部中断  EXTI 引用地址:STM32(六)外部中断-EXTI

上一篇:嵌入式stm32学习:外部中断
下一篇:stm32学习笔记——外部中断的使用

推荐阅读最新更新时间:2024-11-08 13:22

ARM Cortex-M7的内存:太大还是不够?
毫无疑问,ARM Cortex-M7 - 拥有强大的内存和处理能力 –以即使在几年前都难以想象的方式扩展了微控制器的功能。该处理器被定位成为物联网(IOT)的核心构建模块的事实,更是夺人眼目。 事实上,意法半导体的STM32 F7系列在9月的ARM科技论坛上荣获了最佳表现奖。这是第一款采用ARM的Cortex-M7内核的32位MCU家族,拥有320KB SRAM和1024KB闪存。爱特梅尔采用Cortex-M7内核的处理器还没有公布,预计将有384KB SRAM和2MB闪存,这种内存规格高出典型的MCU 10倍以上。 但是,Cortex-M7是否拥有“完成任务”所需的必要资源基本上还是要取决于开发者。本质上:今天的嵌入式开
[单片机]
stm32固件库中GPIO的工作模式
固件库中GPIO的工作模式 总结一下可分为三种工作模式 输入模式、输出模式、复用模式 1、输入模式 1.1上拉输入:默认电平上拉 1.2下拉输入:默认电平下拉 1.3浮空输入:电平不确定完全由外部输入决定,多用于按键开关 1.4模拟输入:用于ADC采集(模数转换Analog-to-digital conversion) 在输入模式的时候,输出模式是被禁止的 2、输出模式 2.1推挽模式:双mos管轮流工作通过GPIOx_ODR可控制I/O输出高低电平 2.2开漏输出:只有N-MOS管工作PMOS管保持关闭,GPIOx_ODR可控制I/O输出高电平(N-MOS导通)和高阻态(N-MOS不导通);一般只用于IIC ,SMB
[单片机]
<font color='red'>stm32</font>固件库中GPIO的工作模式
深度解析STM32外设配置冲突问题
近日有客户反映,他在在使用STM32F103C8T6的时候遇到如下问题: I2C1使用PB6和PB7口,定时器TIM3使用PB0PB1PB4PB5做4路PWM。但在使用的过程中,如果只初始化定时器就没有任何问题,但是一旦初始化I2C1,那么定时器的通道2(PB5)就不能产生PWM波,而是保持高电平。 客户查阅手册得知PB5的默认复用功能是I2C1的SMBA引脚,但是它的I2C1是初始化为I2C模式的,并不是初始化为SMBAS模式,而且同样的方式在F0上测试是可用的。它本来用的是标准库开发的,然后尝试使用STM32CubeMx进行硬件配置,使用HAL库新建工程,还是存在同样的问题。 就上面的问题,查看了其有关I2C1和TIM
[单片机]
深度解析<font color='red'>STM32</font>外设配置冲突问题
stm32 的定时器4产生PWM
利用PB9产生PWM信号 一、引脚初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); 二、定时器初始化 void TIM4_Config(void) { // GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef T
[单片机]
STM32系列芯片串口烧写工具
官方的FlashLoader使用着太过麻烦,一步一步下去,而且还不是每次都能顺利通过, 最近自己写了一个STM32系列芯片的串口烧写工具, 只需点一次烧写按钮,剩下的自动完成, 运行环境:.NET4.0 1.可以烧写最多5个程序+1个自定义的hex数据; 2.可以读取芯片信息; 3.可以读取芯片内容; 4.烧写选项可选读写校验, 整片擦除, 使能读保护, 循环烧写(烧写完会继续进行下一次的烧写, 方便生产); 应用截图 : 目前主流的STM32系列芯片都支持, 在MAP目录下可自定义扩展芯片配置文件; 版本更新 1.0.6 1.修复F0芯片获取资料不准确的BUG; 2.烧写过程中读取校验失败再多读取校验
[单片机]
<font color='red'>STM32</font>系列芯片串口烧写工具
STM32库函数编程学习心得:assert_param的应用
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。 所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。 这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。 它确实在程序的运行上牺牲了效率
[单片机]
STM32串口接收不定长数据:采用标志位(比如0X0D,0X0A)结束法
缺点:有些情况下会导致数据丢失(可能返回数据中0x0d、0a本身为有效数据) 适用:约定协议的数据帧(发送数据的设备必须以相应的约定字节作为一次数据结束) void USART1_IRQHandler(void) //串口中断服务程序(函数) { u8 Res; //定义Res,用于Res =USART_ReceiveData(USART1);中存储串口1发送的数据(这里的数据按位发送) #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS OSIntEnter(); #endif if(USART_GetITStatus(USART1, US
[单片机]
025_STM32之MDK5软件仿真之查看io口输出
(一)模拟仿真或者STLINK仿真那些就需要相应的配置对应的地方 DARMSTM.DLL-pSTM32F103ZE (二) 如果是模拟仿真的话注意要配置好时钟 (三) 配置监测的引脚 输入配置的引脚之后点击空白处就行了 PORTA.0 如果弹出unknown signal的话,看第一点是否配置好,或者所配置的型号是否支持仿真,如:F429是不支持的 (四) 点击右键,选择输出的类型,像我们PWM的话就选bit的类型的 (五)运行看运行状态,点击stop或者start
[单片机]
025_STM32之MDK5软件仿真之查看io口输出
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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