<?xml version="1.0" encoding="gbk"?> <rss version="2.0"><channel> <title>定阅帖子更新</title> <link>http://www.broadkey.com.cn/XML.ASP</link><description>TEAM Board - 意得法电子</description> <copyright>TEAM 2.0.5 Release</copyright><generator>TEAM Board by TEAM5.Cn Studio</generator> <ttl>30</ttl><item><link>http://www.broadkey.com.cn/Thread.asp?tid=37 </link><title>MCF52233_CFM</title><author>ellen</author><pubDate>2009-11-24 20:44:45</pubDate><description><![CDATA[<p>MCF52233_CFM&mdash;&mdash;Coldfire Flash Module</p>
<p>　　Coldfire的CFM功能是把它的flash当作EEPROM来用。使用起来还是很方便的，只要完成几个小的功能函数就行了：</p>
<p>　　第一个是CFM的初始化CFM_init()，完成时钟的设置；</p>
<p>　　第二个是页擦除CFM_Page_eraser()，完成一页的擦除工作，Coldfire的256K flash被分成128页，每2K为1页，只有在擦除后才能正确地向一个地址中写入数据；</p>
<p>　　第三个是CFM_Write(),完成向某地址写入数据的功能，Coldfire的CFM是按字操作的，以4B为一个最小单位。</p>
<p>　　CFM有5个CMD：Blank Check 、Pageerase verify、 Word program 、Page erase 、Mass erase但只要其中Word program 、Page erase 两个就能满足一般的使用了。</p>
<p>　　在使用CFM功能时对它的地址这块可能会有些迷惑，这里简单介绍下：MCF52233有256K的flash，默认情况下起始地址是0x44000000(#define CFM_IPS_FLASH_ADDR &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x44000000)，我们不能在存有程序的地方擦、写数据，最简单的办法就是在flash的最后面操作，这样就不要考虑烧进去的程序结束的位置了。起始地址加上256K得到最后一个存储单元的地址即#define FLASH_END_ADDRESS　CFM_IPS_FLASH_ADDR+0x40000)，我们就从FLASH_END_ADDRESS&nbsp;开始往前写我们的数据。</p>
<p>　　最后一点就是怎样读我们写的数据，其实非常简单，用read_data=(*(uint32 *))(address)就将address处的数据赋给了read_data；同样，在写数据的时候会用到(*(uint32))(address)=write_data来将数据写到address地址处。</p>
<p>程序如下：</p>
<p>uint8 CFM_init(unsigned long FlashClk)<br />
{<br />
&nbsp;unsigned char fclk_val;<br />
&nbsp;<br />
&nbsp;if ((MCF_CFM_CFMCLKD &amp; MCF_CFM_CFMCLKD_DIVLD)==0)<br />
&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp; //Initialize FCLKDIV register to ensure we can program/erase */<br />
&nbsp;&nbsp;&nbsp;fclk_val = (unsigned char)(FlashClk/8/200-1);<br />
&nbsp;&nbsp;&nbsp;MCF_CFM_CFMCLKD |= MCF_CFM_CFMCLKD_DIV(fclk_val)</p>
<p>&nbsp; 　　　　　　　　　　　&nbsp;| MCF_CFM_CFMCLKD_PRDIV8;<br />
&nbsp;}</p>
<p>&nbsp;//Disable all protection (if LOCK not set)*/<br />
&nbsp;MCF_CFM_CFMPROT=0;<br />
&nbsp;<br />
&nbsp;//Clear any errors&nbsp;<br />
&nbsp;MCF_CFM_CFMUSTAT |=MCF_CFM_CFMUSTAT_PVIOL</p>
<p>　　　　　　　　　　　　|MCF_CFM_CFMUSTAT_ACCERR;<br />
&nbsp;return 0;<br />
}<br />
&nbsp;</p>
<p>uint8 CFM_page_erase(unsigned char page)<br />
{<br />
&nbsp;while (!(MCF_CFM_CFMUSTAT&amp;MCF_CFM_CFMUSTAT_CBEIF));</p>
<p>&nbsp;//Clear any errors&nbsp;<br />
&nbsp;MCF_CFM_CFMUSTAT =MCF_CFM_CFMUSTAT_PVIOL</p>
<p>　　　　　　　　　　　　|MCF_CFM_CFMUSTAT_ACCERR;<br />
&nbsp;<br />
&nbsp;(*(vuint32*)(FLASH_START_ADDRESS+page*0x800))=1;<br />
&nbsp;<br />
&nbsp;MCF_CFM_CFMCMD=MCF_CFM_CFMCMD_PAGE_ERASE;<br />
&nbsp;//Launch CMD<br />
&nbsp;MCF_CFM_CFMUSTAT=MCF_CFM_CFMUSTAT_CBEIF;<br />
&nbsp;//wait for complete and check result<br />
&nbsp;while(!(MCF_CFM_CFMUSTAT&amp;MCF_CFM_CFMUSTAT_CCIF))<br />
&nbsp;{<br />
&nbsp;&nbsp;if(MCF_CFM_CFMUSTAT&amp;MCF_CFM_CFMUSTAT_PVIOL) return 0;&nbsp;<br />
&nbsp;}<br />
&nbsp;if(MCF_CFM_CFMUSTAT&amp;MCF_CFM_CFMUSTAT_ACCERR) return 0;<br />
&nbsp;return 1;<br />
}</p>
<p>uint8 CFM_write(unsigned int address ,unsigned int data)<br />
{<br />
&nbsp;if((uint32)address&amp;0x00000001) return 0;<br />
&nbsp;//Clear any errors<br />
&nbsp;MCF_CFM_CFMUSTAT=MCF_CFM_CFMUSTAT_PVIOL</p>
<p>　　　　　　　　　　　|MCF_CFM_CFMUSTAT_ACCERR;<br />
&nbsp;<br />
&nbsp;(*(vuint32*)(FLASH_END_ADDRESS-4-address))=data;<br />
&nbsp;//launch command<br />
&nbsp;MCF_CFM_CFMCMD=MCF_CFM_CFMCMD_WORD_PROGRAM;<br />
&nbsp;MCF_CFM_CFMUSTAT=MCF_CFM_CFMUSTAT_CBEIF;<br />
&nbsp;//wait for complete and check result<br />
&nbsp;while(!(MCF_CFM_CFMUSTAT&amp;MCF_CFM_CFMUSTAT_CCIF))<br />
&nbsp;{<br />
&nbsp;&nbsp;if(MCF_CFM_CFMUSTAT&amp;MCF_CFM_CFMUSTAT_PVIOL) return 0;<br />
&nbsp;}<br />
&nbsp;if(MCF_CFM_CFMUSTAT&amp;MCF_CFM_CFMUSTAT_ACCERR) return 0;<br />
&nbsp;return 1;<br />
}</p>]]></description></item></channel></rss>