本帖最后由 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;
- }
|