你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在擦除flash时 同时挂起中断 是否会造成卡死以及相关的卡死机制

[复制链接]
rui41104 提问时间:2026-7-30 17:41 / 未解决

之前想试试看板卡卡死的原因是否是flash擦除的时候触发中断挂起正好卡死的 因为网上也看过很多相关的言论 于是实验 将flash擦除函数放在sram里执行 同时进行GPIO翻转

将flash擦除函数替换为

attribute((section(".RAM_CODE"))) void SRAM_ErasePageAndBlink(uint32_t pageAddr) { static uint32_t count = 0; count++;

// 启动页擦除 FLASH->CR |= FLASH_CR_PER; FLASH->AR = pageAddr; FLASH->CR |= FLASH_CR_STRT; // 改 TIM17 计数,让他触发 TIM17->CNT = TIM17->ARR;

// 改 DMA 计数,让他完成 NVIC_SetPendingIRQ(TIM17_IRQn); DMA2_Channel4->CNDTR = 1; TIM5->CNT = TIM5->ARR; if(count >= 10) { GPIOE->ODR ^= GPIO_PIN_5; count = 0; } while(FLASH->SR & FLASH_SR_BSY); FLASH->CR &= ~FLASH_CR_PER; }

这样计划是可以实现在擦除的时候把中断挂起 看看CPU会不会卡死 遗憾的是 PE5的LED会正常反转 flash正常擦除 同时这并不会导致CPU卡死 想了解一下平常所说的 擦除flash时触发中断会导致cpu卡死 到底是什么原因导致CPU卡死呢

在实验的时候发现这种操作挺危险的 处理不好很容易进hardfault 比如没有等待擦除完就直接执行指令

收藏 评论2 发布时间:2026-7-30 17:41

举报

2个回答
butterflyspring 回答时间:昨天 10:54
Flash 擦除/编程期间,只要 CPU还要访问正在忙的 Flash,就会发生 bus stall(总线停顿);代码取指、数据读取、向量表取址都会被阻塞,直到擦除/编程完成后才恢复执行。
如果想在 Flash擦写期间继续执行,必须把相关内容 全部放到 RAM,包括:

  • 启动擦写的代码
  • 所有相关中断处理函数
  • 中断向量表
否则即使你把中断处理函数和向量表搬到了SRAM,如果发起Flash 擦写的代码本身还在Flash 中,执行仍可能因为Flash 忙而停住。

主要风险是暂停/卡住/响应超时,而不是因为中断发生就必然运行错误
但在工程上,这种停顿仍然可能间接引发功能异常,例如:
   1.实时中断来不及处理
    2.通信超时
    3.看门狗喂狗不及时
    4. 控制环中断抖动或失步
这些属于 由长时间 stall 带来的系统级后果;

通常处理的方式有两类:
1. Flash 擦写期间禁用中断在编程/擦除期间关闭中断,避免中断打断后又去访问 Flash
2. 必须并行运行的代码全部搬到RAM
如果你必须在擦除期间继续响应某些中断,那么需要把下面内容都放到RAM
   Flash 擦写发起代码
    中断向量表
   
ISR
    ISR 调用到的函数,以及会访问的相关数据/常量


zhoupxa 回答时间:昨天 20:19

butterflyspring 发表于 2026-7-31 10:54
在 Flash 擦除/编程期间,只要 CPU还要访问正在忙的 Flash,就会发生 bus stall(总线停顿);代码取指、数 ...

上面所说的风险操作不能用于工程实践中,代码的执行不能阻断自己的后续执行

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版