当前位置: 首页 > article >正文

开启外部中断的标准步骤

步骤1初始化GPIOGPIO_InitTypeDef GPIO_InitStructure;// 1. 开启GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 2. 配置GPIO为输入模式通常是浮空输入或上拉输入GPIO_InitStructure.GPIO_PinGPIO_Pin_0;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU;// 上拉输入GPIO_Init(GPIOA,GPIO_InitStructure);步骤2配置AFIO将GPIO映射到EXTI线// 1. 开启AFIO时钟必须RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);// 2. 将PA0映射到EXTI0线GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);步骤3配置EXTI外部中断线EXTI_InitTypeDef EXTI_InitStructure;// 1. 选择中断线EXTI_InitStructure.EXTI_LineEXTI_Line0;// 对应PA0// 2. 选择模式中断模式或事件模式EXTI_InitStructure.EXTI_ModeEXTI_Mode_Interrupt;// 中断模式// 3. 选择触发方式上升沿、下降沿或双边沿EXTI_InitStructure.EXTI_TriggerEXTI_Trigger_Falling;// 下降沿触发// 4. 使能中断线EXTI_InitStructure.EXTI_LineCmdENABLE;// 5. 初始化EXTIEXTI_Init(EXTI_InitStructure);步骤4配置NVIC嵌套向量中断控制器NVIC_InitTypeDef NVIC_InitStructure;// 1. 设置中断分组一般在main函数开头设置一次NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 2位抢占优先级2位响应优先级// 2. 选择要使能的中断通道NVIC_InitStructure.NVIC_IRQChannelEXTI0_IRQn;// EXTI0中断通道// 3. 设置抢占优先级NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;// 4. 设置响应优先级也叫子优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority1;// 5. 使能中断通道NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;// 6. 初始化NVICNVIC_Init(NVIC_InitStructure);步骤5编写中断服务函数voidEXTI0_IRQHandler(void){// 1. 检查是否是EXTI0产生的中断if(EXTI_GetITStatus(EXTI_Line0)!RESET){// 2. 在这里写你的中断处理代码// 比如LED翻转、蜂鸣器响等// 3. 清除中断标志位非常重要EXTI_ClearITPendingBit(EXTI_Line0);}}NVIC是什么有什么作用NVIC全称Nested Vectored Interrupt Controller嵌套向量中断控制器可以把NVIC想象成中断系统的总管家主要负责以下几件事 中断使能/禁能就像一个总开关决定CPU是否响应某个中断即使EXTI配置好了如果NVIC没使能中断也不会执行 优先级管理最重要当多个中断同时发生时NVIC决定先处理谁// 高优先级中断比如紧急停机NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority0;// 低优先级中断比如按键扫描NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority2;优先级的作用抢占优先级可以打断正在执行的低优先级中断响应优先级同抢占优先级时先执行响应优先级高的中断嵌套管理支持高优先级中断打断低优先级中断处理完高优先级后自动返回低优先级继续执行中断向量表映射告诉CPU每个中断对应的处理函数在哪里比如EXTI0中断来了CPU就知道要去执行EXTI0_IRQHandler没有NVIC会怎样如果没有NVIC中断系统会一片混乱多个中断同时发生时不知道先处理谁重要的中断可能被不重要的打断中断来了CPU不知道该去哪执行代码完整示例代码// 外部中断初始化函数PA0下降沿触发voidEXTI0_Init(void){GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 1. 使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);// 2. 配置GPIOGPIO_InitStructure.GPIO_PinGPIO_Pin_0;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU;GPIO_Init(GPIOA,GPIO_InitStructure);// 3. 配置AFIO映射GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);// 4. 配置EXTIEXTI_InitStructure.EXTI_LineEXTI_Line0;EXTI_InitStructure.EXTI_ModeEXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_TriggerEXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmdENABLE;EXTI_Init(EXTI_InitStructure);// 5. 配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannelEXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;NVIC_InitStructure.NVIC_IRQChannelSubPriority1;NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_Init(NVIC_InitStructure);}// 中断服务函数voidEXTI0_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line0)!RESET){// 用户代码GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)));EXTI_ClearITPendingBit(EXTI_Line0);}}总结EXTI负责检测外部信号变化产生中断请求NVIC负责管理这些中断请求决定CPU何时、以何种优先级去处理多个中断的初始化代码// 在main函数开头设置一次NVIC分组整个程序只需要设置一次voidNVIC_Config(void){NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 2位抢占优先级2位响应优先级}// 初始化EXTI0PA0voidEXTI0_Init(void){GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 1. 使能GPIOA和AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);// 2. 配置PA0为上拉输入GPIO_InitStructure.GPIO_PinGPIO_Pin_0;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU;GPIO_Init(GPIOA,GPIO_InitStructure);// 3. 映射PA0到EXTI0GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);// 4. 配置EXTI0EXTI_InitStructure.EXTI_LineEXTI_Line0;EXTI_InitStructure.EXTI_ModeEXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_TriggerEXTI_Trigger_Falling;// 下降沿触发EXTI_InitStructure.EXTI_LineCmdENABLE;EXTI_Init(EXTI_InitStructure);// 5. 配置NVIC for EXTI0NVIC_InitStructure.NVIC_IRQChannelEXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;// 抢占优先级1NVIC_InitStructure.NVIC_IRQChannelSubPriority1;// 响应优先级1NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_Init(NVIC_InitStructure);}// 初始化EXTI2PE2voidEXTI2_Init(void){GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 1. 使能GPIOE时钟AFIO已经在EXTI0初始化时开启了这里不需要重复开启RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);// 2. 配置PE2为上拉输入GPIO_InitStructure.GPIO_PinGPIO_Pin_2;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU;GPIO_Init(GPIOE,GPIO_InitStructure);// 3. 映射PE2到EXTI2GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);// 4. 配置EXTI2EXTI_InitStructure.EXTI_LineEXTI_Line2;EXTI_InitStructure.EXTI_ModeEXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_TriggerEXTI_Trigger_Falling;// 下降沿触发EXTI_InitStructure.EXTI_LineCmdENABLE;EXTI_Init(EXTI_InitStructure);// 5. 配置NVIC for EXTI2NVIC_InitStructure.NVIC_IRQChannelEXTI2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority2;// 抢占优先级2比EXTI0低NVIC_InitStructure.NVIC_IRQChannelSubPriority0;// 响应优先级0NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_Init(NVIC_InitStructure);}// 如果需要EXTI3、EXTI4依此类推...// 主函数中调用intmain(void){NVIC_Config();// 先设置NVIC分组EXTI0_Init();// 初始化EXTI0EXTI2_Init();// 初始化EXTI2// EXTI3_Init(); // 如果需要while(1){// 主循环}}多个中断的服务函数// EXTI0的中断服务函数对应PA0voidEXTI0_IRQHandler(void){// 检查是否是EXTI0产生的中断if(EXTI_GetITStatus(EXTI_Line0)!RESET){// 处理PA0的中断// 比如LED1翻转GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)));// 清除中断标志EXTI_ClearITPendingBit(EXTI_Line0);}}// EXTI2的中断服务函数对应PE2voidEXTI2_IRQHandler(void){// 检查是否是EXTI2产生的中断if(EXTI_GetITStatus(EXTI_Line2)!RESET){// 处理PE2的中断// 比如LED2翻转GPIO_WriteBit(GPIOB,GPIO_Pin_6,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_6)));// 清除中断标志EXTI_ClearITPendingBit(EXTI_Line2);}}// EXTI3的中断服务函数如果需要voidEXTI3_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line3)!RESET){// 处理PE3的中断// ...EXTI_ClearITPendingBit(EXTI_Line3);}}// EXTI4的中断服务函数如果需要voidEXTI4_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line4)!RESET){// 处理PE4的中断// ...EXTI_ClearITPendingBit(EXTI_Line4);}}// 注意EXTI5-9共享一个中断服务函数voidEXTI9_5_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line5)!RESET){// 处理线5的中断EXTI_ClearITPendingBit(EXTI_Line5);}if(EXTI_GetITStatus(EXTI_Line6)!RESET){// 处理线6的中断EXTI_ClearITPendingBit(EXTI_Line6);}// ... 直到线9}// EXTI10-15共享一个中断服务函数voidEXTI15_10_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line10)!RESET){// 处理线10的中断EXTI_ClearITPendingBit(EXTI_Line10);}// ... 直到线15}NVIC分组只需要设置一次NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 整个程序只调用一次放在main函数最开头不能在每个中断初始化函数里重复调用每个中断线有自己的配置EXTI0用EXTI_Line0和EXTI0_IRQnEXTI2用EXTI_Line2和EXTI2_IRQn互不干扰共享中断线的处理方式如果你同时用了PE5和PE6它们都会进入EXTI9_5_IRQHandler需要在函数内分别判断voidEXTI9_5_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line5)!RESET){// PE5的处理EXTI_ClearITPendingBit(EXTI_Line5);}if(EXTI_GetITStatus(EXTI_Line6)!RESET){// PE6的处理EXTI_ClearITPendingBit(EXTI_Line6);}}时钟只需要开启一次AFIO时钟在第一个中断初始化时开启即可后面的不需要重复开但每个GPIO的时钟要分别开GPIOA、GPIOE等intmain(void){// 1. 设置NVIC分组只一次NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 2. 开启AFIO时钟只一次RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);// 3. 分别初始化各个中断EXTI0_Init();// PA0EXTI2_Init();// PE2EXTI3_Init();// PE3EXTI4_Init();// PE4while(1);}// 然后分别实现 EXTI0_IRQHandler、EXTI2_IRQHandler、EXTI3_IRQHandler、EXTI4_IRQHandler

相关文章:

开启外部中断的标准步骤

步骤1:初始化GPIO GPIO_InitTypeDef GPIO_InitStructure; // 1. 开启GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 2. 配置GPIO为输入模式(通常是浮空输入或上拉输入) GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_…...

无人机与手机照片POS信息提取工具|支持JPG批量读取与导出

温馨提示:文末有联系方式工具核心功能概述 本工具专为地理信息与航测工作者设计,可高效提取无人机航拍影像及普通智能手机拍摄的JPG照片中嵌入的POS(Position and Orientation System)元数据,涵盖经度、纬度、海拔、拍…...

7×24小时智能值守的企业微信AI智能客服系统源码

温馨提示:文末有资源获取方式为企业打造全天候、智能化的客户服务体系,基于PHP原创开发,源码获取方式在源码闪购网,深度集成企业微信,提供以下核心功能:全天候智能值守系统724小时自动响应客户咨询&#xf…...

罗克韦尔 1440-SCDB9FXM2通信电缆

1440-SCDB9FXM2 是罗克韦尔自动化旗下 Allen-Bradley 品牌,专为 1440 XM 系列设备状态监测模块设计的原厂专用串行通信电缆,是 XM 系统组态调试、现场运维的核心配件。一、产品特性专属原生适配:专为 XM 全系列设备状态监测模块(X…...

AI教材生成工具推荐,低查重率为教材质量保驾护航!

教材格式的复杂性一直困扰着许多编写者。比如说,标题的字体大小应该设定为多少?参考文献是按照GB/T7714标准还是应该遵循某些出版机构的独特规范?习题的排版是选择单栏,还是双栏更合适?这些不同的要求让人眼花缭乱&…...

手把手拆解工业级ISP算法源码

ISP算法源码 资料最齐全,全网最低,包含Cmodel执行文件,可读源代码等等。 也有骗子搞成号称有Cmodel执行文件注意甄别,甚至宝贝描述都是抄我的 也可以在xilinx平台例化图形界面,方便使用 功能涵盖: DPC坏点缺…...

考虑集流体的 Comsol sofc固体氧化物燃料电池仿真(温度场分布,气体分布,极化曲线

考虑集流体的 Comsol sofc固体氧化物燃料电池仿真(温度场分布,气体分布,极化曲线,性能曲线)凌晨三点盯着屏幕上的温度云图,我手里的冰美式已经见底。集流体的边缘区域突然出现一块诡异的低温区,…...

N 3 串口

一、串口UART:Unervisal Async Recveiver Transimitter,通用异步收发器。(全双工,串行)RXD:接收信号线TXD:发送信号线CH340:电平转换芯片单工:通信时,数据接收…...

513. 找树左下角的值-day16

本地要找出树的最后一行找到最左边的值。此时大家应该想起用层序遍历是非常简单的了,反而用递归的话会比较难一点。我们依然还是先介绍递归法。咋眼一看,这道题目用递归的话就就一直向左遍历,最后一个就是答案呗?没有这么简单&…...

DO-254通读--11.0 附加考虑

11.0 附加考虑 本节提供了前几节未涵盖的设计保证附加考虑事项的指南。申请人可酌情使用这些附加考虑来满足第2节至第9节的部分目标。任何附加考虑的使用均应征得审定机构的同意。 11.1 使用先前已开发的硬件 本节讨论与使用先前已开发的硬件相关的问题。指南包括对硬件修改…...

AI写教材的秘密武器!实现低查重教材生成的实用工具推荐

撰写教材现状及 AI 工具的作用 撰写教材的进度总是会在“慢节奏”中踩到许多雷区。本来框架和资料都已经齐备,却在内容写作上遭遇瓶颈——一句话反复琢磨半天,依旧觉得表达不够准确;章节之间的衔接,总是绞尽脑汁也找不到合适的语…...

内窥镜加热器如何选择红外LED加热光源

内窥镜加热器在医疗和工业领域中扮演着关键角色,特别是在低温环境下需要确保内窥镜的正常工作。选择合适的红外LED加热光源对于提高内窥镜的性能和可靠性至关重要。本文将从内窥镜加热方式的发展、红外LED光源的选择、内窥镜加热器的应用案例和方案,以及…...

Vivado FPGA输入时钟约束

## 40mhz时钟输入 set_property PACKAGE_PIN F17 [get_ports f_clk40mhz] set_property IOSTANDARD LVCMOS33 [get_ports f_clk40mhz] create_clock -period 25.000 -name f_clk40mhz -waveform {0.000 12.500} [get_ports f_clk40mhz]前两行是引脚约束,后一行是时…...

昆仑通态触摸屏485通讯恒压供水程序(一拖二)

昆仑通态触摸屏485通讯ABB做的恒压供水程序,不需要PLC 恒压供水一拖二程序 1.触摸屏程序MCGpro版本,也有优盘格式文件 2.有ABB变频器一拖二设置参数及接线图纸,(可不用触摸屏) 3.有CAD图纸,二次图,昆仑通态的触摸屏直接…...

高德地图车机版9.1.0.600087美化包

资源编号235_高德地图车机版9.1.0.600087正式版。 更新自定义dex版本至20260311。 全新自定义修改脚本,修复已知bug,增加稳定性。 支持悬浮/原包/共存_鹰眼预警/ai预测/红绿灯播报/变灯提醒/超速提醒/天气播报等 点我下载 ❗关于系统版本&#xff1…...

【最新】OpenClaw(Clawdbot)本地6分钟搭建及使用萌新步骤

【最新】OpenClaw(Clawdbot)本地6分钟搭建及使用萌新步骤。OpenClaw(Clawdbot/Moltbot)作为开源、本地优先的AI助理框架,凭借724小时在线响应、多任务自动化执行、跨平台协同等核心能力,成为个人办公与轻量…...

多策略混合的北方苍鹰优化算法:基于立方混沌与透镜反向学习的种群初始化及最差最优策略对比原始NG...

多策略混合改进的北方苍鹰优化算法--MATLAB 改进: 1、立方混沌和透镜反向学习初始化种群 2、最差最优反向策略和透镜反向学习 对比原始NGO算法江湖上优化算法多如牛毛,今儿咱们来盘一盘这个自带猛禽气质的北方苍鹰优化算法(Northern…...

米哈游 AI产品经理面试题精选:10道高频考题+答案解析(附PDF)

米哈游简介 米哈游(miHoYo)是全球领先的游戏开发公司,以《原神》《崩坏》系列闻名,技术实力雄厚且注重二次元文化。作为技术驱动型公司,米哈游在AI技术应用上走在行业前沿,尤其在游戏NPC智能交互、内容生成、玩家体验优化等方面有深度探索。AI产品经理岗位要求既懂技术又…...

深度拆解OpenClaw:引爆“赛博养虾”狂潮的技术内核、产业重构与暗面危机

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而…...

联想老机型无对应 BIOS 可下载?官方解答 + 操作建议全在这

不少使用联想老款电脑的用户都会遇到这样的困惑:想升级 BIOS 优化设备性能、解决硬件兼容问题,却在官方渠道翻遍了也找不到对应机型的 BIOS 安装包,不知道是操作方式不对,还是官方已停止相关支持,也不敢随意下载第三方…...

Java异常与事务回滚:从Throwable顶层继承到rollbackFor陷阱的深度解析

在Java企业级开发中,异常处理与事务管理是保障系统稳定性的两大基石。然而,许多开发者在面对Transactional注解的rollbackFor属性、try-catch块中的异常处理以及Java异常体系的顶层结构时,往往存在认知误区。本文将从异常体系的顶层父类出发&…...

小白收藏必备:快速掌握AI Agent主流设计模式,轻松入门大模型开发

本文介绍了AI Agent的几种主流设计模式,包括ReAct、Plan & Execute、ReWOO、LLM Compiler、反思与增强类架构以及LATS。通过分析这些模式的核心概念、工作原理、优缺点和典型应用场景,帮助初学者理解AI Agent的设计思路,为后续深入研究Cl…...

基于MATLAB的蚁群算法:二维与三维路径优化及可视化输出研究

基于matlab的蚁群优化路径算法,二维路径和三维路径优化。 输出可视化最优路径和距离迭代曲线。 数据可更换自己的,程序已调通,可直接运行。蚁群优化这玩意儿看着复杂,其实用Matlab玩起来还真挺有意思。咱今天不整那些虚头巴脑的理…...

3调度和上下文切换

第3章 调度和上下文切换 0. 导言:并发执行的幻觉 并发的本质:操作系统通过在处理器上频繁切换不同的任务,给用户造成多个任务“同时”处理的幻觉。核心机制:上下文切换。 步骤: 停止当前进程。保存足够的信息&#xff…...

debug记录

1、头文件重复包含。 包含链分析: bsp_Seg7.h:12 包含了 lks32mc45x_define.happ_Comm.h:3 包含了 lks32mc45x.h而 lks32mc45x.h 很可能也直接或间接包含了 lks32mc45x_define.h 关键问题: 我之前读取的 lks32mc45x_define.h 缺少头文件保护&#xf…...

BigIntegerBigDecimal

BigInteger 构造方法 常用第二个,第四个1. 例子2. 总结常见方法1. 总结BigDecimal构造方法 这种构造有可能不太精确:通过传递字符串表示的小数来创建对象:静态方法获取Bigdecimal 对象:常见方法RoundingMode.HALF_UP (…...

Agent长期记忆系统设计实战(非常详细),从架构原理到落地从入门到精通,收藏这一篇就够了!

在大多数Agent系统的开发中,对Memory的处理方式都比较简单直接,常见的两种实现方式: 方式一:直接保存历史对话,下次直接塞给大模型; 方式二:把对话内容放到向量库中,再次对话时通过…...

弧光保护装置定义

弧光保护装置的定义弧光保护装置是一种用于检测和快速切断电力系统中电弧故障的电气安全设备。其主要功能是通过监测电弧产生的光、电流或压力变化,在毫秒级时间内触发断路器或熔断器动作,以消除电弧危害,保护人员安全和设备完整性。核心功能…...

杰理芯片矩阵赋能音频升级:AC112N、AC1123A引领蓝牙6.0低功耗新潮流--云信通讯

在消费电子飞速迭代的今天,蓝牙耳机已成为人们日常出行、办公娱乐的必备单品,而蓝牙耳机芯片作为核心“心脏”,直接决定了耳机的连接稳定性、续航能力与音质表现。杰理科技深耕音频芯片领域多年,凭借强大的研发实力,推…...

供应链OpenClaw

别让“龙虾”困在实验室!实测实在Agent:供应链数字化的“暴力美学”与终极落地 【摘要】 2026年3月,OpenClaw(龙虾)的爆火让全行业看到了AI Agent接管桌面的可能。但在供应链这个“深水区”,光有开源的热情…...