STM32内部Flash写入失败,ErrorCode为136求助
STM32 Flash写入失败(错误码136)排查与修复
错误码136的含义
错误码136对应FLASH_ERROR_PGA(编程对齐错误),核心原因是你使用了FLASH_TYPEPROGRAM_QUADWORD(16字节编程)模式,但不符合该模式的对齐/数据长度要求,同时缺少Flash写入前的擦除操作。
代码问题分析
- 未擦除Flash扇区:STM32 Flash只能从1改写为0,写入前必须先擦除对应扇区(擦除会将扇区所有位设为1),否则无法写入。
- 编程模式不匹配:
FLASH_TYPEPROGRAM_QUADWORD要求写入地址16字节对齐、写入数据为16字节长度,而你仅传入1字节的uint8_t变量,触发对齐错误。 - 参数传递错误:QUADWORD模式需要传入16字节数据的指针,但你仅传入单字节变量的指针,数据长度不足。
修复方案
1. 完整修正代码
uint32_t writeval(uint32_t src_address){ uint8_t test = 1; FLASH_EraseInitTypeDef EraseInitStruct = {0}; uint32_t PageError = 0; HAL_FLASH_Unlock(); // 擦除目标地址所在的Flash页(需根据芯片手册调整页参数) EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; EraseInitStruct.PageAddress = 0x08008000; // 目标地址所在页起始地址 EraseInitStruct.NbPages = 1; // 擦除1个页 if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) { HAL_FLASH_Lock(); return HAL_ERROR; } // 使用单字节编程模式写入数据 if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, 0x08008000, test) != HAL_OK) { HAL_FLASH_Lock(); return HAL_ERROR; } HAL_FLASH_Lock(); return HAL_OK; }
2. 关键注意事项
- 扇区/页划分:不同STM32型号的Flash页大小(2KB/4KB/16KB等)和编号不同,需对照芯片手册确认
0x08008000对应的页起始地址和数量。 - 编程模式选择:单字节写入用
FLASH_TYPEPROGRAM_BYTE,半字(2字节)用FLASH_TYPEPROGRAM_HALFWORD,字(4字节)用FLASH_TYPEPROGRAM_WORD,16字节用FLASH_TYPEPROGRAM_QUADWORD,需匹配数据长度和对齐要求。 - 地址合法性:确认
0x08008000属于可写入的Flash区域,未被当前程序代码占用(避免覆盖程序导致崩溃)。
内容的提问来源于stack exchange,提问作者masterx
相关产品推荐
相关产品推荐

