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

flash问题请教!

0x8000为分页地址区的地址,对这个地址的操作要小心,因为与PPAGE寄存器的值有关。还是把整个PROJECT打包贴出来看看吧。
海纳百川  有容乃大
看过你的PROJECT了,发现主要有两个问题。
第一个问题,必须了解DP256的FLASH是分成4个块的(BANK或BLOCK,参见S12FTS256KV2.pdf的第16页)。程序只能在一个块中对另一个FLASH块进行擦或写的操作,而不能对程序所在的块自身进行擦或写的操作。你要对7000这个地址进行操作,同时你又将程序放入了NON_BANKED区,它们都是处于BLOCK 0中的,这样就有问题了。解决这个问题的办法,只要将程序放入分页区即可。有些应用是将FLASH擦写程序放入RAM中执行,这样就可以对所有的FLASH区进行操作了。
海纳百川  有容乃大
第二个问题,还是与FLASH的分块有关。DP256的FLASH分为4块,那么它的控制和状态寄存器也相应地分成4组,需要通过FCNFG中的BKSEL位来选择对哪一块进行操作。而且,如果其中任意一组的状态寄存器中有错误,都无法对FLASH进行操作。所以在擦写操作之前,要加这么一段代码,对所有4组状态寄存器进行检测和清零:
FCNFG_BKSEL = 0;
while(FSTAT & 0x30) FSTAT |= 0x30;
FCNFG_BKSEL = 1;
while(FSTAT & 0x30) FSTAT |= 0x30;
FCNFG_BKSEL = 2;
while(FSTAT & 0x30) FSTAT |= 0x30;
FCNFG_BKSEL = 3;
while(FSTAT & 0x30) FSTAT |= 0x30;

FCNFG_BKSEL = 0;
海纳百川  有容乃大
返回列表