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