我用HC908GP32,要在程序运行中烧写一段FLASH,现在只能用C+汇编来完成(本来想全用C的,可惜)。方法如下:
1、将擦写程序(只写了一个字节)定义在一个特定的区中,ROM的0x8080开始,长度要自己计算出来(可以先定义得很长,在仿真时看看长度就OK)
#pragma CODE_SEG APLICATION_ROM
void Store_id(void)
{
unsigned char i;
//erase
FLCR1 = 0x2;
FLBPR ;
IDFlash = 0;//要擦写的ROM地址
for(i=0;i<6;i++);//10us
FLCR1 = 0xa;
for(i=0;i<250;i++);//1ms
for(i=0;i<250;i++);
FLCR1 = 0x8;
for(i=0;i<3;i++);//5us
FLCR1 = 0;
for(i=0;i<5;i++);//1us
//write
FLCR1 = 1;
FLBPR ;
IDFlash = 0;
for(i=0;i<6;i++);//10us
FLCR1 = 0x9;
for(i=0;i<3;i++);//5us
IDFlash = IDSetBuf;//要赋的值
for(i=0;i<16;i++);//30us
FLCR1 = 0x8;
for(i=0;i<3;i++);//5us
FLCR1 = 0;
for(i=0;i<2;i++);//1us
}
#pragma CODE_SEG DEFAULT
2、将汇编的搬运程序定义在默认ROM中
#define Erase1Page 0x8080//源ROM
#define Erase1PageEND 0x8102
#define P_AddressInRAM 0x01b0//目的RAM
void CopySub(void)
{
unsigned char I1;//计数
I1 = 0;
asm{
LDHX #Erase1Page
MoveToRAM1:
LDA ,X
PSHH
PSHX
CLRH
LDX I1
STA P_AddressInRAM,X
}
I1++ ;//INC I1
asm{
PULX
PULH
AIX #$1
CPHX #Erase1PageEND
BLO MoveToRAM1
//开始执行擦写程序
TPA //CCR->A
PSHA //A进栈,保护中断允许标志
SEI //关中断
JSR P_AddressInRAM //跳到擦写程序
PULA //出栈
TAP //A->CCR,即将关中断前的标志数值赋回
RTS
}
}
3、在PRM中定义了烧写程序的地址
SEGMENTS
Z_RAM = READ_WRITE 0x0040 TO 0x0067;
RAM = READ_WRITE 0x0068 TO 0x019F;
APL_ROM = READ_ONLY 0x8080 TO 0x81FF;
ROM = READ_ONLY 0x8200 TO 0xFDFF;
END
PLACEMENT
DEFAULT_ROM INTO ROM;
DEFAULT_RAM INTO RAM;
_DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;
APLICATION_ROM INTO APL_ROM;
END
4、要注意编译选项中优化的参数。因为没有地方调用Store_id(),编译也许会没有任何代码,可以用条件语句加上,如if(IDSetBuf==5) Store_id();,只要if条件永不会成立即可。
5、FLBPR的赋值实在是弄不清楚了,英文书也太厚了,因为它在FDFF之后的系统ROM中,用一般CONST的赋值方法好象不行(有专家帮忙出例子吗),我直接将S19代码插入来解决的。
如:
S113FCC0500445034E4D510645034E4E52141D8AB1//程序
S104FCD080AF
S104FF7EE29C//地址保护寄存器FF7EH
S105FFE0FB958B
S105FFE4FBEB31
S105FFFAFCAE57
S105FFFEF1000C
S9030000FC
大家可以看到,基本上按地址从小到大排列的,S1指数据,04表后接的数量,E2是数值,9C是校验码。
04+FF+7E+E2=263H
FF-63=9C就完了。
另外我还想了另外一种方法,就是把擦写程序(纯C的)和主程序分开编译,再COPY到一起(就象上面5提到的ROM赋值)。在主程序中定义擦写程序的地址在RAM中,所以上电后先运行搬运程序,将擦写程序搬到RAM,以后就可以直接用了。但我自己没有试验。
另外,提一下,资料都是英文的,也没有各种功能的样例程序,实在太不方便了。象ARM就有很好的样例程序,照搬就行,真是苦呀——看英文。
[em01]
[此贴子已经被作者于2005-3-18 16:22:26编辑过]
[此贴子已经被作者于2005-3-23 12:50:45编辑过] |