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

cw语法及flash擦除问题

cw语法及flash擦除问题

#define Program_Byte PGM[21]=0x20; temp =((unsigned char(*)(unsigned int, unsigned char))(PGM)),我在文档里面看到这行代码,((unsigned char(*)(unsigned int, unsigned char))(PGM)),但是对这个说明不太理解,请斑竹指点


其中 unsigned char PGM[]; unsigned char temp;

还有个问题,我想问问对gt60进行整体擦除时,整体擦除怎么传递擦除的地址?

[此贴子已经被作者于2006-9-26 12:40:15编辑过]

[此贴子已经被作者于2006-9-26 12:42:04编辑过]

哪个文档?
海纳百川  有容乃大
CW_HCS08_Peripherals_Module_Quick_Reference_UG.pdf
HCS08QRUGSW
这个文档,多指教!
这个乍一看是很难理解,其实也不复杂。实际上,它是定义了一个名为Program_Byte的宏,而这个宏包含2个指令:一个指令是将数组PGM的第21个字节写为0x20;另一个指令是将数组PGM作为一个函数的入口地址进行调用。而数组PGM的内容,实际上就是一段对FLASH进行操作的程序的二进制代码。这段程序在数组的下面已经给出。可以看到,这段程序本身是需要参数的,所以在后面调用Program_Byte这个宏时,可以看到给了它两个参数。
海纳百川  有容乃大

我谈谈我的理解,你帮我分析一下问题在哪里,好吗?
首先执行命令的那段代码,需要参数是flash地址address和写入的数据data,你看那个程序,
1 在进行页擦除时,仅给出了一个地址0xf000参数,数据0xff,并没有给阿,但运行程序看到结果是写进去的全是0xff;
2 在进行字节写入时,给出了一个地址参数,和一个数据参数
疑问:两种情况对应一段程序,这让我有点糊涂?

temp =((unsigned char(*)(unsigned int, unsigned char))(PGM))这个当中,我理解你看哪里有问题,第一个unsigned char表示返回类型,*表示该函数是一个指针类型,函数里面有两个参数,类型分别是unsigned int, unsigned char
疑问:PGM在这里在函数原形当中怎么理解呢?

还有一点,就是我试着将擦写命令换成整体擦除(mass erase),将PGM[21]=0x41,好像没起作用,就是我先写进去数据,然后执行整体擦除,查看存储单元内容,好像没有擦掉!这是什么原因呢?

[此贴子已经被作者于2006-9-26 19:34:27编辑过]

第一个问题:
FLASH的擦除状态就是0xFF,不需要数据参数。
海纳百川  有容乃大
第二个问题:
在数组PGM所代表的程序中,实际上有两个参数,一个是Address,一个是Date。所以调用它时,可以给它两个参数。但擦除时不需要数据参数,所以只给一个参数也是可以的。当然,若擦除时若要给两个参数,也是可以的,但此时数据参数可以是任意值。
海纳百川  有容乃大
第三个问题:
你可以将此宏指令代入调用程序,这样可能更容易理解:

temp = PGM[21]=0x20;

temp =((unsigned char(*)(unsigned int, unsigned char))(PGM))(0xF000+i,i);

PGM就当成是一个函数的入口地址。
海纳百川  有容乃大
第四个问题:
整体擦除应该是可以的。不知你的程序什么地方有错,可以贴出来看看。
海纳百川  有容乃大
我增加了这么一条宏指令#define Mass_Erase PGM[21]=0x41; temp = ((unsigned char(*)(unsigned int))(PGM))
在程序当中最先执行一次整体擦除指令,这样是不成功的
temp = Mass_Erase(0xf600);
if(temp==0xFF){ //出错点亮led5
PTCD_PTCD5=1;
}
我试了先进行页擦除再进行整体擦除也是不成功的
好像是如果未对flash进行过写入数据的操作,是不能进行整体擦除操作的
不知道是什么原因
FLASH是否有块保护?
海纳百川  有容乃大
保护都解除了,有块保护的话,为什么能在写入字节以后,就可以进行整体擦除呢?
你先进行块擦除,先不要mass-erase呢
返回列表