2017-08-08 557 views
0
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); 

我想写变量计数器到闪存,然后读取它作为counter2。 第一个闪存扇区从0x0800 0000开始。STM32F4核上的HAL驱动程序擦除/读/写闪存

计数器2,3和4通过OLED屏幕显示。 显示计数器2的作品并显示计数器1的值,但它只能使用一次。如果我再次写入闪存,似乎没有任何事情发生。

counter3和counter4根本不工作。

输出的OLED当计数器= 0x00000008后,我已经删除了闪光灯,但不写任何东西:
计数器2:536873624
计数器3:-652214262
counter4:31006720

和书面方式和ressetting后:
计数器2:8
计数器3:-654311424
counter4:30998528

这是怎么回事?有人能告诉我为什么所有可变的变化? 我必须配置链接器吗?

+0

我知道HAL,因为它是我所看到的,但最可笑的图书馆之一,改变这种闪光位置不太聪明。 –

回答

1

我会把你当作乞丐,但如果你不是,我会说对不起。

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

概念也会对您的核蛋白,只要确保你的闪存擦除设置正确的地址。

+0

我已经放入.NbSectors,但现在它不会运行。 (是的,我是一个初学者) –

+0

因为您擦除了第一个实际程序代码执行的部门。 @AlexM。我告诉过你,查看最后的声明。 – tilz0R

+0

哈哈,这就是为什么我是初学者。现在它就像一个魅力,谢谢! –

0
  1. 最好的方法是在linkescriptr中创建Flash的新段并将数据放在那里。这是最安全的。

  2. 如果不知道链接器脚本,请创建一个包含一个段大小的表,并使用编译器指令将其放在闪存末尾。

  3. 如果你不知道,这两个我建议一个现成的STM EEPROM仿真例如从立方