首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

mc9s12dg128的eeprom

mc9s12dg128的eeprom

程序如下,不掉电的时候,pro_number递增,但是掉电后pro_number总是从0开始,也就是说pro_number没有保存,那么EEPROM就没实现掉电保存的功能,请问出现了什么问题。除了主程序中有INITEE=0x21,在prm文件中不知道怎么去设置eeprom的起始地址。

#define Dump 0xFFFF
#define EEPROM_ADDR_BASE ((volatile uint *)0x2000)
#define ee_word_program 0x20 // 字编程
#define ee_word_erase 0x40 // 字擦除
#define ee_sector_erase 0x41 // 全部擦除
#define ee_sector_Modify 0x60 //modify with sector

void EEPROM_init(void)
{
ECLKDIV=0x4B; // 采用8分频,因为OSCLK=16M,又为了使ECLK
// 达到190KHZ,所以EDIV=11,即ECLK=16M/8*11=190.5KHZ
ECNFG=0x00; // 禁止EEPROM相关操作的中断
while(ECLKDIV_EDIVLD == 0); // 等待时钟设置成功
EPROT_EPOPEN=1; // EEPROM没有保护,可以进行编程与擦除
EPROT_EPDIS=1; // EEPROM保护禁止
}
void EEPROM_write_operate(int * Addr,int Data,char OpType)
{
DisableInterrupts;
while(ESTAT_ACCERR==1||ESTAT_PVIOL==1);
while(ESTAT_CBEIF == 0); // 等待EEPROM命令缓冲区为空
*Addr=Data; // 设置EEPROM的偏移地址
ECMD=OpType; // 指令的类型
ESTAT |= 0x80; // 清命令缓冲标志,开始执行命令
while(ESTAT_CCIF == 0); // 等待命令完成
EnableInterrupts;
}
int EEPROM_read_operate(int * Addr)
{
int TempData;
DisableInterrupts;
TempData=*Addr; // 读EEPROM的偏移地址的数据
return(TempData);
DisableInterrupts;
}

int select_pro(void)
{
int pro_num=0;
pro_num=EEPROM_read_operate(EEPROM_ADDR_BASE+0x200);//读取上次保存的 pro_num值
if(pro_num>9)// pro_num大于9归零
pro_num=0;
else pro_num+=1;//否则 pro_num加1
EEPROM_write_operate(EEPROM_ADDR_BASE+0x200,Dump,ee_word_erase);// pro_num写到eeprom里去
EEPROM_write_operate(EEPROM_ADDR_BASE+0x200,pro_num,ee_word_program);
return pro_num;
}

void main(void)

{

int pro_number;

INITEE=0x21;

pro_number=select_pro();

}

论坛有相关的帖子,你可以找一下,

个人BLOG:http://blog.eccn.com/u/107300/index.htm
返回列表