DFLASH 配置
2012-08-19 22:07
162 查看
1、这是直接看网上的程序的。不过有个问题是晚上程序有一个写FCLKDIV = 0x4E,貌似是错的,数据手册上写晶振16M时应设为0x0F。
#define READword(address) ((unsigned int)(*(volatile unsigned int *__near)(address)))
#define DFLASH_LOWEST_START_PAGE 0x00 //定义data flash的起始页
#define DFLASH_START 0x00100000 //定义data flash的起始地址
#define DFLASH_PAGE_SIZE 0x0400 //定义data flash的大小为1K.
#define DFLASH_PAGE_WINDOW_START 0x0800 //定义data flash页面窗口的起始地址
#define LEDCPU PORTB_PB0
#define LEDCPU_dir DDRB_DDRB0
unsigned int Buffer[]={0x1111,0x2222,0x3333,0x4444};//数据缓存区,只能一次写入四个数据
unsigned int data_Address=0x0000;
unsigned int date_read[4];
/*************************************************************/
/* 初始化DFLASH */
/*************************************************************/
void DFlash_Init(void)
{
while(FSTAT_CCIF==0); //等待正在处理的FLASH操作完成
FCLKDIV=0x0F; //外部晶振为16M.FLASH时钟不超过1M,具体参照手册
FCNFG=0x00; //禁止中断
while(FCLKDIV_FDIVLD==0); //等待时钟设置成功
}
/*************************************************************/
/* 向DFLASH写入数据 */
/*************************************************************/
void DFlash_Write(word ADDR16)
{
while(FSTAT_CCIF==0);
if(FSTAT_ACCERR) //判断并清除标志位;
FSTAT_ACCERR=1;
if(FSTAT_FPVIOL) //判断并清除标志位;
FSTAT_FPVIOL=1;
FCCOBIX_CCOBIX=0x00;
FCCOB=0x1110; //写入命令和高位地址
FCCOBIX_CCOBIX=0x01; //地址后16位
FCCOB=ADDR16; //写入低16位地址
FCCOBIX_CCOBIX=0x02; //写入第一个数据
FCCOB=Buffer[0];
FCCOBIX_CCOBIX=0x03; //写入第二个数据
FCCOB=Buffer[1];
FCCOBIX_CCOBIX=0x04; //写入第三个数据
FCCOB=Buffer[2];
FCCOBIX_CCOBIX=0x05; //写入第四个数据
FCCOB=Buffer[3];
FSTAT_CCIF=1; //写入执行命令
while(FSTAT_CCIF==0); //等待执行完毕
}
/*************************************************************/
/* 由DFLASH读取数据 */
/*************************************************************/
word DFlash_Read (word destination)
{
byte lastepage; //用于存储EPAGE的值
byte epage; //用于计算EPAGE的值
unsigned int data; //读取出的数据
lastepage = EPAGE; //保存EPAGE的值
epage = (byte)((DFLASH_LOWEST_START_PAGE)+(destination >>10)); //计算EPAGE
EPAGE=epage; //给EPAGE赋值
data = READword((destination & (DFLASH_PAGE_SIZE - 1)) + DFLASH_PAGE_WINDOW_START); //读取页面窗口中的数据
EPAGE= lastepage; //恢复EPAGE的值
return(data);
}
/*************************************************************/
/* 擦除DFLASH的一个分区 */
/*************************************************************/
void DFlash_Erase(word ADDR16)
{
while(FSTAT_CCIF==0);
if(FSTAT_ACCERR) //判断并清除标志位;
FSTAT_ACCERR=1;
if(FSTAT_FPVIOL) //判断并清除标志位;
FSTAT_FPVIOL=1;
FCCOBIX_CCOBIX=0x00;
FCCOB=0x1210; //写入擦除命令和高位地址
FCCOBIX_CCOBIX=0x01;
FCCOB=ADDR16; //写入低16位的地址
FSTAT_CCIF=1; //启动执行命令
while(FSTAT_CCIF==0); //等待执行完成
}
//调用方法
DFlash_Init(); //初始化Flash
DFlash_Erase(data_Address); //确保先擦除后写入
DFlash_Write(data_Address);
date_read[0]=DFlash_Read(data_Address);
date_read[1]=DFlash_Read(data_Address+2);
date_read[2]=DFlash_Read(data_Address+4);
date_read[3]=DFlash_Read(data_Address+6);
#define READword(address) ((unsigned int)(*(volatile unsigned int *__near)(address)))
#define DFLASH_LOWEST_START_PAGE 0x00 //定义data flash的起始页
#define DFLASH_START 0x00100000 //定义data flash的起始地址
#define DFLASH_PAGE_SIZE 0x0400 //定义data flash的大小为1K.
#define DFLASH_PAGE_WINDOW_START 0x0800 //定义data flash页面窗口的起始地址
#define LEDCPU PORTB_PB0
#define LEDCPU_dir DDRB_DDRB0
unsigned int Buffer[]={0x1111,0x2222,0x3333,0x4444};//数据缓存区,只能一次写入四个数据
unsigned int data_Address=0x0000;
unsigned int date_read[4];
/*************************************************************/
/* 初始化DFLASH */
/*************************************************************/
void DFlash_Init(void)
{
while(FSTAT_CCIF==0); //等待正在处理的FLASH操作完成
FCLKDIV=0x0F; //外部晶振为16M.FLASH时钟不超过1M,具体参照手册
FCNFG=0x00; //禁止中断
while(FCLKDIV_FDIVLD==0); //等待时钟设置成功
}
/*************************************************************/
/* 向DFLASH写入数据 */
/*************************************************************/
void DFlash_Write(word ADDR16)
{
while(FSTAT_CCIF==0);
if(FSTAT_ACCERR) //判断并清除标志位;
FSTAT_ACCERR=1;
if(FSTAT_FPVIOL) //判断并清除标志位;
FSTAT_FPVIOL=1;
FCCOBIX_CCOBIX=0x00;
FCCOB=0x1110; //写入命令和高位地址
FCCOBIX_CCOBIX=0x01; //地址后16位
FCCOB=ADDR16; //写入低16位地址
FCCOBIX_CCOBIX=0x02; //写入第一个数据
FCCOB=Buffer[0];
FCCOBIX_CCOBIX=0x03; //写入第二个数据
FCCOB=Buffer[1];
FCCOBIX_CCOBIX=0x04; //写入第三个数据
FCCOB=Buffer[2];
FCCOBIX_CCOBIX=0x05; //写入第四个数据
FCCOB=Buffer[3];
FSTAT_CCIF=1; //写入执行命令
while(FSTAT_CCIF==0); //等待执行完毕
}
/*************************************************************/
/* 由DFLASH读取数据 */
/*************************************************************/
word DFlash_Read (word destination)
{
byte lastepage; //用于存储EPAGE的值
byte epage; //用于计算EPAGE的值
unsigned int data; //读取出的数据
lastepage = EPAGE; //保存EPAGE的值
epage = (byte)((DFLASH_LOWEST_START_PAGE)+(destination >>10)); //计算EPAGE
EPAGE=epage; //给EPAGE赋值
data = READword((destination & (DFLASH_PAGE_SIZE - 1)) + DFLASH_PAGE_WINDOW_START); //读取页面窗口中的数据
EPAGE= lastepage; //恢复EPAGE的值
return(data);
}
/*************************************************************/
/* 擦除DFLASH的一个分区 */
/*************************************************************/
void DFlash_Erase(word ADDR16)
{
while(FSTAT_CCIF==0);
if(FSTAT_ACCERR) //判断并清除标志位;
FSTAT_ACCERR=1;
if(FSTAT_FPVIOL) //判断并清除标志位;
FSTAT_FPVIOL=1;
FCCOBIX_CCOBIX=0x00;
FCCOB=0x1210; //写入擦除命令和高位地址
FCCOBIX_CCOBIX=0x01;
FCCOB=ADDR16; //写入低16位的地址
FSTAT_CCIF=1; //启动执行命令
while(FSTAT_CCIF==0); //等待执行完成
}
//调用方法
DFlash_Init(); //初始化Flash
DFlash_Erase(data_Address); //确保先擦除后写入
DFlash_Write(data_Address);
date_read[0]=DFlash_Read(data_Address);
date_read[1]=DFlash_Read(data_Address+2);
date_read[2]=DFlash_Read(data_Address+4);
date_read[3]=DFlash_Read(data_Address+6);
相关文章推荐
- Flash教程:安装和配置JDK开发环境
- open-flash-chart API 手册 参数配置手册
- 在windows 7或windows server 2008下配置Flash P2P流媒体系统 (详细步骤说明)
- ubuntu16.04下tensorflow1.0+CUDA8.0+cudnn8.0+chrome+flash+shutter+声音配置
- flashlog.txt配置
- MTK feature phone 52D FLASH配置分析
- flash recovery area配置
- Apache Flex(4.15.0) + Adobe Flash Builder(4.7)环境配置
- <linux学习> 2 ubuntu 下flash 配置
- GSM包不断增加,android 手机的flash 受限,项目内存配置如何规划呢?
- android YUV Sensor配置Camera应用的flash auto菜单
- 怎样为flash配置Alcon调试工具
- ubuntu 配置flash player plugin debugger 和 flash player projecter
- ubuntu 13.10 64位安装及配置 google拼音输入法及Adobe flash player、mp3 插件安装、中文GBK编码等 -转
- fedora9完全配置之flashplayer
- flashsim配置2015最新版本
- FMS4.5 (Flash media server)视频服务器安装和配置以及pomelo聊天室的调用
- flash读取外部xml配置文件基本方法
- flash跨域策略文件crossdomain.xml配置详解
- flash recovery area配置