如何让STM8中断正常工作:主循环连续运行时UART/ADC中断异常问题
STM8 常规运行模式下UART/ADC中断异常排查与可实现例程
核心认知偏差纠正
针对你遇到的“仅WFI模式下中断正常、常规运行仅能触发一次中断、初始化阶段提前调用RIM反而完全无法响应中断”的现象,核心是对STM8中断机制的几个常见认知误区与配置遗漏:
- 复位状态下CCR的优先级认知错误:STM8复位后CCR的I1、I0位固定为11,对应最高屏蔽等级(优先级3),而非你以为的低优先级状态。这个状态下所有软件优先级为0、1、2的外设中断都会被硬件屏蔽,根本无法打断主循环。而WFI指令的中断唤醒逻辑不经过CCR的屏蔽等级判断,只要外设中断使能打开、有请求就会触发唤醒,因此WFI下中断可正常工作。
RIM指令的功能认知偏差:RIM的实际作用是将CCR的I1、I0位清零,把CPU的屏蔽等级降到最低(优先级0),解除全局中断屏蔽,并不会“将主循环的中断优先级强制设为低”——实际上这个状态下CPU是全局开中断、可被所有中断打断的最高权限状态。如果在外设中断初始化完成前调用RIM,外设上电默认置位的中断标志会立刻触发中断,此时外设寄存器还未完成配置,会导致中断服务程序跳飞、触发非法指令异常,最终表现为完全无法响应正常中断。- 中断上下文的恢复异常:第一次中断触发时,硬件会自动将当前CCR的屏蔽等级值压入栈中,加载对应中断的软件优先级等级执行服务程序。如果中断服务程序漏清外设的中断标志位、或手动修改了CCR的I位,会导致中断退出后CCR状态异常,后续所有中断全部被拦截,表现为仅能触发第一次中断。
标准可运行配置流程
按照以下顺序配置,即可实现常规运行模式下的持续中断响应,无需依赖WFI等待:
- 基础外设初始化:完成系统时钟、UART、ADC的功能寄存器配置,在开启外设中断使能位之前,手动清除所有外设的默认中断标志位(如UART的RXNE标志、ADC的EOC标志)
- 中断优先级配置:通过ITC_SPR寄存器,将对应UART、ADC中断的软件优先级设为1或2级,确保中断请求可被最低屏蔽等级的CPU正常响应
- 最后调用
RIM指令开启全局中断,绝对禁止在外设配置完成前调用该指令 - 主循环正常执行业务逻辑即可,无需手动添加WFI、也无需手动修改CCR的优先级位
中断服务程序必做校验
所有UART、ADC的中断服务程序必须满足两个要求,否则会出现中断卡死、响应异常:
- 进入中断后第一时间清除对应的外设中断标志位,不要将清标志操作放到中断函数末尾,避免漏清导致重复触发
- 禁止在中断服务程序内手动修改CCR寄存器的I位,所有上下文的优先级恢复完全交给硬件自动完成,手动修改会直接破坏栈结构,导致程序跑飞
内容的提问来源于stack exchange,提问作者manny
相关产品推荐
相关产品推荐

