APM32F407对第2扇区执行擦写操作,首次通电写入数据,数据数量16KB。每次这4个地址数据都不对,下面是错误信息,存储一个二维数组,每组2字。
cvf enc err [url=home.php?mod=space&uid=72445]@[/url] [1536][0]:: REQ=80A86B9E :: ROM=C9077731
cvf enc err @ [1536][1]:: REQ=80A86B9E :: ROM=CCD61B08
cvf enc err @ [1537][0]:: REQ=0D00A6F0 :: ROM=9179A04B
cvf enc err @ [1537][1]:: REQ=0D00A6F0 :: ROM=8658FBA2
奇怪的是,这段程序执行后对写入数据进行读回校验都是对的。但程序运行过程中再次读取验证,这4字就一直是错误的。
代码如下:
void cvf_handle(void)
{
int group;
HAL_StatusTypeDef hal_st;
cvf_check_alloc();
// enc opt
cvf_enc_rom_addr_make(0, 0);
FLASH_Unlock(); // 解锁flash
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
FLASH_Erase_Sector(FLASH_SECTOR_2, FLASH_VOLTAGE_RANGE_3);
for (group = 0; group < CFV_CODE_LEN / 8; group++)
{
cvf_enc_gen(group);
cvf_enc_rom_addr_make(group, 0);
bsp_flash_write(cvf.addr + 0, cvf.out[0]);
bsp_flash_write(cvf.addr + 4, cvf.out[1]);
}
cvf_free();
FLASH_Lock();
}
int bsp_flash_write(uint32_t addr, uint32_t dat)
{
int cnt = 3;
int err = 1;
if (dat != UINT32_MAX)
{
while ((inpw(addr) == UINT32_MAX) && (cnt--))
{
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, dat);
if (dat == inpw(addr))
err = 0;
}
}
else
{
if (dat == inpw(addr))
err = 0;
}
return err;
}
|