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

请教:对GT16中FLASH操作的问题,谢谢!

请教:对GT16中FLASH操作的问题,谢谢!

各位高手请指教:谢谢!


我对GT16的FLASH进行擦除和写入数据,全部是用C 写的,擦除和写入程序已经放到在RAM中了。而且我也能看到PC指针指向了我放置的RAM地址0X0100,但接下来程序窗口就白屏了,程序飞掉了。请问:这是怎么回事?


我已经对以前的帖子都看了,现在对如何在RAM中执行擦除和写入程序不清楚,各位高手能不能说得更清楚一些?能否提供一例子?另外,在RAM中如果执行完了这两个子程序,接下来PC是应该指向FLASH中其它的程序地址吗?我能在CW调试环境中的MEMORY窗口直接看到我写入的数据吗?


多谢指教 !


 


 

学无止境
谢谢楼上热心指教!我再试一试。
学无止境
不好意思,我还是没有调出来。通过机器码,我确认了在RAM的程序段最后有返回指令,即81。现在的现象是: 在RAM中执行程序时,SOURCE窗口显示的是start08.c,运行完FLASH擦除程序后不返回而是飞了。
请高手继续指点,谢谢!

我还有问题:
1、在FLASH擦写程序中,时间延迟是做的子程序,这样子在RAM运行的话一样还是要跳转到FLASH中的。是不是在FLASH 擦写程序中不能调用子程序?
2、前面seuafu2005提到的FLASH 额状态寄存器在哪里?我没有发现有这么个寄存器。怎么知道出错信息呢?
3、用C实现取得函数起始地址怎么实现?
4、我在以前的帖子中看到这样的源代码:
void(*a)();
move(DoEaraseFlash,0x3d);
a=(byte *)0x0100;
(*a)();
我理解最后一句就是跳转到RAM中执行的,对吗?这个函数具体的内容是怎样的?
弄了一个星期了,还是没有实现FLASH的擦写,很头疼。我对这个过程不理解,
请高手们多指教!谢谢!
学无止境
FLASH中的地址赋值应该是这样的:
*(volatile unsigned int *)flash_addr=(unsigned char) value;楼上说得对,不能是8位的。
现在主要感觉是PC跳到RAM中就没有返回!
感谢seuafu2005的热心指点,但您说的FCDIV和FSTAT是什么呢?


nishui_2000:我周末上不了网,一会儿给你发过去邮件,多交流。谢谢!

学无止境
感谢大家的关注!
我已经调试出来了,关键在于RAM中运行及运行完了还需要返回FLASH中继续下面的工作。所以 ,在FLASH擦写程序最后需要有返回FLASH的操作才行。
不知道我说的对不对,现在我就是这样擦写成功了。
但还有点小问题向大家请教:
1、如果需要写入FLASH中的常量数据比较多,这些数据放在哪里呢?放在FLASH中应该不行的,在RAM中就有个容量的问题,这个怎么解决呢?
2、如果写入的数据是变化的全局变量,它们的位置通常放置在哪里?感觉数据手册中说得不清楚。这样的话,又该怎么办呢?
我想把FLASH的操作搞透彻一些,感谢高手指点!


学无止境
非常感谢nishui_2000的热心帮助!
你能不能把GP32的FLASH程序发给我一份,我参照比较一下,应该有助于对FLASH操作的理解!
谢谢!
以后多交流!
学无止境
版主: 对FLASH擦写的程序要放到RAM中执行,如果在写入FLASH的程序中需要返回FLASH中取一些要写入的常量数据,这样就是在FLASH处于高编程电压的情况下对FLASH进行操作,会造成FLASH擦写失败。
我个人认为这是飞思卡尔片子的一个瑕疵,^_^
事实上,08系列的FLASH擦写是比较麻烦的。个人观点啊
学无止境
我上网不是很方便,以前的帖子中有类似的程序。搜索一下就可以看到。
要注意在RAM执行完FLASH的擦写程序后一定要有返回FLASH的程序指令才行。
我这样做的 :在FLASH擦写子程序的最后,调用后面操作的子程序。这样,PC执行完RAM后就跳转会FLASH执行后续的工作了。
大家多交流!
学无止境
返回列表