STM32L476RG HAL_FLASH_Program写入Flash失败:错误码0xA8求助
STM32L476RG HAL_FLASH_Program写入失败问题解答
1. 错误码0xA8对应的错误类型
十六进制0xA8是STM32L4 Flash多个错误标志的组合:
FLASH_ERROR_RDERR(读保护错误,0x80):访问了受读保护的区域FLASH_ERROR_WRPERR(写保护错误,0x10):尝试写入受写保护的区域FLASH_ERROR_PGSERR(编程序列错误,0x08):编程操作的流程不符合要求(比如地址无效、未正确擦除目标区域等)
核心触发原因是你写入的地址属于只读区域,进而引发了一系列保护类错误。
2. 需要修改的内容
(1)修正写入地址
你调用HAL_FLASH_Program时使用的0x1FFF7000属于系统Bootloader区域,该区域是出厂只读的,不允许用户写入。需要替换成你原本定义的主Flash区域地址0x080FFF10。
(2)修正擦除结构体的Page参数
EraseInitStruct.Page需要传入Flash页号,不是物理地址。STM32L4主Flash每页大小为2KB(FLASH_PAGE_SIZE = 0x800),页号计算公式为:
EraseInitStruct.Page = (Address - FLASH_BASE) / FLASH_PAGE_SIZE;
其中FLASH_BASE为0x08000000,针对0x080FFF10,计算出的页号为255。
(3)完善错误处理逻辑
在擦除或编程失败时,建议输出具体错误码,方便后续调试定位,比如:
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK) { uint32_t err = HAL_FLASH_GetError(); printf("Erase error: 0x%X\r\n", err); }
修改后的完整代码示例
static FLASH_EraseInitTypeDef EraseInitStruct; uint32_t PAGEError; uint32_t Address = 0x080FFF10; uint64_t data = 5; /* Unlock the Flash to enable the flash control register access */ HAL_FLASH_Unlock(); /* Erase the user Flash area*/ /* Fill EraseInit structure*/ EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; // 替换为计算后的页号 EraseInitStruct.Page = (Address - FLASH_BASE) / FLASH_PAGE_SIZE; EraseInitStruct.NbPages = 1; if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK) { uint32_t err = HAL_FLASH_GetError(); printf("Erase error: 0x%X\r\n", err); } /*Write into flash - 使用正确的主Flash地址*/ HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, data); if (status == HAL_OK) { printf("it works\r\n"); } else { uint32_t err = HAL_FLASH_GetError(); printf("Program error: 0x%X\r\n", err); } HAL_FLASH_Lock();
内容的提问来源于stack exchange,提问作者travellingMadness
相关产品推荐
相关产品推荐

