关于STM32F429ZIT6的FLASH擦除读写失败的问题。
因为项目需要,有一部分配置的数据需要保存到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= {1,2,3,4,5,6,7,8,9,10};</div><div>uint32_t *ID_card;</div><div>
</div><div>//将指针指向FLASH的地址位置</div><div>for(int k=0;k<10;k++)
{
*ID_card = NULL;
ID_card = (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) !=HAL_OK)
{
printf("写入失败\r\n");
}
}
for(int k=0;k<10;k++)
{
printf("原始数据为%d ",text);
printf("%p位置数据为%d\r\n",ID_card,*ID_card);
}
HAL_FLASH_Lock(); //FLASH上锁
HAL_Delay(5000);
for(int i=0;i<10;i++)
{
text++;
}
}
这是串口打印的文件数据,除第一次擦除报错以外,其他的均没有报错,但是同时也除了第一次写入的数据是和逻辑一样,之后的数据写入也均出现了错误。也就是下载程序以后除了第一次写入正常以外,其他的写入都不对了。希望有人能为我解惑。
另外我还有一个问题想请教:
1.在F103系列,FLASH扇区都是1KB或者2KB一页,在F4中大小容量均变了,那么我写入一个数据就需要擦除16kb的大小吗?或者说是我需要单独留出16kb的大小来存放一部分配置文件吗?
代码不清楚我附上一张图
https://www.stmcu.org.cn/module/forum/forum.php?mod=image&aid=451986&size=300x300&key=c6cadf6bde35d699&nocache=yes&type=fixnone
要先擦除才能写,最小擦除单位是Sector 陌路夕颜 发表于 2020-7-8 13:36
要先擦除才能写,最小擦除单位是Sector
我知道,但是我就是在擦除过程中出问题了,擦除并没有擦掉这一个扇区。 擦除失败时的错误码的什么?看看能提供什么信息?有打开写保护吗?
另外,用示波器看看擦除过程中VDD的电压有什么变化?有没有明显掉电的情况?
页:
[1]