STM32F1系列的FLASH模拟EEPROM前面4k地址被锁住问题

2019-12-10 18:33发布

现在有一个项目用的f1,程序分为boot(0x8000000)和app(0x8010000),因为boot有个bug,需要通过app的网络升级功能反向修改boot的代码,在升级过程中发现一个问题,擦除boot代码的时候用到了这么一个函数
void Flash_Clean(void)
{
        int i=0,j=0;
        FLASH_Status status = FLASH_COMPLETE;
        FLASH_Unlock();       
        printf("unlock ");
        delay_ms(500);
        for(i=0;i<20;i++)
        {       
                for(j=0;j<4;j++)
                {
                        FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
                        status=FLASH_ErasePage(0x08000000+0x800*i);
                        printf("%d,flash sta:%d ",i,status);

                        if(status!=FLASH_ERROR_WRP)
                        {
                                break;
                        }       
                }
        }
        FLASH_Lock();
}
log显示如下:
0,flash sta:3
0,flash sta:3
0,flash sta:3
0,flash sta:3
1,flash sta:3
1,flash sta:3
1,flash sta:3
1,flash sta:3
2,flash sta:4
3,flash sta:4
4,flash sta:4
5,flash sta:4
6,flash sta:4
7,flash sta:4
8,flash sta:4
9,flash sta:4
10,flash sta:4
11,flash sta:4
12,flash sta:4
13,flash sta:4
14,flash sta:4
15,flash sta:4
16,flash sta:4
17,flash sta:4
18,flash sta:4
19,flash sta:4
其中3是FLASH_ERROR_WRP,4是FLASH_COMPLETE,也就是说单片机前面4k读保护,多次擦写也没用,这是怎么回事?另外产品是批量的,这个问题也是批量产生的,并非个例。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。