?? programeedata.c
字號:
#include "p30f6014.h"
// 編程EEPROM時需用到的一些控制字
#define EE_ERASE_WORD_CODE 0x4044
#define EE_WRITE_WORD_CODE 0x4004
#define EE_ERASE_ROW_CODE 0x4045
#define EE_WRITE_ROW_CODE 0x4005
int failmemory[40];
// 在EEPROM中安排16個字的數據
int _EEDATA(32) ArrayInEEData[16] = {0,1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF};
// 在RAM中安排16個字的數據
int ArrayInRAM0[16] = {0xf,0xe,0xd,0xc,0xb,0xa,9,8,7,6,5,4,3,2,1,0};
int ArrayInRAM1[16];
// 初始化系統
void InitializeSys()
{
SRbits.IPL = 7; // 關閉所有可屏蔽中斷
}
// 通過表讀指令從EEPROM中讀一行數據至RAM
void ReadEEByTable(register int SourceAddr, register int OffsetAddr, int* DestArray)
{
unsigned char i;
//int DataTemp;
TBLPAG = SourceAddr;
for(i=0; i<16; i++)
{
__asm__("tblrdl [W1++],[W2++]");
}
}
// 通過使能PSV從EEPROM中讀一行數據至RAM
void ReadEEByPSV(register int PageAddr, int* DestArray)
{
unsigned char i;
PSVPAG = PageAddr;
for(i=0; i<16; i++)
{
DestArray[i] = ArrayInEEData[i];
}
}
//擦除EEPROM中指定的一行數據
void EraseEE(register int PageAddr, register int OffsetAddr)
{
NVMADRU = PageAddr;
NVMADR = OffsetAddr;
NVMCON = EE_ERASE_ROW_CODE; //配置NVMCON寄存器為擦除一行EEPROM
NVMKEY = 0x55; //寫密鑰序列
NVMKEY = 0xAA;
NVMCONbits.WR = 1; //開始擦除
while(NVMCONbits.WR == 1);
}
//向EEPROM中指定的行寫入一行數據
void WriteEE(register int PageAddr, register int OffsetAddr, int* SourceArray)
{
unsigned char i;
TBLPAG = PageAddr;
for(i=0; i<16; i++)
{
__asm__("tblwtl [W2++], [W1++]");
}
NVMCON = EE_WRITE_ROW_CODE;
NVMKEY = 0x55; //寫密鑰序列
NVMKEY = 0xAA;
NVMCONbits.WR = 1; //開始編程
while(NVMCONbits.WR = 1);
}
int main()
{
InitializeSys();
ReadEEByTable(__builtin_tblpage(&ArrayInEEData[0]), __builtin_tbloffset(&ArrayInEEData[0]), &ArrayInRAM1[0]);
CORCONbits.PSV = 1;
ReadEEByPSV(__builtin_psvpage(&ArrayInEEData[0]), &ArrayInRAM1[0]);
EraseEE(__builtin_tblpage(&ArrayInEEData[0]), __builtin_tbloffset(&ArrayInEEData[0]));
WriteEE(__builtin_tblpage(&ArrayInEEData[0]), __builtin_tbloffset(&ArrayInEEData[0]), &ArrayInRAM0[0]);
while(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -