诸位大侠我的这段eeprom的程序在app009开发板上调试时,我设计的是先写入ee一个数,再读出来,判断读的是那个数,点亮相应的led,现在读写这有问题谁帮我看一下谢谢 #include<p30f4011.h> #include<math.h> int failmemory[40];
int a,b;//EE读写地址 int *eew_data,*eer_data;//EE读,写指针
int medium;//中转寄存器
int led;
void InitializeSys()//程序初始化 { INTCON1 = 0x0000; //关中断 INTCON2 = 0x0000; IEC0 = 0x0000; //IECx中断禁止 IEC1 = 0x0000; IEC2 = 0x0000; TRISEbits.TRISE0=0; TRISEbits.TRISE1=0; TRISEbits.TRISE2=0; TRISEbits.TRISE3=0; TRISEbits.TRISE4=0; TRISEbits.TRISE5=0; TRISEbits.TRISE8=0; TRISBbits.TRISB3=0; TRISBbits.TRISB4=0; TRISBbits.TRISB5=0;//模拟输入出端口
}
//*****************擦除FLASH EEPROM的一个字子程序*************************** void ex_write() { NVMCON=0x4044;//WR,REN,WRERR,xxxxx,PROGOP<7:0> // 0, 1, 0,00000, 44 //写(编程或擦除)控制位'1写', //写(擦除或编程)使能位 //闪存错误标志位 //未用,用户代码应该在这些单元中写入0 //编程操作命令字节位 //擦除操作: //0x41 = 从程序闪存中的一个板擦除1 行(32 个指令字) //0x44 = 从数据闪存擦除1 个数据字 //0x45 = 从数据闪存擦除1 行(16 个数据字) //编程操作: //0x01 = 将1 行(32 指令字)编程入闪存程序存储器 //0x04 = 将1 个数据字编入数据EEPROM //0x05 = 将1 行(16 个数据字)编程入数据EEPROM //0x08 = 将1 个数据字编程入器件配置寄存器
IFS0bits.NVMIF=0;//中断标志状态寄存器0,非易失性存储器写完成中断标志状态位,未发生中断请求 IEC0bits.NVMIE=0;//中断允许控制寄存器0,非易失性存储器写完成中断允许位,不允许中断请求 NVMKEY=0x55;//防止EEPROM的误写/误擦除, NVMKEY=0xaa; NVMCONbits.WR=1;//控制开始eeprom写,只能由硬件清‘0’ __asm__( "NOP");//插入两个指令周期的等待时间,单片机将读取指定单元内容,并且放入EEDATA中 __asm__( "NOP"); while (IFS0bits.NVMIF==0){;}//在写操作完成时,IFS0 寄存器中的中断标志位NVMIF 将置1。它必须用软件清零。 IFS0bits.NVMIF=0; } //*****************写EEPROM子程序*************************这里是不是应该写入一个数,在读eeprom拿来判断这个数,是led亮,不是led不亮 void ee_write() { __asm__( "MOV 0x0850,W1 " );//指针指向的地址,a的地址 __asm__( "TBLWTL W1,[W0]");
NVMCON=0x4004; IFS0bits.NVMIF=0; IEC0bits.NVMIE=0; NVMKEY=0x55; NVMKEY=0xaa; NVMCONbits.WR=1; __asm__( "NOP"); __asm__( "NOP"); while (IFS0bits.NVMIF==0){;} IFS0bits.NVMIF=0; }
//*****************读EEPROM子程序************************** void ee_read() { __asm__( "MOV #tblpage(0x7ffc02),W0" ); __asm__( "MOV W0,TBLPAG" ); __asm__( "MOV #tbloffset(0x7ffc02),W0"); __asm__( "TBLRDL [W0], W4 " ); __asm__( "MOV W4,0x0852"); led=*eer_data; } //*********************延时****************************** void delay_1ms(int delay)// 1ms delay { unsigned int delay1, delay2; for(delay2=0;delay2<=delay;delay2++) {for(delay1=0;delay1<=10000;delay1++) ;} } //**************主程序************************** int main(void) { InitializeSys(); //系统初始化 eew_data=&a; //指针指向 eer_data=&b;
*eew_data=1; __asm__( "MOV #tblpage(0x7ffc02),W0" ); __asm__( "MOV W0,NVMADRU" ); __asm__( "MOV #tbloffset(0x7ffc02),W0"); __asm__( "MOV W0,NVMADR" ); ex_write(); __asm__( "MOV #tblpage(0x7ffc02),W0" ); __asm__( "MOV W0,TBLPAG" ); __asm__( "MOV #tbloffset(0x7ffc02),W0" ); ee_write();
delay_1ms(100);
ee_read();
if(led==1) { LATEbits.LATE0=1; LATEbits.LATE1=0;//亮 } else if(led==2) { LATEbits.LATE0=0; LATEbits.LATE1=1;//亮 } }
|