请教大家,在STM32L431的板子上加入IAP升级引导工程后,原本APP程序中的flash擦写时,擦除总是出错,为什么?具体实验过的现象和疑问有:
如果是IAP程序的问题,但屏蔽掉flash操作功能部分,IAP+APP结构的程序,不管在线调试还是不在线都可以正常运行,这样IAP好像没有问题。
如果是flash擦写函数的问题,那么仅烧写APP程序时,又能正常操作flash。
试图修改IAP和APP两个工程的flash区域配置,两个工程不管有没有flash 交叉,都存在擦除失败的问题。
这问题到底在哪儿?
flash操作的函数如下,先擦除一页,再写数据:
void fsh_putbuf(uint32 adr, uint32 *buf, uint16 len) //每页写入都是从起始位置写
{
uint32_t prog_bit = 0;
DIS_INT;
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGSERR|FLASH_FLAG_WRPERR);
FirstPage = GetPage(adr);
NbOfPages = 1;
BankNumber = 1;
/* Fill EraseInit structure*/
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.Banks = BankNumber;
EraseInitStruct.Page = FirstPage;
EraseInitStruct.NbPages = NbOfPages;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
{
while (1)
{
// __set_FAULTMASK(1);//发出复位请求前,先把FAULTMASK 置位。防止从SYSRESETREQ 被置为有效,到复位发生器执行复位命令期间,处理器响应中断请求。
// HAL_NVIC_SystemReset();
}
}
//flash每次写入64bit,8个字节
uint64 d1;
uint64 d2;
if(len % 8==0){
len = len / 8;
}
else
{ len = len / 8+1;}
while(len--)
{
d1 = *(buf++);
d2 = *(buf++);
d1=d1|(d2<<32);
FLASH_Program_DoubleWord(adr, d1);
prog_bit = FLASH_CR_PG;
adr += 8;
}
if (prog_bit != 0)
{
CLEAR_BIT(FLASH->CR, prog_bit);
}
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGSERR|FLASH_FLAG_WRPERR);
HAL_FLASH_Lock();
EN_INT;
} |