[APM32F4] F407 flash编程问题

[复制链接]
694|0
 楼主| aple0807 发表于 2023-3-22 15:39 | 显示全部楼层 |阅读模式
APM32F407对第2扇区执行擦写操作,首次通电写入数据,数据数量16KB。每次这4个地址数据都不对,下面是错误信息,存储一个二维数组,每组2字。
  1. cvf enc err [url=home.php?mod=space&uid=72445]@[/url] [1536][0]:: REQ=80A86B9E :: ROM=C9077731
  2. cvf enc err @ [1536][1]:: REQ=80A86B9E :: ROM=CCD61B08
  3. cvf enc err @ [1537][0]:: REQ=0D00A6F0 :: ROM=9179A04B
  4. cvf enc err @ [1537][1]:: REQ=0D00A6F0 :: ROM=8658FBA2
奇怪的是,这段程序执行后对写入数据进行读回校验都是对的。但程序运行过程中再次读取验证,这4字就一直是错误的。




代码如下:
  1. void cvf_handle(void)
  2. {
  3.         int group;
  4.         HAL_StatusTypeDef hal_st;
  5.         cvf_check_alloc();
  6.        
  7.         // enc opt
  8.         cvf_enc_rom_addr_make(0, 0);

  9.         FLASH_Unlock(); // 解锁flash

  10.         __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
  11.         FLASH_Erase_Sector(FLASH_SECTOR_2, FLASH_VOLTAGE_RANGE_3);

  12.         for (group = 0; group < CFV_CODE_LEN / 8; group++)
  13.         {
  14.                 cvf_enc_gen(group);

  15.                 cvf_enc_rom_addr_make(group, 0);

  16.                 bsp_flash_write(cvf.addr + 0, cvf.out[0]);
  17.                 bsp_flash_write(cvf.addr + 4, cvf.out[1]);
  18.         }

  19.         cvf_free();

  20.         FLASH_Lock();
  21. }

  1. int bsp_flash_write(uint32_t addr, uint32_t dat)
  2. {
  3.         int cnt = 3;
  4.         int err = 1;

  5.         if (dat != UINT32_MAX)
  6.         {
  7.                 while ((inpw(addr) == UINT32_MAX) && (cnt--))
  8.                 {
  9.                         __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
  10.                         HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, dat);

  11.                         if (dat == inpw(addr))
  12.                                 err = 0;
  13.                 }
  14.         }
  15.         else
  16.         {
  17.                 if (dat == inpw(addr))
  18.                         err = 0;
  19.         }

  20.         return err;
  21. }



您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

326

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部