📄 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 + -