在LZ的基础上,修改成支持大于64K地址的读写FLASH功能
#include "p24Fxxxx.h"
#define UINT32 unsigned long
#define UINT16 unsigned int
#define UINT8 unsigned char
#define FLASH_ERASEPAGE 0x4042
#define FLASH_PROGLINE 0x4001
void FlashReadData(UINT32 FlashAddr,UINT8 *Dest,UINT8 DataNum)
{
TBLPAG = ((FlashAddr & 0x7F0000)>>16);
FlashAddr = (FlashAddr & 0x00FFFF);
for(;DataNum>0;DataNum-=2)
{
asm("tblrdl.b [%1],%0":"=r"(*Dest):"r"(FlashAddr));
Dest++;
asm("tblrdh.b [%1],%0":"=r"(*Dest):"r"(FlashAddr));
Dest++;
FlashAddr += 2;
}
}
void FlashErasePage(UINT32 FlashAddr)
{
NVMCON = FLASH_ERASEPAGE;
TBLPAG = ((FlashAddr & 0x7F0000)>>16);
FlashAddr = (FlashAddr & 0x00FFFF);
asm("tblwtl w0,[w0]");
NVMKEY = 0x55;
NVMKEY = 0xaa;
_WR = 1;
Nop();
Nop();
}
void FlashWriteData(UINT32 FlashAddr,UINT8 *Dest,UINT8 DataNum)
{
FlashErasePage(FlashAddr);
NVMCON = FLASH_PROGLINE;
TBLPAG = ((FlashAddr & 0x7F0000)>>16);
FlashAddr = (FlashAddr & 0x00FFFF);
for(;DataNum>0;DataNum-=2)
{
asm("tblwtl.b %0,[%1]"::"r"(*Dest),"d"(FlashAddr));
Dest++;
asm("tblwth.b %0,[%1]"::"r"(*Dest),"d"(FlashAddr));
Dest++;
FlashAddr += 2;
}
NVMKEY = 0x55;
NVMKEY = 0xaa;
_WR = 1;
Nop();
Nop();
}