FLASH操作的工具函数,大家给点评价与意见,:)

[复制链接]
2118|1
 楼主| 梁溪河畔 发表于 2008-3-29 09:31 | 显示全部楼层 |阅读模式
CPU&nbsp;用的是2812,FLASH为AM29LV160DT(一片)<br /><br /><br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(addr,data)&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;INT16U*)(addr))&nbsp;=&nbsp;(INT16U)data<br /><br />/*&nbsp;---------------------------------------------------------------------<br />*&nbsp;&nbsp;&nbsp;函&nbsp;数&nbsp;名:&nbsp;&nbsp;waitForOperationEnd<br />*&nbsp;&nbsp;&nbsp;函数描述:&nbsp;等待操作结束<br />*&nbsp;----------------------------------------------------------------------*/<br />BOOL&nbsp;waitForOperationEnd(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;INT32U&nbsp;addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;&nbsp;&nbsp;&nbsp;finish**&nbsp;=&nbsp;FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT16U&nbsp;dq5Counter&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;INT16U&nbsp;oldStatus,newStatus;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;addr&nbsp;=&nbsp;0x101000;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;根据DQ6&nbsp;&nbsp;和DQ5&nbsp;&nbsp;判断操作是否完成*/<br />&nbsp;&nbsp;&nbsp;&nbsp;oldStatus&nbsp;=&nbsp;*((volatile&nbsp;INT16U&nbsp;*)addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newStatus&nbsp;=&nbsp;*((volatile&nbsp;INT16U&nbsp;*)addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;(oldStatus&nbsp;&&nbsp;0x40)&nbsp;==&nbsp;(newStatus&nbsp;&&nbsp;0x40)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finish**&nbsp;=&nbsp;TRUE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;(newStatus&nbsp;&&nbsp;0x20)&nbsp;!=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(dq5Counter&nbsp;++&nbsp;&gt=&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finish**&nbsp;=&nbsp;FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oldStatus&nbsp;=&nbsp;newStatus;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return(finish**);<br />}<br />/*&nbsp;---------------------------------------------------------------------<br />*&nbsp;&nbsp;&nbsp;函&nbsp;数&nbsp;名:&nbsp;&nbsp;addrConvert<br />*&nbsp;&nbsp;&nbsp;函数描述:&nbsp;将0~1m的虚拟地址转化为实际地址<br />*&nbsp;----------------------------------------------------------------------*/<br />INT32U&nbsp;&nbsp;&nbsp;&nbsp;addrConvert(INT32U&nbsp;virtualAddr)<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT32U&nbsp;realAddr;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(virtualAddr&nbsp;&lt&nbsp;0x80000)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GpioDataRegs.GPFDAT.bit.GPIOF14&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realAddr&nbsp;=&nbsp;virtualAddr&nbsp;+&nbsp;0x100000;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(virtualAddr&nbsp;&lt0x100000)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GpioDataRegs.GPFDAT.bit.GPIOF14&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realAddr&nbsp;=&nbsp;virtualAddr&nbsp;+&nbsp;0x100000&nbsp;-&nbsp;0x80000;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;大于1m&nbsp;则取1m&nbsp;对应的实际地址*/<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GpioDataRegs.GPFDAT.bit.GPIOF14&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realAddr&nbsp;=&nbsp;0x17ffff;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(realAddr);<br />}<br /><br />/*&nbsp;---------------------------------------------------------------------<br />*&nbsp;&nbsp;&nbsp;函&nbsp;数&nbsp;名:&nbsp;&nbsp;wordRead<br />*&nbsp;&nbsp;&nbsp;函数描述:&nbsp;从flash&nbsp;&nbsp;&nbsp;指定地址中读字<br />*&nbsp;----------------------------------------------------------------------*/<br />INT16U&nbsp;wordRead(INT32U&nbsp;&nbsp;virtualAddr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;INT32U&nbsp;&nbsp;&nbsp;&nbsp;addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;addr&nbsp;=&nbsp;addrConvert(virtualAddr);<br />&nbsp;&nbsp;&nbsp;&nbsp;return(&nbsp;*((volatile&nbsp;unsigned&nbsp;int&nbsp;*)(addr))&nbsp;);<br />}<br />/*&nbsp;---------------------------------------------------------------------<br />*&nbsp;&nbsp;&nbsp;函&nbsp;数&nbsp;名:&nbsp;&nbsp;wordWrite<br />*&nbsp;&nbsp;&nbsp;函数描述:&nbsp;向flash&nbsp;&nbsp;&nbsp;指定地址中写字<br />*&nbsp;----------------------------------------------------------------------*/<br />BOOL&nbsp;wordWrite&nbsp;(&nbsp;INT32U&nbsp;virtualAddr,&nbsp;INT16U&nbsp;data)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;INT32U&nbsp;&nbsp;&nbsp;&nbsp;addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;&nbsp;&nbsp;&nbsp;finish**&nbsp;=&nbsp;FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT16U&nbsp;&nbsp;&nbsp;&nbsp;a19Status&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;addr&nbsp;=&nbsp;addrConvert(virtualAddr);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;a19Status&nbsp;=&nbsp;GpioDataRegs.GPFDAT.bit.GPIOF14&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;GpioDataRegs.GPFDAT.bit.GPIOF14&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(0x555+0x100000,&nbsp;0xAA);<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(0x2AA+0x100000,&nbsp;0x55);<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(0x555+0x100000,&nbsp;0xA0);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;GpioDataRegs.GPFDAT.bit.GPIOF14&nbsp;=&nbsp;a19Status;<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(addr,&nbsp;data);<br />&nbsp;&nbsp;&nbsp;&nbsp;finish**&nbsp;=&nbsp;waitForOperationEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(finish**);<br />}<br />/*&nbsp;---------------------------------------------------------------------<br />*&nbsp;&nbsp;&nbsp;函&nbsp;数&nbsp;名:&nbsp;&nbsp;sectorErase<br />*&nbsp;&nbsp;&nbsp;函数描述:&nbsp;擦除指定扇区<br />*&nbsp;----------------------------------------------------------------------*/<br />BOOL&nbsp;sectorErase(INT32U&nbsp;virtualSectorAddr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;INT32U&nbsp;&nbsp;&nbsp;&nbsp;sectorAddr;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT16U&nbsp;&nbsp;&nbsp;&nbsp;a19Status&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;&nbsp;&nbsp;&nbsp;finish**&nbsp;=&nbsp;FALSE;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;sectorAddr&nbsp;=&nbsp;addrConvert(virtualSectorAddr);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;a19Status&nbsp;=&nbsp;GpioDataRegs.GPFDAT.bit.GPIOF14&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;GpioDataRegs.GPFDAT.bit.GPIOF14&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(0x555+0x100000,&nbsp;0xAA);<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(0x2AA+0x100000,&nbsp;0x55);<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(0x555+0x100000,&nbsp;0x80);<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(0x555+0x100000,&nbsp;0xAA);<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(0x2AA+0x100000,&nbsp;0x55);<br />&nbsp;&nbsp;&nbsp;&nbsp;GpioDataRegs.GPFDAT.bit.GPIOF14&nbsp;=&nbsp;a19Status;<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(sectorAddr,&nbsp;0x30);<br />&nbsp;&nbsp;&nbsp;&nbsp;finish**&nbsp;=&nbsp;waitForOperationEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(finish**);<br />}<br />/*&nbsp;---------------------------------------------------------------------<br />*&nbsp;&nbsp;&nbsp;函&nbsp;数&nbsp;名:&nbsp;&nbsp;chipErase<br />*&nbsp;&nbsp;&nbsp;函数描述:&nbsp;擦除整片<br />*&nbsp;----------------------------------------------------------------------*/<br />BOOL&nbsp;chipErase(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;&nbsp;&nbsp;&nbsp;finish**&nbsp;=&nbsp;FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;GpioDataRegs.GPFDAT.bit.GPIOF14&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(0x555+0x100000,&nbsp;0xAA);<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(0x2AA+0x100000,&nbsp;0x55);<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(0x555+0x100000,&nbsp;0x80);<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(0x555+0x100000,&nbsp;0xAA);<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(0x2AA+0x100000,&nbsp;0x55);<br />&nbsp;&nbsp;&nbsp;&nbsp;WRITE_FLASH(0x555+0x100000,&nbsp;0x10);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;finish**&nbsp;=&nbsp;waitForOperationEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;return(finish**);<br />}<br />/*&nbsp;---------------------------------------------------------------------<br />*&nbsp;&nbsp;&nbsp;函&nbsp;数&nbsp;名:&nbsp;&nbsp;pointSector<br />*&nbsp;&nbsp;&nbsp;函数描述:&nbsp;找到virtualAddr&nbsp;&nbsp;所在的扇区地址<br />*&nbsp;----------------------------------------------------------------------*/<br />INT32U&nbsp;pointSector(INT32U&nbsp;virtualAddr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;INT32U&nbsp;sectorAddr&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(virtualAddr&nbsp;&lt&nbsp;0xF8000)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sectorAddr&nbsp;=&nbsp;(virtualAddr&nbsp;&gt&gt&nbsp;15)&nbsp;&lt&lt&nbsp;15;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(virtualAddr&nbsp;&lt&nbsp;0xFC000)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sectorAddr&nbsp;=&nbsp;0xF8000;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(virtualAddr&nbsp;&lt&nbsp;0xFD000)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sectorAddr&nbsp;=&nbsp;0xFC000;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(virtualAddr&nbsp;&lt&nbsp;0xFE000)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sectorAddr&nbsp;=&nbsp;0xFD000;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sectorAddr&nbsp;=&nbsp;0xFE000;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return(sectorAddr);<br />}<br /><br />
 楼主| 梁溪河畔 发表于 2008-3-29 09:34 | 显示全部楼层

GPIOF14连了最高地址线

GPIOF14连了最高地址线&nbsp;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

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