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