搜索

求GD32F103的片内Flash模拟EEPROM程序

[复制链接]
202|8
 楼主 | 2021-1-6 22:28 | 显示全部楼层 |阅读模式
需要存些参数,所以想用片内Flash存,不知怎么操作,求版主或用过的人给指点!

使用特权

评论回复
| 2021-1-7 08:49 | 显示全部楼层
  1. #include "fmc.h"

  2.   
  3. #define GD32_FLASH_BASE     0x08000000   
  4. typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;   
  5. #define FMC_PAGE_SIZE                ((u16)0x800)   
  6.    
  7. vu32 zNbrOfPage = 0x00;   
  8. u32 Address = 0x00 ,wrp = 0,wrp2 = 0;   
  9. volatile fmc_state_enum zFMCStatus = FMC_READY;   
  10. volatile TestStatus zMemoryProgramStatus = PASSED;   
  11. u32*ptrd;   
  12. __IO TestStatus zTransferStatus = FAILED;   
  13.    
  14.    
  15.    
  16. u32 GDFLASH_ReadWord(u32 faddr)   
  17. {   
  18.     return *(vu32*)faddr;   
  19. }     
  20.    
  21. u8 GDFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)   
  22. {   
  23. //    uint32_t addrx=0;   
  24.     uint32_t endaddr=0;   
  25. //    uint32_t i;   
  26.     fmc_unlock();   
  27. //    addrx=WriteAddr;   
  28.     endaddr=WriteAddr+NumToWrite*4;
  29.        
  30.     fmc_flag_clear(FMC_FLAG_BANK0_END);
  31.     fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
  32.     fmc_flag_clear(FMC_FLAG_BANK0_PGERR);   
  33.        
  34.     while(WriteAddr<endaddr)   
  35.     {   
  36.         zFMCStatus = fmc_word_program(WriteAddr,*pBuffer);  
  37.                
  38.         fmc_flag_clear(FMC_FLAG_BANK0_END);
  39.                 fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
  40.                 fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
  41.                
  42.         WriteAddr+=4;   
  43.         pBuffer++;   
  44.     }   
  45.     fmc_lock();   
  46.     return zFMCStatus;   
  47. }   
  48.    
  49. u8 GDFMC_ErasePage(u32 PageAddr)   
  50. {   
  51. //    uint8_t i;   
  52.     zTransferStatus = PASSED;   
  53.     fmc_unlock();   
  54.        
  55.     fmc_flag_clear(FMC_FLAG_BANK0_END);
  56.     fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
  57.     fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
  58.        
  59.     zFMCStatus=fmc_page_erase(PageAddr);//GD32_FLASH_BASE + (FMC_PAGE_SIZE * PageAddr));   
  60.        
  61.     fmc_flag_clear(FMC_FLAG_BANK0_END);
  62.     fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
  63.     fmc_flag_clear(FMC_FLAG_BANK0_PGERR);   
  64.        
  65.     fmc_lock();   
  66.    
  67.     return zFMCStatus;   
  68. }   
  69.    
  70. void GDFLASH_Read(u32 ReadAddr,u32 *pBuffer,u32 NumToRead)         
  71. {   
  72.     u32 i;   
  73.     for(i=0;i<NumToRead;i++)   
  74.     {   
  75.         pBuffer[i]=GDFLASH_ReadWord(ReadAddr);   
  76.         ReadAddr+=4;   
  77.     }   
  78. }   
  79.    
复制代码
仅供参考

使用特权

评论回复
 楼主 | 2021-1-7 11:54 | 显示全部楼层
谢楼上!

使用特权

评论回复
 楼主 | 2021-1-7 13:07 | 显示全部楼层
请问zeshoufx,GD32F103的Flashd页是1K页还是2K页?我看资料好像是1K页,所以你那个页大小参数是不是应该是0x400?

使用特权

评论回复
| 2021-1-7 13:59 | 显示全部楼层
mcuatmel 发表于 2021-1-7 13:07
请问zeshoufx,GD32F103的Flashd页是1K页还是2K页?我看资料好像是1K页,所以你那个页大小参数是不是应该是 ...

我的是303rc,,,,参考修改

使用特权

评论回复
 楼主 | 2021-1-7 15:27 | 显示全部楼层
哦,明白,谢谢!目前可以用了。

使用特权

评论回复
| 2021-1-7 20:31 | 显示全部楼层
很棒棒哦,值得学习

使用特权

评论回复
| 2021-1-7 21:03 | 显示全部楼层
楼主是用在什么地方的,有没有用到中断呢? FMC操作过程中会存在中断不响应的情况,具体要看对项目有么有影响。

使用特权

评论回复
| 2021-1-12 22:54 | 显示全部楼层
请问zeshoufx大佬,FMC是不是写入之前也需要判断是否是0xFFFFFFFF,不是应该擦除再写入

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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