程序如下,不掉电的时候,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(); } |