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

请大家帮我看看我这个操作FLASH的代码有什么问题

你要操作的地址属于IFLASH区的,而你操作的方式是针对D-FLASH的。你是打算把数据存入FLASH中方便以后调用,还是像操作EEPROM一样用来保存可以擦写的数据?

窗口值的范围是从0x8000 到 0xBFFF

固定地址的范围是从0x4000 到 0x7FFF, 0xC000 到 0xFEFF

你操作的地址 page = 0xFA, addr = 0x0000, 这个并不在FLASH的地址范围内。
从你的PRM文件来看,操作的时候最好把数据写在固定地址 0x4000 - 0x7FFF 这个区域里,因为这个区域现在没有分配,烧程序时这一块不会被占用,可以安全的存放数据。

另外一点,如果你要查看地址的话,注意用本地地址的方式来查看,举个例子,0x4000这个地址对应的本地地址为" 0xFD8000'L ",即 page = 0xFD, addr = 0x8000

[此贴子已经被作者于2008-9-19 15:27:31编辑过]

分页的话你就把地址改一下,你写的0x0000这个地址是 local address, 寻址的话这个地址对应的是寄存器区,你找一个分页的区号试一下,记得从prm文件里把那个区分出来。

你改成这样试试

flash_erase_word(0xFA,0x8000);
flash_write_word(0xFA,0x8000,0xaabb);

prm文件里

DEFAULT_ROM INTO PAGE_FE, PAGE_FB, /*PAGE_FA, */PAGE_F9, PAGE_F8,
PAGE_F7, PAGE_F6, PAGE_F5, PAGE_F4, PAGE_F3, PAGE_F2, PAGE_F1, PAGE_F0,
PAGE_EF, PAGE_EE, PAGE_ED, PAGE_EC, PAGE_EB, PAGE_EA, PAGE_E9, PAGE_E8,
PAGE_E7, PAGE_E6, PAGE_E5, PAGE_E4, PAGE_E3, PAGE_E2, PAGE_E1, PAGE_E0;

local address 是这样分配的

0000~07FF ----- REGISTERS

0800~0BFF ----- EEPROM window

0C00~0FFF ----- EEPROM window

1000~1FFF ----- RAM window

2000~2FFF ----- RAM fix

3000~3FFF ----- RAM fix

4000~7FFF ----- FLASH fix

8000~BFFF ----- FLASH window

C000~FFFF ----- FLASH fix

只有在地址属于window这一段内,才需要PAGE寄存器来判断是具体哪个地址

PAGE_F8 = READ_ONLY 0xF88000 TO 0xF8BFFF;
PAGE_F9 = READ_ONLY 0xF98000 TO 0xF9BFFF;
/*PAGE_FA = READ_ONLY 0xFA8000 TO 0xFABFFF; */
PAGE_FB = READ_ONLY 0xFB8000 TO 0xFBBFFF;
PAGE_FC = READ_ONLY 0xFC8000 TO 0xFCBFFF;
/* PAGE_FD = READ_ONLY 0xFD8000 TO 0xFDBFFF; intentionally not defined: equivalent to ROM_4000 */
PAGE_FE = READ_ONLY 0xFE8000 TO 0xFEBFFF;
/* PAGE_FF = READ_ONLY 0xFF8000 TO 0xFFBFFF; intentionally not defined: equivalent to ROM_C000 */

这个我刚才漏了

0x7E8000global address

0xFA8000logical address

logical address = ( 0xFA( page ) << 16 ) + ( 0x8000( local address ) )

void Flash_init(void)
{
if( !FCLKDIV_FDIVLD )
{
FCLKDIV_PRDIV8 = 0;
FCLKDIV = 21;
FCNFG = 0;
}
FPROT_FPOPEN=1;
FPROT_FPHDIS=1;
FPROT_FPLDIS=1;
}

void flash_write_word(byte page,word addr,word data)
{
FSTAT = 0x30;
PPAGE = page;
*((word *)addr) = data;
FCMD = 0x20;
FSTAT = 0x80;
while( !FSTAT_CBEIF );
while( !FSTAT_CCIF );
}

换上去试一下,我这边没有这块片子,调试不了

[此贴子已经被作者于2008-9-24 15:36:51编辑过]

一起学习,共同进步嘛。

能不能脱离BDM来调试,通过SCI或者CAN来读取0xFA8000地址的数据,以此确定是否正确写入数据,我在用BDM调试烧写FLASH时也遇到类似问题。我试一下看看是不是用BDM才会有问题?

《嵌入式系统--使用HCS12微控制器的设计与应用》

Flash在线编程时提供一下两种方案:

1 将擦除与写入程序放在包含要擦/写区域的Flash块中,这样进行擦/写操作时,擦/写程序就可以直接在Flash中运行,不需要移到RAM中运行。

2 将擦除与写入程序放在包含要擦/写区域的Flash块中,这样进行擦/写操作时,擦/写程序不能直接在Flash中运行,需要移到RAM中运行。

我的问题是,对于XEP100系列的单片机,是不是在操作FLASH时也必须按以上方案来执行?

这里的块应该是指BLOCK,不是指PAGE,不过不知道哪些PAGE是划分在BLOCK0,哪些是划分在BLOCK1中的,这个数据手册上我还没找到。

把代码数组改了半天,终于在XEP100上面也能正常编程FLASH了

const U08 P[18] = { 0x18, 0x0B, 0x80, 0x01, 0x06, 0xF6, 0x01, 0x06, 0x87, 0x87, 0xC4, 0x80, 0x8C, 0x00, 0x00, 0x27, 0xF4, 0x3D };

[此贴子已经被作者于2008-10-7 16:28:22编辑过]

返回列表