/*函数说明 * 1.void EarseFlash(unsigned int addr) * * Flash擦除子程序 * * 2.void WriteFlash(unsigned int addr) * * Flash写入子程序 */
#include <hidef.h> /* for EnableInterrupts macro */ #include <MC68HC908MR32.h> /* include peripheral declarations */ #include <String.h>
//内存变量声明 unsigned int *PrgBeginAddr,*PrgEndAddr; //PrgBeginAddr 程序开始地址 PrgEndAddr 程序结束地址 unsigned int faddr;
unsigned char PrgOfRam[10]; //要移到内存种的程序 存放擦/写FLASH程序以便执行
// 疑问: 如果定义成写成PrgOfRam[],不定义数组大小,下面这两种写法都会报错 // // memcpy((void *)PrgOfRam[0],(void *)PrgBeginAddr,PrgEndAddr-PrgBeginAddr); // memcpy((void *)PrgOfRam[],(void *)PrgBeginAddr,PrgEndAddr-PrgBeginAddr); // 而C语言中 是允许 不定义数组大小的 。
int PrgBytes; // 要移到内存中的程序字节数 , 调试用。
byte N ;
//内部调用函数声明
void DoEraseFlash(void); void EraseFlashEnd(void);
/*EarseFlash:擦除指定flash的一页-----------------------* *功 能:擦除以addr为首地址的flash一页 * *参 数:addr要擦除的首地址 * *返 回:无 * *-----------------------------------------------------*/ void EarseFlash(unsigned int addr) { faddr=addr; //擦除flash的首地址 //将擦除程序从Flash区拷贝到RAM区PrgOfRam // asm { ldhx DoEarseFlash }; //擦除程序的首地址->HX 汇编写法,可以调试通过 // asm { sthx PrgBeginAddr}; //HX->rgBegInAddr, 这种写法有限制,经测试,PrgBegInAddr 要分配 //在零页才能调试通过,所以 这两条我改用C 来写 (void*)PrgBeginAddr=DoEraseFlash ; // asm { ldhx EarseFlashEnd}; //读擦除程序的结束地址->HX // asm { sthx PrgEndAddr} ; // 这两条语句也改成 C 语言的, 原因同上 (void*)PrgEndAddr=EraseFlashEnd; PrgBytes=PrgEndAddr-PrgBeginAddr; // 计算要移动的程序字节数 // 编译器 分配的地址 PrgBeginAddr :0x8104 // PrgEndAddr :0x813b // // 0x813b-0x8104 应该是 0x37 10进制 55 // 可是实际的结果是 0x1b 10进制 27 // 但步运行 汇编码,发现编译后的汇编码在做完减法后 // 又执行了一段除法操作,所以结果才不对的。 |