• 正文
  • 相关推荐
申请入驻 产业图谱

J-Flash下载后忘了点Disconnect,MCU中断竟然全部失灵?

5小时前
115
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

J-Flash是嵌入式工程师常用的一个上位机软件,经常用于将hex/bin文件下载到MCU中。

最近在调试一块基于Cortex-M内核的板子时,我遇到一个非常诡异的问题: 用 J-Flash 通过 J-Link 下载完固件后,按一下板子上的 NRST 复位键,程序看起来“正常”运行:LED 在闪、串口在打印,但按键中断就是不响应。 更奇怪的是,只要在 J-Flash 里点一下 Disconnect,中断立刻恢复正常。 反复试了几次,现象稳定复现。这到底是怎么回事?

一、奇怪的现象

为了定位问题,我做了几组对比测试:

使用 Keil MDK 下载程序后,按 NRST 复位,程序运行正常,中断响应正常。

使用 J-Flash 下载后,执行 Target → Manual Programming → Start Application,程序运行正常,中断响应正常。

使用 J-Flash 下载后,先执行 Target → Disconnect,再按 NRST 复位,程序运行正常,中断响应正常。

使用 J-Flash 下载后,直接按 NRST 复位,程序运行异常,不响应中断,但非中断功能正常。此时在 J-Flash 中执行 Target → Disconnect,中断响应立即恢复正常。

使用 J-Flash 下载后,直接按 NRST 复位,程序运行异常;断电重新上电后,中断响应恢复正常。

所有现象都指向同一个结论:问题出在 J-Flash 下载后没有执行 Disconnect。

二、深入排查:C_MASKINTS 在捣鬼

Cortex-M 内核有一个调试控制寄存器 DHCSR(地址 0xE000EDF0),其中有一位叫 C_MASKINTS。当调试器处于连接状态时,可能会把这一位置 1。一旦置位,硬件就会屏蔽PendSV、SysTick、所有外部可配置中断。

也就是说,中断请求在到达 CPU 内核之前就被挡住了。

为了验证,我用 J-Link Commander 读取了出现异常情况时的DHCSR 寄存器,果然发现 C_MASKINTS 位被置为 1。

三、为什么 NRST 复位清不掉 C_MASKINTS?

C_MASKINTS 位不会因为NRST复位而被清除,它只由上电复位重置。所以当按NRST复位后,程序计数器(PC)虽然从头开始执行了,main 函数和 GPIO 初始化都正常跑起来了,但NVIC 发送的中断请求在到达内核时就被 C_MASKINTS 这个“阀门”挡住了,CPU 永远收不到中断信号。而点击 Disconnect 后,J-Link 会清理调试设置,C_MASKINTS 被清除,中断通路恢复。

你可能好奇:Keil MDK 同样是用 J-Link 连接,为什么 Debug 的时候中断一切正常? 原因是:Keil 在 Debug 状态下会主动管理 C_MASKINTS,确保程序运行时中断是开启的。所以用 Keil 下载、调试、复位,都不会踩到这个问题。

J-Flash 是一个强大的下载工具,但下载完成后别忘了 Disconnect。否则,C_MASKINTS 这个隐藏的“中断总开关”可能会让你的 MCU 陷入“假死”状态——程序在跑,中断却全部失灵。

相关推荐

TopSemic,让芯片使用更简单。 专注分享:嵌入式,单片机,STM32,ARM,RTOS,Linux, 软硬件,半导体,电子技术等相关内容。