HAL驱动程序在STM32F4核上擦除/读取/写入闪存

Ale*_* M. 0 c stm32f4

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);
Run Code Online (Sandbox Code Playgroud)

我想将变量计数器写入闪存,然后将其读取为counter2。第一个闪存扇区始于0x08000000

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

counter3而且counter4根本不工作。

counter=0x00000008我擦除闪光灯但未写任何内容后,在OLED上输出:

counter2: 536873624
counter3: -652214262
counter4: 31006720
Run Code Online (Sandbox Code Playgroud)

并写入并重置后:

counter2: 8
counter3: -654311424
counter4: 30998528
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?有人可以告诉我为什么所有变量都会改变吗?我必须配置链接器吗?

til*_*z0R 7

我现在将您视为初学者,但如果您不愿意,我会说声抱歉。

STM32设备一直亮着,0x08000000并且通过擦除该扇区,启动失败,因为从CPU加载指令中擦除了实际部分。

当你试图擦除扇区时,你没有指定多少扇区擦除。

读取计数器是错误的。由于您具有uint32_t变量,因此必须在两次读取之间进行4字节的操作,例如:

counter2 = *(__IO uint32_t *)0x08000000;
counter3 = *(__IO uint32_t *)0x08000004;
counter4 = *(__IO uint32_t *)0x08000008;
Run Code Online (Sandbox Code Playgroud)

正确的擦除如下所示。

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!
}
Run Code Online (Sandbox Code Playgroud)

因此,找出您的程序需要多长时间,然后在程序执行后在部门中进行操作。

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

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

Concept也可以在您的核上工作,只需确保为擦除闪存设置正确的地址即可。