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操作的规范。
具体解决步骤
修复寄存器操作的时序逻辑
必须在设置STRT后等待BSY位清零,确认Flash擦除完成后再执行后续操作:/* 设置STRT位启动擦除 */ FLASH->CR |= 0x00010000; /* 等待BSY位清零,确保擦除操作完成 */ while((FLASH->SR & 0x00010000) != 0); /* 之后再清除PER位 */ FLASH->CR &= ~0x00000002;优先使用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();调试注意事项
不要单步执行Flash擦写的启动指令,设置STRT后直接选择连续运行,或者在while(BSY)循环之后设置断点,避免单步调试时CPU尝试访问处于忙状态的Flash,导致异常。
内容的提问来源于stack exchange,提问作者TRPh
相关产品推荐
相关产品推荐

