GD32F103xE的flash读写函数 大佬帮忙看看有没有什么问题

[复制链接]
 楼主| ad777 发表于 2020-11-3 11:09 | 显示全部楼层 |阅读模式
本帖最后由 ad777 于 2020-11-3 11:14 编辑
  1. #include "flash_rw.h"
  2. #include "gd32f10x.h"
  3. #include "systick.h"
  4. #define Base_Addr 0x0870f800   //第255页  bank1  大小两Kb
  5. #define EEP_MAX 256     //256字节的存储空间   一方面减轻ram压力  另一方面减少flash操作时间
  6. /***********************************************************************
  7. 函  数  名:Flash_Read_HalfWord
  8. 功       能:flash半字读取
  9. 输入参数:相对地址 0-128
  10. 返回参数:读出来的值
  11. 说      明:
  12. ***********************************************************************/
  13. unsigned short int Flash_Read_HalfWord(unsigned  faddr)
  14. {
  15.         return *(unsigned short int*)(faddr*2+Base_Addr);//返回输入地址中的值
  16. }
  17. /***********************************************************************
  18. 函  数  名:Flash_Read
  19. 功       能:读取指定长度的数据
  20. 输入参数:相对地址 0-128   读取使用的数组 16位   要读取的长度
  21. 返回参数:
  22. 说      明:
  23. ***********************************************************************/
  24. void Flash_Read(unsigned int addr,unsigned short int *redata,unsigned short int renum)
  25. {
  26.           unsigned short int i;
  27.           for(i = 0;i<renum;i++)
  28.           {
  29.                       *(redata+i*2) = Flash_Read_HalfWord(addr+i);//开始读
  30.           }
  31. }
  32. /***********************************************************************
  33. 函  数 名:Flash_Write_Byte
  34. 功      能:flash半字写
  35. 输入参数:相对地址 0-128,16位的数据指针    写入的数量
  36. 返回参数:1成功  2地址超出设置范围
  37. 说      明:
  38. ***********************************************************************/
  39. unsigned char Flash_Write_Byte(unsigned int uaddr,unsigned short int *data16,unsigned short int datanum)
  40. {
  41.           unsigned short int i;
  42.           unsigned char Nclear = 0;
  43.           unsigned short int tempdata[EEP_MAX/2];
  44.           if(uaddr>EEP_MAX/2)return 2;//输入超出设置范围
  45.           fmc_unlock();//Flash解锁
  46.           fmc_bank1_unlock();//Flash解锁
  47.           fmc_flag_clear(FMC_FLAG_BANK0_END);
  48.           fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
  49.           fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
  50.           for(i = 0;i<datanum;i++)
  51.           {
  52.                   if(Flash_Read_HalfWord(uaddr+i)!=0xffff)Nclear = 1;//需要清除flash
  53.           }
  54.           if(Nclear == 1)
  55.           {
  56.                   for(i = 0;i<EEP_MAX/2;i++)//读出数据
  57.                   {
  58.                            tempdata[i]=Flash_Read_HalfWord(uaddr+i);
  59.                   }
  60.                   for(i = 0;i<datanum;i++)
  61.                   {
  62.                            tempdata[uaddr+i] = *(data16+i*2);//写入数据到缓存数组
  63.                   }
  64.                   fmc_page_erase(Base_Addr);
  65.                   for(i = 0;i<EEP_MAX/2;i++)
  66.                  {
  67.                           fmc_halfword_program(Base_Addr+i*2,tempdata[i]);//整个区域写入
  68.                   }
  69.           }
  70.           else
  71.           {
  72.                 for(i = 0;i<datanum;i++)
  73.                 {
  74.                          fmc_halfword_program(Base_Addr+(uaddr+i)*2,*(data16+i*2));//写入
  75.                 }                                
  76.           }
  77.           fmc_bank0_lock();//Flash上锁
  78.           fmc_lock();//Flash上锁
  79.           return 1;
  80. }











 楼主| ad777 发表于 2020-11-3 11:12 | 显示全部楼层
手里还没有实体单片机   有没有朋友帮忙试试
castle520 发表于 2020-11-3 21:10 | 显示全部楼层
你好,我这边拿GD32F103测试了,代码能够使用,可以加上如下代码擦写更多page
uint32_t num_of_page = (datanum - uaddr) / 1024+1;
for(i=0;i<num_of_page;i++)
{               
        fmc_page_erase(Base_Addr+i*1024);
        fmc_flag_clear(FMC_FLAG_BANK0_END);
        fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
        fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
}

评论

谢谢  发表于 2020-11-4 09:14
索尼法 发表于 2020-11-3 23:09 | 显示全部楼层
我手上也没有f1系列的 帮你up一下吧
氧化二氢 发表于 2020-11-3 23:18 | 显示全部楼层
没什么问题 多玩玩这板子

评论

还没有板子  发表于 2020-11-4 14:20
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

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