STM32F407_外部中断

news2024/11/17 9:36:50

这里写目录标题

  • 前言
  • 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.coloradmin.cn/o/1517079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

hex文件格式解析

本文框架 1. hex文件格式1.1 数据长度1.2 地址域1.3 数据类型1.4 数据域1.5 CRC校验域 本文对hex文件格式进行解析&#xff0c;介绍各部分组成及其含义&#xff0c;在此mark下&#xff0c;方便后续开发脚本对hex文件进行操作。 1. hex文件格式 Intel HEX文件是由一行行符合Int…

Explain详解与索引优化最佳实践

Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在select语句之前增加explain关键字,MySQL会在查询前设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL 注意: 如果from中包含子查询,仍会执行该子查询,将结果…

Gemma: Open Models Based on Gemini Research and Technology

Gemma: Open Models Based on Gemini Research and Technology 相关链接&#xff1a;arxiv 关键字&#xff1a;Gemma、Google DeepMind、open models、language understanding、reasoning 摘要 这项工作介绍了Gemma&#xff0c;一系列轻量级、最先进的开放模型&#xff0c;基于…

笔记本的显示器都是核显输出,还要独显干啥呢?

前言 今天小白还在睡梦中&#xff0c;就接到一个朋友发来的消息&#xff1a;笔记本的显示器都是直接在核显上的&#xff0c;没有改独显的选项。 如果是这样&#xff0c;那笔记本还有独立显卡什么事情&#xff1f;笔记本加了独显难道就只是为了圈钱&#xff1f; 其实并不是这样…

06双体系Java学习之算术运算符,赋值运算符,关系运算符

// 二元运算符//CtrlD : 复制当前行到下一行int a 10;int b 20;int c 25;int d 25;System.out.println(ab);System.out.println(a-b);System.out.println(a*b);System.out.println(a/(double)b);赋值运算符 关系运算符 package operator;public class Demo03 {public stati…

ModuleNotFoundError: No module named ‘sklearn.cross_validation‘

一、问题分析 ModuleNotFoundError: No module named sklearn.cross_validation 英文先翻译一遍&#xff0c;模块未找到问题&#xff0c;这里涉及到sklearn这个模块&#xff0c;Sklearn &#xff08;全称 SciKit-Learn&#xff09;&#xff0c;是基于 Python 语言的机器学习工…

力扣每日一题 合并后数组中的最大元素 贪心

Problem: 2789. 合并后数组中的最大元素 思路 贪心&#xff1a;从右向左合并&#xff0c;尽可能的多合并&#xff0c;直到不能合并&#xff0c;更新答案&#xff0c;找前一阶段的最大合并值 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code …

1456.定长子串中元音的最大数目

题目&#xff1a;给你字符串 s 和整数 k 。 请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。 英文中的 元音字母 为&#xff08;a, e, i, o, u&#xff09;。 解题思路&#xff1a; 1.右侧新进入窗口的字母为元音字母&#xff0c;左侧移出窗口的字母…

C语言【典型算法编程题】总结

以下最全总结! 一,分支结构 1,if 编写程序,从键盘上输入三角形的三个边长(实数),判断这三个边能否构成三角形(构成三角形的条件为:任意两边之和大于第三边),如果能构成三角形,则计算三角形的面积并输出(保留2位小数);如果不能构成三角形,则输出“Flase”字符…

AJAX 03 XMLHttpRequest、Promise、封装简易版 axios

AJAX 学习 AJAX 3 原理01 XMLHttpRequest① XHR 定义② XHR & axios 关系③ 使用 XHR④ XHR查询参数案例&#xff1a;地区查询&#xff08;URLSearchParams&#xff09;⑤ XHR数据提交 POST 02 PromisePromise 使用Promise - 三种状态案例&#xff1a;使用Promise XHR 获取…

解析找不到msvcr120.dll无法继续执行此代码的多种修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcr120.dll丢失”。这个错误通常会导致某些程序无法正常运行。为了解决这个问题&#xff0c;本文将介绍5种修复msvcr120.dll丢失的方法。 一&#xff0c;msvcr120.dll丢失会出现哪些问题…

sql注入重学

sql基本操作 基本查询语句 union (必须得是前面的列与后面的列相同才可以查询&#xff09; 看第二局uses表中的列有3列&#xff0c;而emails中的列只有两列&#xff0c;所有无法成功查询 这就相当于我们再加了一列 group by &#xff08;分组&#xff09; 相当于将其分为10列…

Python 闭包和nonlocal声明

闭包是针对嵌套函数环境的概念&#xff0c;它的作用是延伸函数的作用域。简单来说&#xff0c;闭包就是一个函数&#xff0c;但它可以保存着上层函数作用域中的变量&#xff0c;使得这些变量可以在函数中使用。而nonlocal声明的作用就是允许函数重新绑定局部作用域以外且非全局…

3、鸿蒙学习-在AGC创建HarmonyOS 项目或应用

项目和应用介绍 关于项目 项目是资源、应用的组织实体。资源包括服务器、数据库、存储&#xff0c;以及您的应用、终端用户的数据等。在您使用部分服务时&#xff0c;您是数据的控制者&#xff0c;数据将按照您设置的数据处理位置来存储在指定区域。 通常&#xff0c;您不需…

paraview处理openfoam对称模型

paraview处理openfoam对称模型 步骤如下: 导入对称模型,以openfoam中xx\tutorials\incompressible\SRFSimpleFoam\mixer中的搅拌器为例;使用ctrl+space,查找transform,在Filters中也能找到;经过三次transform,可以移动旋转出对称的其他3部分;经过此三次移动旋转,并不能…

电路基础笔记——电路的等效变换

线性电阻的等效 线性电阻串联&#xff1a;RR1R2 分压公式&#xff1a;Uk(Rk/R)*U 线性电阻并联&#xff1a;1/R1/R11/R2 GG1G2 分流公式&#xff1a;Ik(Gk/G)*I 独立电源的等效 电压源与电压源串联 UsUs1Us2 电压源与电压源并联 U…

Maven简单入门

Maven 一&#xff1a;什么是Maven&#xff1a; Maven是一个项目管理工具&#xff0c;用于构建和管理Java项目。它可以帮助开发人员自动化构建过程&#xff0c;管理项目依赖关系&#xff0c;并协助项目的发布和部署。通过Maven&#xff0c;开发人员可以定义项目的结构、依赖关…

kakfa模拟仿真篇之spark-submit在linux运行 (更贴近真实场景)

源码在上篇 地址在这 &#xff1a;Kafka模拟器产生数据仿真-集成StructuredStreaming做到”毫秒“级实时响应StreamData落地到mysql-CSDN博客 这里分享一下一些新朋友不知道spark-submit 指令后 的参数怎么写 看这篇绝对包会 声明&#xff1a; 此项目是基于 maven 打包的说明…

VBA技术资料MF129:批量删除及重命名文件夹

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

柚见第十期(后端队伍接口详细设计)

创建队伍 用户可以 创建 一个队伍&#xff0c;设置队伍的人数、队伍名称&#xff08;标题&#xff09;、描述、超时时间 P0 队长、剩余的人数 聊天&#xff1f; 公开 或 private 或加密 信息流中不展示已过期的队伍 请求参数是否为空&#xff1f;是否登录&#xff0c;未登录不…