HC08 Flash与Ram的编程问题,张老师

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

最好是C语言例程

最好是C语言例程,谢谢
张明峰 发表于 2007-5-21 21:34 | 显示全部楼层

HC08系列

HC08系列单片机片内都有固化了的ROM程序完成Flash的擦除和编程,请查阅某一单片机相关的文档找出ROM程序的入口地址直接调用即可。
 楼主| dianqi123 发表于 2007-5-23 15:58 | 显示全部楼层

如何找出ROM程序的入口地址?如何直接调用?

  
 楼主| dianqi123 发表于 2007-5-23 15:59 | 显示全部楼层

张老师能否举例说明一下啊

  
 楼主| dianqi123 发表于 2007-5-23 16:12 | 显示全部楼层

在CW3.1版本里,FLASH块寄存器FLBPR并没有定义

在CW3.1版本里,头文件里并没有对FLASH块寄存器FLBPR定义,但在读写的时候都要用到这个寄存器,如何用C语言对这个寄存器进行定义
张明峰 发表于 2007-5-27 06:42 | 显示全部楼层

看应用笔记AN1831

  <br /> 相关链接:<a href='http://www.freescale.com/files/microcontrollers/doc/app_note/AN1831.pdf?fpsp=1'>http://www.freescale.com/files/microcontrollers/doc/app_note/AN1831.pdf?fpsp=1</a>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

19

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部