PIC24F读写FLASH功能
Microchip的官方资料里,PIC24F系列RTSP对FLASH的读写存在问题。
NVMCON中NVMOP操作,只有_NVMOP = 0001和0010两个操作可测试通过,另外两个操作在SIM仿真的时候报错。
我写了几段代码,主要是为了保存系统参数的,只对FLASH的24位中LB UB两个字节进行操作。
因为asm()经过编译产生的汇编指令会对WREG0进行覆盖而造成FlashAddr的值被Dest地址覆盖,所以FlashErasePage和FlashWriteData两个函数中又另外定义了temp16,保证执行tblrdl和tblrdh指令时WREG0内是FlashAddr的内容。
void FlashReadData(UINT16 FlashAddr,UINT8 *Dest,UINT8 DataNum)
{
TBLPAG = 0x00;
for(;DataNum>0;DataNum--){
asm("tblrdl.b [%1],%0":"=r"(*Dest):"r"(FlashAddr));
Dest++;
asm("tblrdh.b [%1],%0":"=r"(*Dest):"r"(FlashAddr));
Dest++;
FlashAddr += 2;
}
}
void FlashErasePage(UINT16 FlashAddr)
{
UINT16 temp16;
NVMCON = FLASHERASEPAGE;
TBLPAG = 0x00;
temp16 = FlashAddr;
asm("tblwtl w0,[w0]");
NVMKEY = 0x55;
NVMKEY = 0xaa;
_WR = 1;
Nop();
Nop();
}
void FlashWriteData(UINT16 FlashAddr,UINT8 *Dest,UINT8 DataNum)
{
UINT16 temp16;
NVMCON = FLASHERASEPAGE;
TBLPAG = 0x00;
temp16 = FlashAddr;
asm("tblwtl w0,[w0]");
NVMKEY = 0x55;
NVMKEY = 0xaa;
_WR = 1;
Nop();
Nop();
NVMCON = FLASHPROGLINE;
TBLPAG = 0x00;
for(;DataNum>0;DataNum--){
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();
}
程序验证过功能正常,有没有大虾帮忙精简一下。