AT32F403avgt7 擦除片2 Flash失败求解---问题已解决!
本帖最后由 metco88 于 2023-8-10 09:56 编辑AT32F403AVGT7芯片 擦除片2 Flash(即地址0x8080000以上空间时)返回错误,擦除写入片1 Flash 地址0x8000000-0x807ffff时正常,程序中分别判断地址区别开2个地址的寄存器操作,但是还是一直没成功,有哪位朋友有碰到过类似问题,求教...
u8 FLASH_Erase(u32 adr)
{
if((adr>=0x08000000)&&(adr<=0x0807ffff))
{
FLASH->CTRL&=~(0X3F); //从新设置模式
FLASH->ADDR =adr; //写入地址
FLASH->CTRL|=1<<1; //擦除模式
FLASH->CTRL|=1<<6; //启动擦除
while(FLASH->STS&0x01); //当前操作正在进行
if(FLASH->STS&(1<<5)) //检查是否完成
{
FLASH->STS|=(1<<5); //清除完成标志
return 0; //操作成功
}
else
{
FLASH->STS=(1<<5); //清除完成标志
return 1; //操作失败
}
}
else
{
FLASH->CTRL2&=~(0X3F); //从新设置模式
FLASH->CTRL2|=1<<1; //擦除模式
FLASH->ADDR2 =adr; //写入地址
FLASH->CTRL2|=1<<6; //启动擦除
while(FLASH->STS2&0x01); //当前操作正在进行
if(FLASH->STS2&(1<<5))
{
FLASH->STS2|=(1<<5); //清除完成标志
return 0; //操作成功
}
else
{
FLASH->STS2=(1<<5); //清除完成标志
return 1; //操作失败
}
}
} 困扰2天的问题终于找出原因了,咨询官方与技术群群主都让我试试官方BSP中例程或者按照官方库来写,随后发现使用官方库操作也是出现同样的情况 ,参考官方的说明资料FAQ0048 《AT32F4xx内部闪存页擦除注意事项 》似乎也没发现有提到这个问题,苦恼中。。。却不经意看到论坛有个帖子咨询能否片内2个Bank同时编程操作,于似乎想到了什么,从新调试已一遍,发现当Bank1擦除烧写完成后FLASH->CTRL中的FPRGM依然是置高处于闪存编程状态,当擦除Bank2时Bank1还是处于闪存编程状态,由于2片不能同时处于编程状态,所以到Bank2操作时发生了错误! 随即我在代码中切换到Bank2擦除前加清除FLASH->CTRL=0x00后,操作擦除Bank2区域一切正常,没有发生错误了!至此应该就是这个坑了,可以结贴了{:lol:}
页:
[1]