因为项目需要,有一部分配置的数据需要保存到FLASH存储区。于是查看了官方的手册,STM32F429ZI是按照扇区划分,划分为Bank1和Bank2。其中每一个块又划分为12个扇区,4个16kb,1个64kb,7个128kb。我拟定将要存储的数据放到Bank1的第3个16kb的扇区中。即起始地址为0x08008000的FLASH位置。同时我也参考了官方的例程,但是擦除和写入数据过程均出现了很奇怪的问题。代码是用STM32CubemX生成,编译器是Keil5代码截取了关键部分和现象如下图。
- <div>//宏定义</div><div>#define FLASH_PAGE_ID_CARD ((uint32_t)0x08008000) </div><div>
- </div><div>
- </div><div>//定义要写入的数据和指向FLASH的指针</div><div>int text[10]= {1,2,3,4,5,6,7,8,9,10};</div><div>uint32_t *ID_card[10];</div><div>
- </div><div>//将指针指向FLASH的地址位置</div><div>for(int k=0;k<10;k++)
- {
- *ID_card[k] = NULL;
- ID_card[k] = (uint32_t *)(0x08008000+(k*4));
- }
- </div><div>
- </div><div>
- </div><div>//以下是循环读写擦除的代码</div><div>while(1)
- </div> {
- HAL_FLASH_Unlock(); //FLASH解锁
- EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; //只擦除模式
- EraseInitStruct.Sector = FLASH_PAGE_ID_CARD; //开头的闪存区
- EraseInitStruct.NbSectors = 1; //擦1页
- EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; //擦除电压在2.7-3.3V
- if(HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) //开始擦除页面
- {
- printf("存储区擦除失败\r\n");
- }
-
- for(int i=0;i<10;i++)
- {
- if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_PAGE_ID_CARD + (i*4),text[i]) !=HAL_OK)
- {
- printf("写入失败\r\n");
- }
- }
-
- for(int k=0;k<10;k++)
- {
- printf("原始数据为%d ",text[k]);
- printf("%p位置数据为%d\r\n",ID_card[k],*ID_card[k]);
- }
- HAL_FLASH_Lock(); //FLASH上锁
-
- HAL_Delay(5000);
-
- for(int i=0;i<10;i++)
- {
- text[i]++;
- }
- }
复制代码
这是串口打印的文件数据,除第一次擦除报错以外,其他的均没有报错,但是同时也除了第一次写入的数据是和逻辑一样,之后的数据写入也均出现了错误。也就是下载程序以后除了第一次写入正常以外,其他的写入都不对了。希望有人能为我解惑。
另外我还有一个问题想请教:
1.在F103系列,FLASH扇区都是1KB或者2KB一页,在F4中大小容量均变了,那么我写入一个数据就需要擦除16kb的大小吗?或者说是我需要单独留出16kb的大小来存放一部分配置文件吗?
代码不清楚我附上一张图
[url=][/url]
|
评分
查看全部评分
我知道,但是我就是在擦除过程中出问题了,擦除并没有擦掉这一个扇区。
另外,用示波器看看擦除过程中VDD的电压有什么变化?有没有明显掉电的情况?
评分
查看全部评分