You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32WB55设置Flash STRT位后调试崩溃,报Failed to execute MI command

STM32WB55 Flash操作触发0xfffffffe崩溃的原因与解决方法

核心原因

STM32WB55的Flash在擦除/编程操作期间,CPU无法访问Flash存储器(擦写时Flash总线会被挂起)。你在设置STRT位启动擦除后,立刻单步执行下一条指令(这条指令本身存储在Flash中),直接触发总线错误,导致HardFault异常,最终跳转到默认错误处理地址0xfffffffe(该地址无程序代码,所以调试器提示无调试信息)。

同时你的代码存在明显的时序错误:设置STRT后没有等待Flash操作完成,就直接去修改CR寄存器,完全不符合STM32 Flash操作的规范。

具体解决步骤

  1. 修复寄存器操作的时序逻辑
    必须在设置STRT后等待BSY位清零,确认Flash擦除完成后再执行后续操作:

    /* 设置STRT位启动擦除 */
    FLASH->CR |= 0x00010000;
    /* 等待BSY位清零,确保擦除操作完成 */
    while((FLASH->SR & 0x00010000) != 0);
    /* 之后再清除PER位 */
    FLASH->CR &= ~0x00000002;
    
  2. 优先使用HAL库Flash API
    手动操作寄存器容易遗漏解锁、等待、错误处理等环节,建议直接用STM32 HAL库封装好的Flash操作函数,示例:

    FLASH_EraseInitTypeDef EraseInitStruct = {0};
    uint32_t PageError = 0;
    
    /* 解锁Flash */
    HAL_FLASH_Unlock();
    
    EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.Page = 0; // 目标擦除页号
    EraseInitStruct.NbPages = 1;
    
    /* 执行擦除,库函数自动处理等待、错误判断 */
    if(HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
    {
        // 此处添加擦除错误处理逻辑
    }
    
    /* 操作完成后锁定Flash */
    HAL_FLASH_Lock();
    
  3. 调试注意事项
    不要单步执行Flash擦写的启动指令,设置STRT后直接选择连续运行,或者在while(BSY)循环之后设置断点,避免单步调试时CPU尝试访问处于忙状态的Flash,导致异常。

内容的提问来源于stack exchange,提问作者TRPh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:33:31