gpt4 book ai didi

c - STM32F4 nucleo 上的 HAL 驱动程序删除/读/写闪存

转载 作者:太空宇宙 更新时间:2023-11-04 06:16:01 36 4
gpt4 key购买 nike

uint32_t PAGEError = 0;
FLASH_EraseInitTypeDef EraseInitStruct;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS ;
EraseInitStruct.Sector = FLASH_SECTOR_0;
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;

HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, 0x08000000, counter)
HAL_FLASH_Lock();

counter2 = *(__IO uint32_t *)0x08000000;
counter3 = *(__IO uint32_t *)0x08000001;
counter4 = *(__IO uint32_t *)0x08000002;

sprintf(buf, "%d", counter2); //gets send to the OLED with I2C
sprintf(buf2, "%d", counter3);
sprintf(buf3, "%d", counter4);

我想将变量counter写入flash,然后读取为counter2。第一个闪存扇区从 0x08000000 开始。

counter234 通过 OLED 屏幕显示。显示 counter2 有效并向我显示 counter-1 的值,但它只有效一次。如果我再次写入闪存,似乎什么也没有发生。

counter3counter4 根本不起作用。

counter=0x00000008 删除闪存但未写入任何内容后 OLED 上的输出:

counter2: 536873624
counter3: -652214262
counter4: 31006720

写入和重置后:

counter2: 8
counter3: -654311424
counter4: 30998528

这是怎么回事?有人能告诉我为什么所有变量都会改变吗?我必须配置链接器吗?

最佳答案

我现在会把你当作初学者,但如果你不是初学者,我会说对不起。

STM32 设备在 0x08000000 上有闪存,通过删除这个扇区,您在启动时失败了,因为您删除了 CPU 加载指令的实际部分。

当您尝试删除扇区时,您没有指定要删除的多少扇区。

计数器读取错误。因为你有 uint32_t 变量,你必须在读数之间做 4 个字节,比如:

counter2 = *(__IO uint32_t *)0x08000000;
counter3 = *(__IO uint32_t *)0x08000004;
counter4 = *(__IO uint32_t *)0x08000008;

正确的删除如下图。

EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
EraseInitStruct.Sector = FLASH_SECTOR_0; //Specify sector number
EraseInitStruct.NbSectors = 1; //This is also important!
if(HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK) {
//Erase error!
}

所以,找出你的程序有多长,并在你的程序之后在扇区中进行操作。

您可以在 STM32CubeF4 包中找到 EraseProgram 的示例。

STM32Cube_FW_F4_V1.16.0\Projects\STM324x9I_EVAL\Examples\FLASH\FLASH_EraseProgram\Src\main.c

概念也适用于您的 nucleo,只需确保您设置正确的闪存删除地址即可。

关于c - STM32F4 nucleo 上的 HAL 驱动程序删除/读/写闪存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45574246/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com