此款单片机是由有64K的字节flash,一共有128页,一页有512字节,以下是容量划分:
这里使用的是字节位宽的数据读写操作进行演示,其他2种方式大同小异,需要用到自己去研究,首先需要添加对应的flash库文件,然后进行flash操作的初始化工作
while(Flash_Init(12,TRUE) != 0); //Flash初始化
printf("System Init is OK\r\n");
printf("System to Runing\r\n");
我这边给他做了读写封装函数,方便程序的调用
#include "main.h"
extern void Write_EEPROM_OneBitData(uint32_t Addr,uint8_t Dat);
extern void Write_EEPROM_StrData(uint32_t Addr,uint16_t Len,uint8_t *Dat);
extern uint8_t Read_EEPROM_Data(uint32_t Addr);
EEPROM_t EEPROM =
{
Write_EEPROM_OneBitData,
Write_EEPROM_StrData,
Read_EEPROM_Data
};
static void Write_EEPROM_OneBitData(uint32_t Addr,uint8_t Dat)
{
while(Flash_SectorErase(Addr) != 0);
Flash_WriteByte(Addr,Dat);
}
//EEPROM一个扇区(页)写N个字节操作,最多可写一页数据(512字节)
static void Write_EEPROM_StrData(uint32_t Addr,uint16_t Len,uint8_t *Dat)
{
uint16_t i=0;
while(Flash_SectorErase(Addr) != 0);
for(i=0;i<Len;i++)
{
Flash_WriteByte(Addr+i,*Dat++);
}
}
//EEPROM读一个字节操作
static uint8_t Read_EEPROM_Data(uint32_t Addr)
{
uint8_t Dat=0;
Dat = *((volatile uint8_t*)Addr);
return Dat;
}
他的操作和其他单片机的操作都是大同小异,主要就是确定好写入的地址,要先擦除后写入,读取数据什么时候都可以
//flash页,一共有128个页,一个页区是512字节,此为flash区保存数据
//此款型号没有EEPROM功能,只有flash读写操作,从flash的最后一页开始使用往上推,一个页是512字节
typedef enum
{
EEPROM_ADDR0 = (uint32_t)0xFE00, //页0,0xFE00-0xFFFF
EEPROM_ADDR1 = (uint32_t)0xFC00, //页1,0xFC00-0xFDFF
EEPROM_ADDR2 = (uint32_t)0xFA00, //页2,0xFA00-0xFBFF
EEPROM_ADDR3 = (uint32_t)0xF800 //页3,0xF800-0xF9FF
}EEPROM_ADDR_t;
从他的做后一页(127页)开始操作flash数据操作,这样可以防止应用程序覆盖保存的数据,还有就是地址一定要对,这样读写操作才正常,以下写入数据操作
EEPROM.Write_EEPROM_StrData(EEPROM_ADDR0,Flash_Data_Len,Flash_Buff);
EEPROM.Write_EEPROM_OneBitData(EEPROM_ADDR1+RX_SaveBaud,0x01);
读取数据操作
Flag_Num = EEPROM.Read_EEPROM_Data(EEPROM_ADDR0+Flash_ZFlag);
printf("Flag_Num:%d\r\n",Flag_Num);
虽然是简单的读写flash操作,但是还是很多不知道怎么写程序,希望能够帮助到你!!!