首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]各位老师HC08系列flash写数据遇到问题,急问

[求助]各位老师HC08系列flash写数据遇到问题,急问

写flash的时候遇到一个问题,我想保存的数据存的起始地址是0xde00,
譬如存入3456,
*((volatile unsigned char *)(0xde00))=(3456>>8);//将数据写入相应的flash地址
for(c=0;c<350;c++);
*((volatile unsigned char *)(0xde01))=(3456&0xFF);//将数据写入相应的flash地址
for(c=0;c<350;c++);
读的时候
m=*((volatile unsigned char *)(0xde00)); //00,01地址写入KWH
n=*((volatile unsigned char *)(0xde01));
m=m<<8;
kwh=m+n; 读出的数据没有问题
现在我想存两个int型数据,如3456,1278,仍采用上述方法,将1278存在0xde02,0xde0
3地址,程序如下:
*((volatile unsigned char *)(0xde00))=(3456>>8);//将数据写入相应的flash地址
for(c=0;c<350;c++);
*((volatile unsigned char *)(0xde01))=(3456&0xFF);//将数据写入相应的flash地址
for(c=0;c<350;c++);
*((volatile unsigned char *)(0xde02))=(1278>>8);//将数据写入相应的flash地址
for(c=0;c<350;c++);
*((volatile unsigned char *)(0xde03))=(1278&0xFF);//将数据写入相应的flash地址
for(c=0;c<350;c++);
读的时候
m=*((volatile unsigned char *)(0xde00)); //00,01地址写入KWH
n=*((volatile unsigned char *)(0xde01));//将数据写入相应的flash地址
p=*((volatile unsigned char *)(0xde02));//02,03地址写入WH
q=*((volatile unsigned char *)(0xde03));//将数据写入相应的flash地址
m=m<<8;
p=p<<8;
kwh=m+n;
dwh=p+q;
这时候却老出现复位的现象,不知程序哪里有问题,各位老师给我看一下
老师给我解释一下
直接用赋值指令并不能将数据写入FLASH。要对FLASH控制寄存器进行操作,并将程序调入RAM中运行。请看芯片的数据手册。另外,本论坛中也有很多相关的帖子,搜索一下吧。
海纳百川  有容乃大
谢谢版主,程序也以调入RAM中运行,我写0xde00,0xde01两个地址都没有问题,但是接着写的话就不行了,版主帮我看一下问题出在哪。拷到RAM里的程序写好的,不然0xde00,0xde01的数据也不可能成功
有没有把中断和COP关掉?
海纳百川  有容乃大
void move(void(*p)(),int size)
{
int *w;
int b=0;
w=(int *)0x0150;
for(b=0;b *(w+b)=*((int*)(p)+b);
}
我的flash拷到RAM的程序,是不是里面的int b 应该改为byte b 呢?
cop始终没开,但其他中断一直在,这个影响会很大吗?
还有个问题,就是说我写完0xde00,0xde01,然后分页写到0xde80,0xde81也没有问题,就是不能00,01,02,03这样连起来写
你用的是什么芯片?把整个project打包发到strongchen_free@yahoo.com.cn看看吧。
海纳百川  有容乃大
谢谢版主,我现在把所有的中断关掉试一下,如果还不行就麻烦你给看一下
void display(unsigned int y); //显示
/*------------MOVE PROGRAM FROM FLASH TO RAM------------*/
void move(void(*p)(),int size)
{
int *w;
int b=0;
w=(int *)0x0150;
for(b=0;b *(w+b)=*((int*)(p)+b);
}
/*------------------------------------------------------*/

/*---------MOVE DoEraseFlash form FLASH to RAM-----------*/
void EraseFlash(void)
{
void(*a)();
move(DoEarseFlash,0x75);
a=(int *)0x0150;
(*a)();
}
/*-------------------------------------------------------*/
/*---------MOVE DoWriteFlash form FLASH to RAM-----------*/
void WriteFlash(void)
{
void(*t)();
move(DoWriteFlash,0xc9); //原来a0;
t=(int *)0x0150;
(*t)();
}
/*-------------------------------------------------------*/

/*-------------DoEraseFlash:擦除指定flash区,地址0xde00--------*/
void DoEarseFlash(void)
{
unsigned int c;
FLBPR=0xff; //设置flash保护区
FLCR_ERASE=1; //1->ERASE,0->MASS(页擦除)
FLCR_MASS=0;
c=FLBPR; //读FLBPR
*((volatile unsigned char *)(0xde00))=0x99;//向被擦写的单元写任意字符
for(c=0;c<100;c++); //延时10us
FLCR_HVEN=1; //1->HVEN (加高压)
for(c=0;c<1000;c++); //延时时间必须>1.6ms
FLCR_ERASE=0; //0->Erase
for(c=0;c<100;c++); //10us
FLCR_HVEN=0; //0->HVEN(取消高压)
for(c=0;c<100;c++); //延时10us

}

/*-------------------------------------------------------*/

/*-----------DoWriteFlash:实际执行的写入函数,地址0xde00-----------*/
void DoWriteFlash()
{
unsigned int c;
FLBPR=0xff;
FLCR_PGM=1; //1->PGM,编程状态
c=FLBPR; //读FLBPR
*((volatile unsigned char *)(0xde00))=0x88;//0x88->C000,选中flash行
for(c=0;c<200;c++); //10us
FLCR_HVEN=1; //1->HVEN
for(c=0;c<100;c++); //10us
*((volatile unsigned char *)(0xde00))=(1234>>8);//将数据写入相应的flash地址
for(c=0;c<350;c++);
*((volatile unsigned char *)(0xde01))=(1234&0xFF);//将数据写入相应的flash地址
for(c=0;c<350;c++);
*((volatile unsigned char *)(0xde02))=(5678>>8);//将数据写入相应的flash地址
for(c=0;c<350;c++);
*((volatile unsigned char *)(0xde03))=(5678&0xFF);//将数据写入相应的flash地址
for(c=0;c<350;c++);

FLCR_PGM=0; //0->PGM
for(c=0;c<100;c++); //10us
FLCR_HVEN=0; //0->HVEN
for(c=0;c<100;c++); //10us

}
/*-------------------------------------------------------*/
/*-----------检测到外部中断,开始正常工作-----------*/

void main(void)
{
/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
PE_low_level_init();
DDRA=0xff; //A口为输出;
PTA=0x00; //初始化为0;
DDRD=0xff; //D口为输出;
PTD=0x00; //初始化为0;
DDRB_DDRB0=1;
m=0;
n=0;
p=0;
q=0;
result1=0;
result2=0;
for(;;)
{
EraseFlash();
WriteFlash();
result1=*((volatile unsigned int *)(0xde00));
result2=*((volatile unsigned int *)(0xde02));
display(result2);
PTB_PTB0=0;
}

}
芯片是HC908SR12,谢谢,帮我看一下程序有什么问题
老师们帮我看一下
现在遇到的问题的具体现象是什么?
海纳百川  有容乃大
你好版主,能指导一下关于FLASH的问题吗 ,我的QQ476364949  谢谢版主
返回列表