| 
 
| 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 /> | 
 |