STM32F407_外部中断

这里写目录标题

  • 前言
  • 1、EXTI概述
  • 2、外部中断配置流程
  • 完整代码

前言

注释很详细,放心食用。

1、EXTI概述

  • STM32F4的每个IO都可以作为外部中断的中断输入口,这点也是STM32F4的强大之处。
  • STM32F407的中断控制器支持22个外部中断/事件请求。每个中断线上都设有状态位,每个中断/事件都有独立的触发(上升沿、下降沿、上升下降沿)和屏蔽设置。
    • EXTI线0~15:对应外部IO口的输入中断。
    • EXTI线16:连接到PVD输出。
    • EXTI线17:连接到RTC闹钟事件。
    • EXTI线18:连接到USB OTG FS唤醒事件。
    • EXTI线19:连接到以太网唤醒事件。
    • EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件。
    • EXTI线21:连接到RTC入侵和时间戳事件。
    • EXTI线22:连接到RTC唤醒事件。

通过上面的内容我们可以看出,可以给单片机对应外部IO口使用的中断线仅有(EXTI线0~15)16条,而F407系列单片机的IO口远远不止16个。

所以RAM厂商做了一个巧妙地设计,GPIO的管脚GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G,H,I)分别对应中断线0~15。这样每个中断线对应了最多9个IO口,以线0为例:它对应了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0。如下图所示:
在这里插入图片描述
上面提到了,对于这16根中断线,每个中断线上都设有状态位,每个中断/事件都有独立的触发(上升沿、下降沿、上升下降沿)和屏蔽设置。
STM32的IO口外部中断在中断向量表里只分配了7个中断向量,所以我们只能使用下面这七个中断服务函数。

EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt /
EXTI1_IRQn = 7, /
!< EXTI Line1 Interrupt /
EXTI2_IRQn = 8, /
!< EXTI Line2 Interrupt /
EXTI3_IRQn = 9, /
!< EXTI Line3 Interrupt /
EXTI4_IRQn = 10, /
!< EXTI Line4 Interrupt /
EXTI9_5_IRQn = 23, /
!< External Line[9:5] Interrupts /
EXTI15_10_IRQn = 40, /
!< External Line[15:10] Interrupts */

从表中可以看出,中断线0-4每个中断线对应一个中断函数,中断线5-9共用中断函数EXTI9_5_IRQHandler,中断线10-15共用中断函数EXTI15_10_IRQHandler。

2、外部中断配置流程

注:我这里是以PE2的外部按键输入的中断处理举例。

  • 1、使能GPIOE端口时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);

  • 2、使能SYSCFG时钟:其用于配置外部中断
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);

  • 3、初始化GPIO-PE2为输入模式
    GPIO_InitTypeDef GPIO_Initstructure;
    GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IN;
    GPIO_Initstructure.GPIO_OType = GPIO_OType_OD;
    GPIO_Initstructure.GPIO_Pin=GPIO_Pin_15;
    GPIO_Initstructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_Initstructure);

  • 4、将GPIOE的引脚PE15与外部中断线2连接
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2);

  • 5、配置EXTI
    EXTI_InitTypeDef EXTI_Initstructure;
    EXTI_Initstructure.EXTI_Line=EXTI_Line2; /设置外部中断线为第2条/
    EXTI_Initstructure.EXTI_LineCmd=ENABLE; /使能外部中断线/
    EXTI_Initstructure.EXTI_Mode=EXTI_Mode_Interrupt; /配置为响应中断。另一种是事件/
    EXTI_Initstructure.EXTI_Trigger=EXTI_Trigger_Falling; /下降沿触发中断/
    EXTI_Init(&EXTI_Initstructure);

  • 6、配置NVIC(中断初始化向量参数:配置指定中断线的中断优先级)
    NVIC_InitTypeDef NVIC_Initstructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//进行中断优先级分组
    NVIC_Initstructure.NVIC_IRQChannel=EXTI2_IRQn;
    NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=2; /抢占优先级/
    NVIC_Initstructure.NVIC_IRQChannelSubPriority=2; /响应优先级/
    NVIC_Init(&NVIC_Initstructure);

  • 7、编写中断服务函数
    void EXTI2_IRQHandler(void)
    {
    if(EXTI_GetITStatus(EXTI_Line2)) /检查外部中断线 2 的中断标志位是否置位/
    {
    printf(“int!!!\r\n”); /测试程序,可根据自己的硬件情况设置,如点亮一个小灯等/
    EXTI_ClearITPendingBit(EXTI_Line2); /清除外部中断线 2 的中断标志位/
    }
    }

完整代码

key_exti.c

#include "key_exti.h"
/*按键中断*/
void Key_INT_config_E2(void)
{RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); /*使能SYSCFG时钟:其用于配置外部中断*///EXTI(外部中断)和NVIC(中断优先级控制)不需要配置时钟//中断信号--》AFIO--》EXTI--》NVIC--》CPU/** 第一步,配置GPIO为输入模式*/GPIO_InitTypeDef GPIO_Initstructure;GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IN;GPIO_Initstructure.GPIO_OType = GPIO_OType_OD;/*在输入模式下,这句没什么意义*/GPIO_Initstructure.GPIO_Pin=GPIO_Pin_15;GPIO_Initstructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_Initstructure);SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2);/*将GPIOE的引脚PE15与外部中断线2连接*//** 第二步,配置EXTI*/EXTI_InitTypeDef EXTI_Initstructure;EXTI_Initstructure.EXTI_Line=EXTI_Line2;              /*设置外部中断线为第2条*/EXTI_Initstructure.EXTI_LineCmd=ENABLE;               /*使能外部中断线*/EXTI_Initstructure.EXTI_Mode=EXTI_Mode_Interrupt;     /*配置为响应中断。另一种是事件*/EXTI_Initstructure.EXTI_Trigger=EXTI_Trigger_Falling; /*下降沿触发中断*/EXTI_Init(&EXTI_Initstructure);/**第三步,配置NVIC(中断初始化向量参数:配置指定中断线的中断优先级)*/NVIC_InitTypeDef NVIC_Initstructure;NVIC_Initstructure.NVIC_IRQChannel=EXTI2_IRQn;NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=2;  /*抢占优先级*/NVIC_Initstructure.NVIC_IRQChannelSubPriority=2;         /*响应优先级*/NVIC_Init(&NVIC_Initstructure);
}void EXTI2_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line2))       /*检查外部中断线 2 的中断标志位是否置位*/{printf("int!!!\r\n");EXTI_ClearITPendingBit(EXTI_Line2); /*清除外部中断线 2 的中断标志位*/}
}

key_exti.h

#ifndef __KEY_EXTI_H__
#define __KEY_EXTI_H__
#include "stm32f4xx.h"                  // Device header#include <stdbool.h>
#include <stdlib.h>void Key_INT_config_E2(void);#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/538512.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式常用5种通信协议

简介&#xff1a; 嵌入式常用五种通信协议为&#xff1a;UART、RS232、RS485、IIC、SPI。 由于这几种通信协议十分相似又有区别&#xff0c;所以分组记忆&#xff0c;红色的为一组&#xff0c;蓝色的为一组。 ①组都有两条线&#xff0c;且都是异步通信没得时钟线&#xff0c…

Redis基本使用

Redis基本使用 1.通用命令2.基本数据类型2.1 String2.2 Hash2.3 List2.4 Set2.5 SortedSet 3. SpringDataRedis3.1 简介3.2 快速代码示例3.3 序列化 1.通用命令 针对所有数据类型的操作可以在Redis官方文档查看。以下是通用的命令。 KEYS&#xff1a;查看符合模板的所有key D…

基于boost库的搜索引擎项目

文章目录 一、项目背景二、什么样的搜索引擎三、搜索引擎的宏观图原理四、Parse模块4.1下载boost库源代码4.2提取boost库中以.html为结尾的文件4.2.1 boost库的简单使用 4.3数据清洗(去标签化)4.3.1数据清洗的具体实现 4.4将清洗后的数据写入到raw.txt文件中 五、正排索引 vs 倒…

阿里云服务器租用费用一个月多少钱?5元1个月

阿里云服务器一个月多少钱&#xff1f;最便宜5元1个月。阿里云轻量应用服务器2核2G3M配置61元一年&#xff0c;折合5元一个月&#xff0c;2核4G服务器30元3个月&#xff0c;2核2G3M带宽服务器99元12个月&#xff0c;轻量应用服务器2核4G4M带宽165元12个月&#xff0c;4核16G服务…

了解关键字

关键字 定义&#xff1a;被Java语言赋予了特殊含义&#xff0c;用做专门用途的字符串&#xff08;或单词&#xff09; HelloWorld案例中&#xff0c;出现的关键字有 class、public 、 static 、 void 等&#xff0c;这些单词已经被Java定义好了。 特点&#xff1a;全部关键字都…

运放的基础知识

运算放大器&#xff08;Operational Amplifier&#xff0c;简称运放&#xff09;是一种直流耦合、差模&#xff08;差动模式&#xff09;输入的高增益电压放大器&#xff0c;通常具有单端输出。它能产生一个相对于输入端电势差大数十万倍的输出电势&#xff08;对地而言&#x…

JVM 相关知识点记录

文章目录 前言哪些内存需要回收方法区的垃圾回收垃圾收集算法垃圾收集器年轻代进入老年代条件内存担保机制FullGC 触发时机GC日志解析日志参数 前言 JVM包含内容&#xff1a; 类装载子系统(Class Load SubSystem)运行时数据区(Run-Time Data Areas) 堆栈 局部变量表操作数栈动…

面向对象(精髓)变继承关系为组和关系(_Decorator模式)

在软件开发中&#xff0c;设计模式是解决常见问题的可重用解决方案。在面向对象编程中&#xff0c;继承和组合是两种常用的代码复用方式。然而&#xff0c;随着软件需求的不断变化&#xff0c;我们需要更灵活的设计方式来应对不断变化的需求。在本文中&#xff0c;我们将讨论从…

如何选购自助咖啡机?这三点是关键!

在竞争激烈的咖啡市场中&#xff0c;既有知名咖啡连锁品牌&#xff0c;也有众多咖啡馆和小型连锁店&#xff0c;无人智能饮品机要想在激烈的竞争中脱颖而出&#xff0c;发挥自身优势&#xff1a;快速便捷是关键&#xff0c;同时好的口感才能留客&#xff0c;因此饮品机的选购成…

K8s — PVC|PV Terminating State

在本文中&#xff0c;我们将讨论PV和PVC一直Terminating的状态。 何时会Terminting? 在以下情况下&#xff0c;资源将处于Terminating状态。 在删除Bounded 状态的PVC之前&#xff0c;删除了对应的PV&#xff0c;PV在删除后是Terminting状态。删除PVC时&#xff0c;仍有引用…

考研数学——高数:高斯公式

助记: 关于积分时什么时候可以将变量整体代入积分式的问题&#xff1a;在积分过程中&#xff0c;如果某一整体恒为常量&#xff0c;则可以直接替换为定值&#xff0c;常见于对线或面的积分。 而在这题&#xff0c;用高斯公式之前是面积分&#xff0c;如果有这个整体出现的话是…

C++中的STL-string类

文章目录 一、为什么学习string类&#xff1f;1.1 C语言中的字符串 二、准库中的string类2.2 string类2.3 string类的常用接口说明2.4 string类对象的容量操作2.5 string类对象的访问及遍历操作2.5 string类对象的修改操作2.7 string类非成员函数2.8 模拟实现string 一、为什么…