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。
counter2,3并4通过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)
这里发生了什么?有人可以告诉我为什么所有变量都会改变吗?我必须配置链接器吗?
我现在将您视为初学者,但如果您不愿意,我会说声抱歉。
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也可以在您的核上工作,只需确保为擦除闪存设置正确的地址即可。