[N32G45x] Flash擦写操作

[复制链接]
1378|2
 楼主| Afanx 发表于 2022-8-25 11:23 | 显示全部楼层 |阅读模式
本帖最后由 Afanx 于 2022-8-25 20:22 编辑

使用n32g45x_flash.c库函数。
Flash擦除:
擦除 1页 = 2KB = 0x800字节,填入擦除地址后,会擦除地址所在的一整页。
  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] 擦除一页2KB (0x800字节) 用时1.6ms
  3. * @param addr 相对FLASH_BASE(0x0800_0000)的偏移地址,范围【0~0x7FFFF】
  4. */
  5. void Flash_Erase(uint32_t addr)
  6. {
  7.     FLASH_Unlock();
  8.     FLASH_EraseOnePage(FLASH_BASE + addr);  // 擦除1页约1.6ms
  9.     FLASH_Lock();
  10. }

Flash写数据:

进行闪存编程操作时(写或擦除),必须打开内部的 RC 振荡器(HSI)。
必须擦除后按【字】写入,不可二次对Flash的位、字节、半字进行修改。(比如不可将0xFFFF_AABB改写覆盖为0xFFFF_0000)
Flash编程过程中,对Flash读操作会锁住Flash总线,此时CPU会暂停运行,等待Flash编程完成,(但不影响保存在iCache中的代码运行)。
基于以上特性,可以连续对Flash写,不需要程序等待,即删除Wait_FlashOpt_Busy()不影响功能。
  1. /* 等待Flash操作完成 */
  2. void Wait_FlashOpt_Busy(void)
  3. {
  4.     uint32_t timeOut = 0x00002000;  // ProgramTimeout
  5.     while (((FLASH->STS & FLASH_FLAG_BUSY) == FLASH_FLAG_BUSY) && (timeOut--)) __NOP();
  6. }

  7. /**
  8. * [url=home.php?mod=space&uid=247401]@brief[/url]  Flash写操作,用时约0.112ms每字
  9. * @param addr 相对FLASH_BASE(0x0800_0000)的偏移地址,并且必须按字对齐,范围【0~0x7FFFF】
  10. * @param datPtr 待写入Flash的数据地址
  11. * @param len 待写入Flash的数据长度,单位:字
  12. */
  13. void Flash_Write(uint32_t addr, uint32_t* datPtr, uint32_t len)
  14. {
  15.     if (addr >= FLASH_SIZE) return;
  16.     addr &= 0xFFFFFFFC;  //字对齐
  17.     FLASH_Unlock();
  18.     FLASH_ClearFlag(FLASH_STS_CLRFLAG);
  19.     Wait_FlashOpt_Busy();
  20.     FLASH->CTRL |= FLASH_CTRL_PG;

  21.     while (len--) {
  22.         *(__IO uint32_t*)(FLASH_BASE + addr) = *(datPtr++);
  23.         Wait_FlashOpt_Busy();  // 112us
  24.         addr += 4;
  25.     }

  26.     FLASH->CTRL &= ~FLASH_CTRL_PG;
  27.     FLASH_Lock();
  28. }

Flash 总线地址列表:
Flash总线地址表.png

注意事项:
Flash注意事项1.png


     
sy12138 发表于 2022-8-25 18:34 | 显示全部楼层
写的不错
dsm1978 发表于 2022-8-26 07:38 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

51

帖子

2

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