【发布时间】:2021-09-23 18:49:57
【问题描述】:
谁能告诉我我做错了什么愚蠢的事情或理解?作为测试,我正在尝试将一个简单的数字写入闪存并检索它。成功后,我会将其扩展为 6 个有符号值。 我的设备是STM32L476RG
uint64_t data = 88;
Erase_Flash();
HAL_FLASH_Unlock();
Address = ADDR_FLASH_PAGE_256;
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FAST, Address, data) != HAL_OK)
serprintf("Error writing flash.");
HAL_FLASH_Lock();
uint8_t *flash_biases = (uint8_t*) (ADDR_FLASH_PAGE_256);
根据我所阅读的内容,我应该能够像我一样访问闪存。但它没有检索到我期望的值。
Erase_Flash() 函数如下所示:
void Erase_Flash() {
HAL_FLASH_Unlock();
/* Clear OPTVERR bit set on virgin samples */
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
/* Fill EraseInit structure*/
EraseInitStruct.TypeErase = FLASH_TYPEERASE_MASSERASE;
EraseInitStruct.Banks = FLASH_BANK_2;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK) {
serprintf("Error erasing flash.");
}
HAL_FLASH_Lock();
}
【问题讨论】:
-
您的设备的确切型号是什么?
-
你能发帖
Erase_Flash()吗?Address是uint32_t类型吗?在调用HAL_FLASH_Program()之前,Address的字节值是多少(应该是 0xFF)?闪存扇区是否受到读/写保护(检查选项字节)?闪存扇区真的没有使用吗(检查链接描述文件)? -
@rel 已发布!闪存部分未使用。同事编写的另一段代码在该值下运行良好。
-
@Tagli stm32L476RG,并经过编辑以反映它
-
就像@Tagli 已经在下面的答案中指出的那样,您可以使用
FLASH_Program_DoubleWord()或HAL_FLASH_Program()和FLASH_TYPEPROGRAM_DOUBLEWORD,检查:github.com/STMicroelectronics/STM32CubeL4/blob/master/Drivers/…。在快速编程模式下HAL_FLASH_Program()将第三个参数解释为指针!相当混乱。并非所有 STM32 变体都提供快速编程...另请参阅:RM0351 参考手册中的3.3.7 Flash main memory programming sequences。
标签: c stm32 flash-memory