打印

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

[复制链接]
1676|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ad777|  楼主 | 2020-11-3 11:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ad777 于 2020-11-3 11:14 编辑
#include "flash_rw.h"
#include "gd32f10x.h"
#include "systick.h"
#define Base_Addr 0x0870f800   //第255页  bank1  大小两Kb
#define EEP_MAX 256     //256字节的存储空间   一方面减轻ram压力  另一方面减少flash操作时间
/***********************************************************************
函  数  名:Flash_Read_HalfWord
功       能:flash半字读取
输入参数:相对地址 0-128
返回参数:读出来的值
说      明:
***********************************************************************/
unsigned short int Flash_Read_HalfWord(unsigned  faddr)
{
        return *(unsigned short int*)(faddr*2+Base_Addr);//返回输入地址中的值
}
/***********************************************************************
函  数  名:Flash_Read
功       能:读取指定长度的数据
输入参数:相对地址 0-128   读取使用的数组 16位   要读取的长度
返回参数:
说      明:
***********************************************************************/
void Flash_Read(unsigned int addr,unsigned short int *redata,unsigned short int renum)
{
          unsigned short int i;
          for(i = 0;i<renum;i++)
          {
                      *(redata+i*2) = Flash_Read_HalfWord(addr+i);//开始读
          }
}
/***********************************************************************
函  数 名:Flash_Write_Byte
功      能:flash半字写
输入参数:相对地址 0-128,16位的数据指针    写入的数量
返回参数:1成功  2地址超出设置范围
说      明:
***********************************************************************/
unsigned char Flash_Write_Byte(unsigned int uaddr,unsigned short int *data16,unsigned short int datanum)
{
          unsigned short int i;
          unsigned char Nclear = 0;
          unsigned short int tempdata[EEP_MAX/2];
          if(uaddr>EEP_MAX/2)return 2;//输入超出设置范围
          fmc_unlock();//Flash解锁
          fmc_bank1_unlock();//Flash解锁
          fmc_flag_clear(FMC_FLAG_BANK0_END);
          fmc_flag_clear(FMC_FLAG_BANK0_WPERR);
          fmc_flag_clear(FMC_FLAG_BANK0_PGERR);
          for(i = 0;i<datanum;i++)
          {
                  if(Flash_Read_HalfWord(uaddr+i)!=0xffff)Nclear = 1;//需要清除flash
          }
          if(Nclear == 1)
          {
                  for(i = 0;i<EEP_MAX/2;i++)//读出数据
                  {
                           tempdata[i]=Flash_Read_HalfWord(uaddr+i);
                  }
                  for(i = 0;i<datanum;i++)
                  {
                           tempdata[uaddr+i] = *(data16+i*2);//写入数据到缓存数组
                  }
                  fmc_page_erase(Base_Addr);
                  for(i = 0;i<EEP_MAX/2;i++)
                 {
                          fmc_halfword_program(Base_Addr+i*2,tempdata[i]);//整个区域写入
                  }
          }
          else
          {
                for(i = 0;i<datanum;i++)
                {
                         fmc_halfword_program(Base_Addr+(uaddr+i)*2,*(data16+i*2));//写入
                }                                
          }
          fmc_bank0_lock();//Flash上锁
          fmc_lock();//Flash上锁
          return 1;
}











使用特权

评论回复
沙发
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);
}

使用特权

评论回复
评论
ad777 2020-11-4 09:14 回复TA
谢谢 
地板
索尼法| | 2020-11-3 23:09 | 只看该作者
我手上也没有f1系列的 帮你up一下吧

使用特权

评论回复
5
氧化二氢| | 2020-11-3 23:18 | 只看该作者
没什么问题 多玩玩这板子

使用特权

评论回复
评论
ad777 2020-11-4 14:20 回复TA
还没有板子 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝