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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:15:11