⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 programeedata.c

📁 《dsPIC通用数字信号控制器原理及应用》源码
💻 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 + -