在Flash的编程与擦除操作中,代码都要在Ram中执行,如何将写与擦除代码拷到RAM中?ddtv兄曾发表过一贴: uchar FlashBuf[80]; uchar page_data; uchar Temp; uint page_addr;
void delayms(uint t); void delayus1(void); void do_write(void); void page_erase(void); void do_erase(void); //页写,最大32B void page_write(void) { FLCR_PGM = 1; //编程位 (void)(FLBPR == 0); //读FLASH保护寄存器 *(volatile uchar *)page_addr = 0x01; //向目标页写任意数 delayus1(); //tnvs>10us memcpy((void *)FlashBuf,(void *)do_write,(uint)page_erase-(uint)do_write); //flash程序考到RAM中 asm("ldhx FlashBuf"); //加载擦除程序在RAM区的首地址 asm("jsr ,X"); //执行RAM区域的擦除程序 }
//要在RAM中执行的页写程序 void do_write(void) { uchar i,j; FLCR_HVEN = 1; //高压位 delayus1(); //tpgs>5us
for(i=0;i<20;i++) //写20B { //数据送入flash地址 *((volatile uchar *)page_addr+i)= i; for (j=0;j<22;j++); //延时30us--40us,据说不能调用延时程序 }
FLCR_PGM = 0; //编程位 delayus1(); //tnvh>5us FLCR_HVEN = 0; //高压位 delayus1();// trcv>1us }
void delayus1(void) { Temp = 60; while(--Temp){} }
//页擦除程序,最小64B void page_erase(void) { FLCR_ERASE = 1; //擦除位 FLCR_MASS = 0; //整体擦除位 (void)(FLBPR == 0); //读FLASH保护寄存器
*(volatile uchar *)page_addr = 0; //写任意数 Temp = 20; while(--Temp){}; //延时 memcpy((void *)FlashBuf,(void *)do_erase,(uint)delay100us-(uint)do_erase); //flash程序考到RAM中 asm("ldhx FlashBuf"); //加载擦除程序在RAM区的首地址 asm("jsr ,X"); //执行RAM区域的擦除程序 }
void do_erase(void) { FLCR_HVEN = 1; //高压 delayms(4); //terase>4ms FLCR_ERASE = 0; Temp = 20; while(--Temp){}; //tnvh>5us FLCR_HVEN = 0; Temp = 10; while(--Temp){}; //Trcv>1us } void delayms(uint t) { uchar i; do { for(i=255; i>0; i--) {asm nop; asm nop;} }while(--t); }
void main(void) { page_addr = 0xde00; page_data = 0; page_erase(); page_write(); }
其中的 memcpy((void *)FlashBuf,(void *)do_erase,(uint)delay100us-(uint)do_erase); //flash程序考到RAM中 asm("ldhx FlashBuf"); //加载擦除程序在RAM区的首地址 asm("jsr ,X"); //执行RAM区域的擦除程序 这段程序甚是不解,哪位老师能给我提供如何将程序从Flash中拷到Ram的例程,非常感谢, 张老师能给我你的联系方式吗?我的QQ:120990401,msn:dianqi123@163.com,急切期待 |