STM32多个外部中断可能共享同一个中断向量

在STM32F4系列微控制器中,多个外部中断可能共享同一个中断向量(例如,EXTI9_5_IRQn),因此需要在中断服务例程(ISR)中区分是哪个中断线触发了中断。对于PB6和PB7,它们都连接到EXTI9_5_IRQn中断向量。为了区分这两个中断,可以在ISR中检查相应的EXTI线标志位。

以下是如何为STM32F406配置PB6和PB7以分别响应外部中断的示例代码:

#include "stm32f4xx_hal.h"// 使能GPIOB时钟
#define GPIOB_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()// 定义PB6和PB7对应的中断线
#define USER_BUTTON_PIN6 GPIO_PIN_6
#define USER_BUTTON_PIN7 GPIO_PIN_7
#define USER_BUTTON_GPIO_PORT GPIOB// 中断优先级配置
void SystemClock_Config(void);
void MX_NVIC_Init(void) {// 优先级分组设置,抢占优先级和子优先级HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
}// 初始化EXTI中断
void EXTI_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;EXTI_HandleTypeDef EXTI_Config;// 使能GPIOB时钟GPIOB_CLK_ENABLE();// 配置PB6和PB7为中断源GPIO_InitStructure.Pin = USER_BUTTON_PIN6 | USER_BUTTON_PIN7;GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING; // 配置中断触发方式为下降沿触发GPIO_InitStructure.Pull = GPIO_NOPULL; // 不使用内部上拉或下拉GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(USER_BUTTON_GPIO_PORT, &GPIO_InitStructure);// 配置EXTI9_5_IRQn中断__HAL_RCC_SYSCFG_CLK_ENABLE();HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);// 初始化EXTI9_5_IRQn中断EXTI_Config.Line = EXTI_LINE_6 | EXTI_LINE_7; // 同时配置PB6和PB7EXTI_Config.Mode = EXTI_MODE_INTERRUPT;EXTI_Config.Trigger = EXTI_TRIGGER_FALLING;EXTI_Config.GPIOSel = GPIOB; // 选择GPIOB作为EXTI的端口HAL_EXTI_Init(&EXTI_Config);
}// EXTI9_5_IRQn中断服务例程
void EXTI9_5_IRQHandler(void) {if (__HAL_GPIO_EXTI_GET_IT(USER_BUTTON_PIN6) != RESET) { // 检查PB6是否触发中断__HAL_GPIO_EXTI_CLEAR_IT(USER_BUTTON_PIN6); // 清除中断标志位// PB6中断处理代码}if (__HAL_GPIO_EXTI_GET_IT(USER_BUTTON_PIN7) != RESET) { // 检查PB7是否触发中断__HAL_GPIO_EXTI_CLEAR_IT(USER_BUTTON_PIN7); // 清除中断标志位// PB7中断处理代码}
}int main(void) {// 初始化系统HAL_Init();SystemClock_Config();MX_NVIC_Init();EXTI_Config();// 主循环while (1) {// 其他任务}
}

在上述代码中,我们首先配置了PB6和PB7作为下降沿触发的外部中断源。接着,我们初始化了EXTI9_5_IRQn中断,并在中断服务例程EXTI9_5_IRQHandler中通过检查__HAL_GPIO_EXTI_GET_IT()宏来判断是PB6还是PB7触发了中断。一旦确定了触发中断的引脚,我们便清除中断标志位并执行相应的中断处理代码。

请注意,代码中的SystemClock_Config函数需要根据你的系统时钟配置进行实现,而MX_NVIC_Init函数用于初始化NVIC(嵌套向量中断控制器),设置中断优先级分组和中断优先级。

在实际应用中,您可能需要根据实际硬件连接和项目需求调整中断触发方式、中断服务函数的具体实现以及中断优先级设置。

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

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

相关文章

维修MAHLO / BR贝加莱5D5202.05工控机电脑 人机界面液晶显示屏

贝加莱5D5202.05触摸屏 我们的维修业务: AB、ABB、贝加莱、博世力士乐、霍尼韦尔、艾默生、伦茨、施耐德、西门子、AMAT、松下、三菱、NSK、安川、欧姆龙、日立、光洋、台达、基恩士、横河、东芝等 深圳捷达工控维修是一家专注于人机界面触摸屏的全球维修商&#…

vsCode 设置上下级文件夹目录分离展示?

默认情况下,vsCode目录文件夹会使用/合并展示在一行,这样视觉上看着并不直观,设置目录文件分离展示方法如下: 1、点击左下角设置图标,点击setting; 2、搜索栏输入compact; 3、取消勾选第一个选…

OV SSL证书年度成本概览:确保企业级安全的经济之选

随着网络安全意识的日益增强,SSL证书成为了网站安全的标配,尤其是对于企业而言,选择一款既能确保数据传输安全又符合预算的证书至关重要。在众多SSL证书中,组织验证型(Organization Validation,简称OV&…

互联网轻量级框架整合之装配Bean

依赖注入和依赖查找 应该说IoC的工作方式有两种,一种是依赖查找,通过资源定位,把对应的资源查找出来,例如通过JNDI找到数据源,依赖查找被广泛使用在第三方的资源注入上,比如在Web项目中,数据源往…

3588 pwm android12 的操作,包含 NDK native C++

问题: 客户需要在android12 的界面上操作板卡上的 PWM 蜂鸣器设备。 过程: 1 了解一下 3588 android12 源码的 关于PWM 的驱动。 设备树找不到 pwm 但是, 还不知道,android12 最终包含的 设备树是哪个,但是经过我的…

Gone框架介绍17 - 创建一个可运行在生产环境的Web项目

gone是可以高效开发Web服务的Golang依赖注入框架 github地址:https://github.com/gone-io/gone 文档原地址:https://goner.fun/zh/guide/auto-gen-priest.html 请帮忙在github上点个 ⭐️吧,这对我很重要 ;万分感谢!&a…

ReentrantLock和 synchronized

文章目录 Lock 接口和synchronized的区别Lock 接口和synchronized 对比它有什么优势 Synchronizedsynchronized 底层实现原理sychronized 的自旋锁、偏向锁、轻量级锁、重量级锁synchronized 锁升级 ReentrantLockLock 接口的主要方法ReadWriteLock 读写锁 Lock 接口和synchron…

【Unity-Timeline进度条显示与拖动】

利用Unity 自带的Timeline 可轻松实现场景的巡检漫游效果, 基本使用参考以下链接: Unity中的Timeline Unity学习笔记——TimeLine的简单使用方法(一) 这里主要介绍如何通过滑动条控制播放的进度,效果图附上。 话不多说&#xff…

Minecraft 我的世界服务器Java版开服联机教程

本教程使用Paper核心开服 1、进入控制面板 1.2、第一次购买服务器会安装游戏端,大约5分钟左右,如果长时间处于安装状态请联系客服 2、开启服务器 2.1、等待出现同意Minecraft EULA 协议时,点击“我接受” 2.2、等待running出现服务器就打开了…

【C++】 C++ 编写 鸡兔同笼程序

文章目录 “鸡兔同笼”问题是一个经典的数学问题,要求根据总头数和总腿数来计算鸡和兔的数量。假设鸡有 2 条腿,兔有 4 条腿。可以通过以下步骤求解这个问题: 1 .设鸡的数量为 x,兔的数量为 y。2.根据题意,我们有以下…

vue 微信小程序 uniapp 微信头像上传裁剪功能

效果如图&#xff1a; 操作流程&#xff1a; 个人中心–点击设置头像–选择图片-裁剪–选取–上传 template <view class"meilan" style"position: relative;"><u-row justify"space-between"><u-col span"3">设置头…

Lua 协程池

协程池 在 使用 Lua 协程模拟 Golang 的 go defer 编程模式 中介绍了 Lua 协程的使用&#xff0c;模仿 golang 封装了下 还可以做进一步的优化 原来的 go 函数是这样实现的&#xff1a; function go(_co_task)local co coroutine.create(function(_co_wrap)_co_task(_co_w…

nn.BatchNorm中affine参数的作用

在PyTorch的nn.BatchNorm2d中&#xff0c;affine参数决定是否在批归一化&#xff08;Batch Normalization&#xff09;过程中引入可学习的缩放和平移参数。 BN层的公式如下&#xff0c; affine参数决定是否在批归一化之后应用一个可学习的线性变换&#xff0c;即缩放和平移。具…

冒险岛vcruntime140_1.dll无法继续执行代码要怎么处理?教你一键修复vcruntime140_1.dll

当你在玩着冒险岛的时候&#xff0c;突然弹出一个vcruntime140_1.dll无法继续执行代码&#xff0c;这时候你是不是一脸懵逼&#xff1f;不知道怎么去解决&#xff1f;其实不需要担心&#xff0c;这是一个小问题&#xff0c;vcruntime140_1.dll文件是一个非常常用的dll文件&…

STM32最小系统

组件描述主控芯片STM32F103C8T6等时钟源外部晶体振荡器或者陶瓷谐振器&#xff0c;通常在4MHz到25MHz之间复位电路包括复位按钮和复位电路&#xff0c;用于将单片机置于初始状态电源电路提供稳定的电压&#xff0c;通常为3.3V或5V编程/调试接口SWD接口或JTAG接口等&#xff0c;…

2024第十五届蓝桥杯C++大学A组压轴题解:封印宝石

题目&#xff1a;第十五届蓝桥杯C大学A组省赛压轴题 题目传送门 题意&#xff1a;将n个数放在n个位置上&#xff0c;每个数只能放在它自己之前的位置上&#xff0c;且离自己多远就花费多少代价&#xff0c;可以有没放的数&#xff0c;给出最大代价要求最后放的数排成的字典序…

JavaScript基础知识强化:变量提升、作用域逻辑及TDZ的全面解析

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 ⭐️ 引言&#x1f3af; 变量提升(Hoisting)&#x1f47b; 暂时性死区&#xff08;Temporal Dead Zone, TDZ&#xff09;解释&#x1f4e6; var声明&#x1f512; let与const声明&#x1f4d6; 函数声明 与 函数表达式函数声…

JavaScript-BOM编程

BOM对象 1 什么是BOM2 window对象的常见属性3 window对象的常见方法4 通过BOM编程控制浏览器行为演示5 通过BOM编程实现会话级和持久级数据存储 1 什么是BOM BOM是Browser Object Model的简写&#xff0c;即浏览器对象模型。 BOM由一系列对象组成&#xff0c;是访问、控制、修…

【网络安全】【Frida实战案例】某图xx付费功能逆向分析(二)

文章目录 一、目标应用二、环境三、步骤1、重打包2、运行打包后apk3、找到签名信息&#xff08;1&#xff09;、查看apk签名信息&#xff08;2&#xff09;、hook Android方法获取apk签名信息&#xff08;3&#xff09;、转为md5验证 4、hook apk签名信息 四、总结五、相关源码…

Learn Next.js(浅全栈)

Learn Next.js 中文教程