中断系统与外部中断EXTI

发布时间:2026/7/10 6:20:06

中断系统与外部中断EXTI
1、中断的概念中断在主程序运行过程中出现了特定的中断触发条件中断源使得CPU暂停当前正在运行的程序转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行。它基于ARM Cortex-M内核的NVIC嵌套向量中断控制器支持复杂的中断嵌套和灵活的优先级管理。中断优先级当有多个中断源同时申请中断时CPU会根据中断源的轻重缓急进行裁决优先响应更加紧急的中断源。中断嵌套当一个中断程序正在运行时又有新的更高优先级的中断源申请中断CPU再次暂停当前中断程序转而去处理新的中断程序处理完成后依次进行返回。中断的作用提高系统运行的实时性。2、中断的执行流程3、NVIC中断优先级分组GD32F303支持配置抢占优先级和子优先级各中断都有自己的优先级IP寄存器CUP内部共240个4位5组优先级只使用了优先级寄存器IP的高四位4 ~ 7位由两部分构成分别对应高位的抢占优先级和低位的子优先级。Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0使用未使用两部分各占几位统一由CPU里的AIRCR寄存器来设置优先级分组抢占优先级子优先级高四位描述0(7)0级0 ~ 15级0bit用于抢占优先级4bit用于子优先级1(6)0 ~ 1级0 ~ 7级1bit用于抢占优先级3bit用于子优先级2(5)0 ~ 3级0 ~ 3级2bit用于抢占优先级2bit用于子优先级3(4)0 ~ 7级0 ~ 1级3bit用于抢占优先级1bit用于子优先级4(3)0 ~ 15级0级4bit用于抢占优先级0bit用于子优先级寄存器名称寄存器描述ISER中断使能寄存器每一位对应一个中断ICER中断禁能寄存器每一位对应一个中断ISPR中断挂起寄存器每一位对应一个中断ICPR中断清除寄存器每一位对应一个中断IABR中断活动状态寄存器IP中断优先级寄存器8位宽,240个STIR软触发中断寄存器CPUIDCPUID寄存器ICSR中断控制及状态寄存器VTOR向量表偏移量寄存器AIRCR应用程序中断及复位控制寄存器......CPACR协处理器访问控制寄存器NVIC硬件结构抢占优先级高的可以中断嵌套子优先级高的可以优先排队抢占优先级和子优先级均相同的按中断号排队。数值越小优先级越高。设计抢占优先级目的是当前中断服务函数还未执行完又产生了新的中断需要判断是否暂停当前中断去执行新的中断服务函数。设计子优先级目的是①只有在两个中断同时发生抢占优先级相同时才起作用数值越小优先执行。②如果两个中断的抢占优先级相同子优先级高的中断不能打断子优先级低的中断。编号是硬件定义好的不可改变。4、EXTI外部中断①EXTI简介EXTI可以监测指定GPIO口的电平信号当其指定的GPIO口产生电平变化时EXTI将立即向NVIC发出中断申请经过NVIC裁决后即可中断CPU主程序使CPU执行EXTI对应的中断程序。EXTI提供3种触发类型上升沿触发下降沿触发和任意沿触发。所有GPIO口都可以但相同的Pin不能同时触发中断。②EXTI硬件结构③EXTI触发源④硬件触发硬件触发被用来检测外部或内部信号的电压变化。软件需要按如下步骤配置来使用这项功能1. 根据应用需要配置 AFIO模块中的EXTI 触发源2. 配置EXTI_RTEN寄存器和EXTI_FTEN寄存器以使能相应引脚的上升沿或下降沿检测软件应当同时配置引脚对应的 RTENx和FTENx位以检测该引脚上升沿和下降沿的变化3. 通过配置引脚对应的 EXTI_INTEN 或 EXTI_EVEN位使能中断或事件4. EXTI 开始检测被配置的引脚上的电平变化当这些引脚上期望的变化被检测到时使能的中断或事件将被触发。如果为中断触发则对应的PD位将立刻被置1如果为事件触发则对应的 PD位不被置1。软件需要响应该中断或事件并清除相应PDx位。⑤软件触发按照如下步骤软件也可以触发 EXTI中断或事件1. 配置对应的 EXTI_INTEN 或 EXTI_EVEN位使能中断或事件配置EXTI_SWIEV寄存器的对应SWIEVx位使能的中断或事件将被立即触发。如果为中断触发则对应的PD位将立刻被置1如果为事件触发则对应的PD位不被置1。软件需要响应该中断或事件并清除相应PDx位。⑥代码编写1.初始化GPIO:①使能GPIO时钟;②输入模式;2.初始化EXTI:①使能EXTI时钟;②配置I/O连接到EXTI线;③配置上升/下降沿;④清除标志;⑤使能中断。#include stdint.h #include gd32f30x.h #include led_driver.h #include key_exti.h static void GpioInit(void) { /*使能GPIO的时钟*/ rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOG); /*配置按键的IO为浮空输入模式*/ gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, GPIO_PIN_0); //KEY1 gpio_init(GPIOG, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, GPIO_PIN_13); //KEY2 gpio_init(GPIOG, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, GPIO_PIN_14); //KEY3 gpio_init(GPIOG, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, GPIO_PIN_15); //KEY4 } static void ExtiInit(void) { /* 使能EXTI时钟 */ rcu_periph_clock_enable(RCU_AF); /* 配置EXTI0 */ /* 配置I/O连接到EXTI0线 */ gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_0); /* 配置上升/下降沿 */ exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING); /* 清除标志 */ exti_interrupt_flag_clear(EXTI_0); /* 使能中断 */ nvic_irq_enable(EXTI0_IRQn, 1, 1); /* 配置EXTI13 - EXTI15 */ /* 配置I/O连接到EXTI13 - EXTI15线 */ gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOG, GPIO_PIN_SOURCE_13); gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOG, GPIO_PIN_SOURCE_14); gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOG, GPIO_PIN_SOURCE_15); /* 配置上升/下降沿 */ exti_init(EXTI_13, EXTI_INTERRUPT, EXTI_TRIG_FALLING); exti_init(EXTI_14, EXTI_INTERRUPT, EXTI_TRIG_FALLING); exti_init(EXTI_15, EXTI_INTERRUPT, EXTI_TRIG_FALLING); /* 清除标志 */ exti_interrupt_flag_clear(EXTI_13); exti_interrupt_flag_clear(EXTI_14); exti_interrupt_flag_clear(EXTI_15); /* 使能中断 */ nvic_irq_enable(EXTI10_15_IRQn, 1, 1); } void KeyExtiInit(void) { GpioInit(); ExtiInit(); } void EXTI0_IRQHandler(void) { /* 清除标志 */ exti_interrupt_flag_clear(EXTI_0); TurnOnLed(LED1); } void EXTI10_15_IRQHandler(void) { if(SET exti_interrupt_flag_get(EXTI_13)) { /* 清除标志 */ exti_interrupt_flag_clear(EXTI_13); TurnOnLed(LED2); } if(SET exti_interrupt_flag_get(EXTI_14)) { /* 清除标志 */ exti_interrupt_flag_clear(EXTI_14); TurnOnLed(LED3); } if(SET exti_interrupt_flag_get(EXTI_15)) { /* 清除标志 */ exti_interrupt_flag_clear(EXTI_15); TurnOffLed(LED1); TurnOffLed(LED2); TurnOffLed(LED3); } } #ifndef _KEY_EXTI_H_ #define _KEY_EXTI_H_ void KeyExtiInit(void); #endif /* __KEY_EXTI_H__ */5、启动流程按键如何触发进入到中断中单片机上电以后首先从Reset_Handler开始执行Reset_Handler也是一种中断属于内核的一种异常。CPU执行时会用到一些内部寄存器特别重要的一个寄存器就是R15又叫PC寄存器在CPU执行过程中该32位寄存器始终保存着下一条要执行机器码的存储地址。使用查看编译生成的.map文件该文件内有很多编译信息在编译信息中可以找到Reset_Handler的起始地址。该部分代码作用是分配中断服务函数的起始地址DCD是告诉编译器编译时预留四字节的固定空间用于存放中断函数的起始地址。每一个中断都有一个唯一中断号。6、bin文件bin文件是最终烧录进单片机的程序。①生成bin文件设置输出文件的名字为ARM。设置编译后生成bin文件fromelf --bin --output .\Objects\ARM.bin .\Objects\ARM.axf·生成的文件可以在Objects文件夹中②解析bin文件找到JLINK安装路径打开J-Flash V7.58a打开后点击叉号生成的bin文件拖进J-Flash V7.58a中起始地址设置为0x08000000设置4字节对齐可以看到Reset_Handler的起始地址0x0800015f是B.对应的起始地址结合.map文件同样可以找到其他中断函数的入口地址比如EXTI0_IRQHandler中断向量表可查看数据手册160页有详细的向量编号、向量地址说明7、中断常见BUG①使能了中断未实现中断服务函数会怎么样所有的中断如果没有实现函数代码都会在发生中断时进入执行到.s文件的335行 B .代码其实这个代码也是中断服务函数上面的就是函数的名字所有中断函数代码都是B .这些函数是弱函数如果我们自己没有实现就会使用自带的这些函数。②中断标志不清除会怎么样如果不清除中断标志位就会一直触发中断执行这个中断服务函数。③中断抢占void EXTI0_IRQHandler(void) { /* 清除标志 */ exti_interrupt_flag_clear(EXTI_0); ToggleLed(LED1); //while (1); // 如果此时KEY1又再次按下是不会再次进入这个函数的因为自己不能抢占自己优先级是一样的 DelayNms(5000); // 如果在此期间KEY1又再次按下会等延时函数执行完会再次进入到本函数执行第二次对应的硬件中断 }

相关新闻

Java计算机毕设之智能化商超收银折扣核算管理系统的设计与实现 基于 SpringBoot 的商场动态折扣更新管理系统(完整前后端代码+说明文档+LW,调试定制等)

Java计算机毕设之智能化商超收银折扣核算管理系统的设计与实现 基于 SpringBoot 的商场动态折扣更新管理系统(完整前后端代码+说明文档+LW,调试定制等)

2026/7/8 3:12:49

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Claude Code + IDEA 的沉浸式编程方案

Claude Code + IDEA 的沉浸式编程方案

2026/7/9 7:18:05

一、Claude Code介绍 Claude Code 是 Anthropic 推出的面向开发者的 AI 编程协作工具,与传统的Chat模式不同,Claude Code是一个能读项目、懂上下文、遵守约束的 AI 编程搭档。 Claude Code 核心目标是理解你的整个项目,并参与到真实的编码、…

【Jetson】YOLOv8环境搭建与TensorRT加速部署

【Jetson】YOLOv8环境搭建与TensorRT加速部署

2026/7/8 2:29:02

一、前言 在 Jetson 平台上开发 YOLO 系列模型时,使用 Conda 虚拟环境可以有效隔离依赖冲突。Miniforge 作为 Conda 的轻量级替代品,对 ARM 架构(aarch64)兼容性更佳。本教程将完成 YOLOv8 的 GPU 加速推理,并进一步实…

Agentic OS 源码安装指南:Rust+Node.js双栈协同部署

Agentic OS 源码安装指南:Rust+Node.js双栈协同部署

2026/7/10 6:11:01

1. 项目概述:Agentic OS 不是“操作系统”,而是智能体协作的底层运行时你点开这个标题,第一反应可能是:“Agentic OS?这又是个什么新出的操作系统?要装在裸机上还是虚拟机里?”——我第一次看到…

LingBot-Depth 2.0突破机器人视觉瓶颈:透明物体与边界结构深度估计

LingBot-Depth 2.0突破机器人视觉瓶颈:透明物体与边界结构深度估计

2026/7/10 6:11:01

如果你正在开发机器人视觉应用,一定遇到过这样的困境:传统深度相机在玻璃、镜面等透明反光物体面前几乎"失明",而基于RGB图像的深度估计算法在边缘细节和远距离精度上又难以满足实际需求。这正是机器人从实验室走向真实世界的核心瓶…

科技赋能网约房治理:智能锁如何实现合规核验与无人化降本运营

科技赋能网约房治理:智能锁如何实现合规核验与无人化降本运营

2026/7/10 6:11:01

随着国内网约房、分散式民宿行业监管体系日趋完善,“实名登记、人证一致、权限可控、全程溯源”成为行业合法经营的硬性标准。传统民宿依靠人工登记、纸质备案、固定密码开锁、线下钥匙交接的运营模式,普遍存在核验漏洞多、治安隐患大、权限管控混乱、人…

AI赋能JVM调试:从传统监控到智能诊断的10倍效率革命

AI赋能JVM调试:从传统监控到智能诊断的10倍效率革命

2026/7/10 6:11:01

1. 项目概述:当AI遇见JVM调试作为一名在Java后端领域摸爬滚打了十多年的老兵,我几乎每天都要和JVM打交道。从早期的-Xms、-Xmx手动调优,到后来借助各种监控工具(如VisualVM, JProfiler)进行性能分析,再到如…

从分类分级到列级管控:金融机构如何补齐敏感数据治理的数据库短板

从分类分级到列级管控:金融机构如何补齐敏感数据治理的数据库短板

2026/7/10 6:11:01

对金融机构来说,敏感数据治理的难点,往往集中在数据库侧。制度、规范、流程、边界安全产品,很多机构都已经具备。进入落地环节时,问题会迅速变得更加具体:哪些表、哪些字段存放了身份证号、手机号、银行卡号&#xff1…

靠谱的沈阳大平层装修口碑好的

靠谱的沈阳大平层装修口碑好的

2026/7/10 6:01:01

沈阳大平层装修行业痛点分析当前沈阳大平层装修领域面临着诸多技术挑战。在全案设计方面,设计与施工脱节的问题较为突出,普通装修公司设计师仅负责设计,交付施工后易出现增项、设计无法落地、影响实际使用等问题。数据表明,约 60%…

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

2026/7/9 19:40:56

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

6个月转型AI工程师:实战路径与核心技能

6个月转型AI工程师:实战路径与核心技能

2026/7/9 18:28:30

1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公…

YOLOv5模型剪枝与量化实战:边缘设备部署优化

YOLOv5模型剪枝与量化实战:边缘设备部署优化

2026/7/8 14:04:34

1. 项目背景与核心价值在计算机视觉领域,YOLOv5因其出色的实时检测性能成为工业界宠儿。但当我们尝试将其部署到边缘设备(如树莓派、Jetson Nano或手机终端)时,立刻会遇到两个致命问题:模型体积庞大(原始YO…

终极原神FPS解锁器完整指南:轻松突破60帧限制

终极原神FPS解锁器完整指南:轻松突破60帧限制

2026/7/10 0:00:42

终极原神FPS解锁器完整指南:轻松突破60帧限制 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 原神FPS解锁器是一款专为《原神》玩家设计的开源工具,通过先进的Wri…

YesPlayMusic:如何用高颜值播放器重塑你的网易云音乐体验?[特殊字符]

YesPlayMusic:如何用高颜值播放器重塑你的网易云音乐体验?[特殊字符]

2026/7/10 0:00:42

YesPlayMusic:如何用高颜值播放器重塑你的网易云音乐体验?🎵 【免费下载链接】YesPlayMusic 高颜值的第三方网易云播放器,支持 Windows / macOS / Linux :electron: 项目地址: https://gitcode.com/gh_mirrors/ye/YesPlayMusic…

从零实现红黑树:手写C++的set与map容器

从零实现红黑树:手写C++的set与map容器

2026/7/10 0:00:42

1. 项目概述:从STL容器到自研轮子在C的日常开发中,std::set和std::map是我们再熟悉不过的伙伴了。它们一个负责管理不重复的集合,一个负责维护键值对映射,底层都依赖一颗高效的红黑树来保证数据的有序性和操作的性能。但你是否曾想…