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

基于HAL库的STM32笔记(02)——中断

01.中断简介

在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。

生活中的例子:

  • 你正在客厅看书(主程序循环运行):
  • 突然门铃响了(触发中断源);
  • 你把书页折好标记位置(保存现场),放下书去开门(进入中断服务函数);
  • 和快递员拿完快递(处理中断业务);
  • 回到客厅,找到折痕书页,继续接着看书(恢复现场,返回主程序)。

02.NVIC — 嵌套中断控制器

NVIC (Nested Vectored Interrupt Controller),是全部 Cortex-M 系列内核自带的中断管理器,专门统筹所有内部 / 外部中断,负责处理多个中断同时触发、中断互相打断的执行顺序。

  • 接收外设发来的中断申请信号
  • 判断优先级,决定谁先执行
  • 支持嵌套,高优先级中断可以打断低优先级中断

03.优先级的分组

中断优先级寄存器总共只有4bit,抢占优先级位数 + 响应优先级位数相加必须=4,同时触发中断的三级判定顺序(抢占→子优先级→硬件中断向量号)。

分组名称抢占优先级位数抢占优先级取值范围响应优先级位数响应优先级取值范围
Group00 位固定 04 位0~15
Group11 位0~13 位0~7
Group22 位0~32 位0~3
Group33 位0~71 位0~1
Group44 位0~150 位固定 0

优先级判断规则(从高到低)

  • 抢占优先级(管打断):高抢占可以打断正在执行的低抢占中断
  • 响应优先级(管排队,不能打断):抢占相同时,响应高的先执行,但不能互相打断
  • 自然优先级:抢占和响应都相同时,按中断向量表编号排序(编号小的优先),无法互相打断(当正在进行的中断优先级比后来的优先级低,也不能被打断)。
  • 数值越小 = 优先级越高

参考:STM32F103的中文参考手册(9.1.2中断和异常向量)
中断向量表中可以看到,定义了一块固定的内存,以4字节对齐(32位),用于存放终端服务函数的首地址

04.EXTI——外部中断

EXTI(External interrupt/event controller)外部中断/事件控制器,管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

工作线路

参考:STM32F103的中文参考手册(9.2.2框架、9.2.5外部中断/事件线路映像)

中断(红色线路):由输入线到 NVIC 中断控制器,是一个产生中断的线路,信号流入到 NVIC 控制器内,进一步运行中断服务函数,实现功能。
事件(绿色线路):由输入线到脉冲发生器,是一条产生事件的线路,最终输出一个脉冲信号,不进入NVIC。(脉冲信号产生可以给其他外设电路使用,例如定时器,模拟数字转换器等,这样的脉冲信号一般用来触发 TIM 或者 ADC 开始转换。)

EXTI有20个中断/事件线,所有相同数字的引脚共用一条中断线,例如PA0和PB0共用一条中断线,一个中断线一次只能响应一个引脚的中断,当两个同时进入中断时,优先级高的先响应。

每个引脚有相应的中断号,0到4都有自己一一对应的中断号,5到9共用一个中断号,10到15共用一个中断号。

名称处理函数
EXTI0EXTI0_IRQHandler
EXTI1EXTI1_IRQHandler
EXTI2EXTI2_IRQHandler
EXTI3EXTI3_IRQHandler
EXTI4EXTI4_IRQHandler
EXTI9_5EXTI9_5_IRQHandler
EXTI15_10EXTI15_10_IRQHandler

相关函数

函数名功能说明
HAL_NVIC_SetPriority();设置中断优先级
HAL_NVIC_EnableIRQ();使能中断线
HAL_NVIC_DisableIRQ();禁止中断线
HAL_NVIC_GetPriority();获取中断优先级
HAL_NVIC_GetActive();获取中断线是否处于活动状态
HAL_GPIO_EXTI_Callback();中断通用入口函数,函数内部直接调用回调函数

05.配置参考

功能:PA7小灯一直闪烁,PB12为按键引脚控制PB0小灯反转。

先配置小灯为输出模式,然后按键为中断模式下降沿触发


要产生中断,必须先配置好并使能中断线。


先在while循环中写好PA7的输出


在HAL库中采用了一种弱函数机制,在HAL_GPIO_EXTI_Callback函数前有个__weak标记,表明这是个弱函数。弱函数可以被用户定义的同名函数覆盖,也就是说,如果用户定义了一个函数名为HAL_GPIO_EXTI_Callback,系统就不再编译有weak标记的函数。


找到HAL_GPIO_EXTI_Callback();函数并重写

源代码
链接: 百度网盘 请输入提取码 提取码: tiuk

http://www.jsqmd.com/news/1112829/

相关文章:

  • 从零开始手写一个协程库(三)
  • 【精通】SmartWriter v2.6:写作平台线上运营 — 监控告警、多租户隔离与成本治理深度实战
  • 低配手机如何畅玩高帧率游戏?一文看懂云手机背后的黑科技
  • 如何一键获取九大网盘真实下载链接?LinkSwift浏览器脚本终极指南
  • PostgreSQL 高频常用命令整理
  • ML模型服务化:从Notebook到生产环境的11个关键实践
  • rust 学习 match专项
  • 密码学Crypto-凯撒密码(经典移位密码)
  • CV极极极简发展史
  • Hive 内置函数
  • FastAPI:Python高性能API开发指南
  • Agent工程范式迁移:从确定性代码到非确定性大模型驱动的系统构建
  • 深度解析Whisky:macOS上Windows应用容器化的架构哲学
  • AI Coding 协作实践方案
  • 基础知识-互联网模型
  • 电气自动化专业:站在“绿牌”风口,解锁你的硬核职业版图
  • AI智能体能力评估新范式:从推箱子游戏看规划与推理的进化
  • 农贸市场快检室试剂采购:如何选择适配基层的快检耗材方案
  • JMeter消息队列压测全攻略:从方案设计到性能调优
  • MySQL数据库技术全解析:从SQL语法到实战应用的系统梳理
  • 如何从rand7生成rand5
  • 如何快速找回遗忘的压缩包密码:ArchivePasswordTestTool 完整指南
  • 创业者适合读EMBA吗?2026客观选型测评分析
  • 【无标题】小学期课设
  • 智能激活革命:KMS_VL_ALL_AIO如何彻底改变Windows和Office激活体验
  • utshell:新一代Rust实现的Bash兼容shell完全指南
  • 游戏开发教学方案
  • 成都专业的暖通商家有哪些
  • 基于STM32单片机WIFI云平台物联网 空气质量 烟雾温湿度PM2.5 1(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • Hive 的内置函数