小弟,最近在实验stm32 IAP。在实验过程中发现连续擦除片内Flash区域的时候会进入HardFault。刚开始使用的是for循环(Flash解锁和上锁的步骤我在其余代码部分已添加上):
case INSIDE_FLASH_APP_START_ADDR: /*擦除APP区域128Kbytes空间*/
{
for(i = 0; i < 64; i++)
{
if (FLASH_ErasePage(FlashAddress) == FLASH_COMPLETE)
{
FlashAddress += 2*1024;
}
else
{
return 1;
}
}
return 0;
}
我期望擦除的区域大小为128Kbytes,而stm32f107vct6的一个Page是2Kbytes,因此我需要连续擦除64次。但是当我全速运行时程序就会进入HardFault;如果我在for循环里单步执行则这段程序可以通过。 后来我不死心,直接将for循环替换成了擦64次:
erase_addr = INSIDE_FLASH_APP_START_ADDR;
FLASH_If_Unlock();
FLASH_ErasePage(erase_addr+0*2*1024);
FLASH_ErasePage(erase_addr+1*2*1024);
FLASH_ErasePage(erase_addr+2*2*1024);
FLASH_ErasePage(erase_addr+3*2*1024);
FLASH_ErasePage(erase_addr+4*2*1024);
FLASH_ErasePage(erase_addr+5*2*1024);
. . .
. . .
. . .
FLASH_ErasePage(erase_addr+60*2*1024);
FLASH_ErasePage(erase_addr+61*2*1024);
FLASH_ErasePage(erase_addr+62*2*1024);
FLASH_ErasePage(erase_addr+63*2*1024);
FLASH_If_Lock();
及时写成这样也还是会出现想通的问题,全速运行进入HardFault,单步执行可以通过,或者在这一长串的FLASH_ErasePage()函数之间多打几个断点,也可以通过。
恳请给位大神指点怎么破????在此先谢过了!! |