我的目的是想练习使用一下flash的掉电不丢失功能,通过八位led灯指示数据t,按下按键s1时t的值会变化,然后将变化后的值存入flash中,下次上电后通过按下按键s2时读出上次存的值让led灯显示出来,程序如下有些问题,可能是我c语言指针部分学的不太好。请大家帮我看一下谢谢
#include "msp430x14x.h" #define P 0x1080
//flash初始化 void flashinit(void) { FCTL2=FWKEY+FSSEL_1+FN3+FN4;//安全键值+时钟源+25分频 } //写一个字节 void FLASH_Writeb(unsigned int *Address,unsigned char nValue) { FCTL1=FWKEY+WRT;//安全键值+WRT为编程位设为1为编程 FCTL1=FWKEY; while((FCTL3&BUSY)==BUSY);//等待FLASH存储器完成操作 *Address=nValue; FCTL1=FWKEY; //WRT=1 FCTL3=FWKEY+LOCK; //LOCK=1 while((FCTL3&BUSY)==BUSY);//等待FLASH存储器完成操作 } //将FLASH里面的内容擦除掉 void FLASH_Erase(unsigned int *Address) { FCTL3=FWKEY; //LOCK=0 while(FCTL3&BUSY==BUSY);//等待FLASH存储器完成操作 FCTL1=FWKEY+ERASE; //ERASE=1 *Address=0; //向段内地址任意写,启动擦出操作 FCTL1=FWKEY; FCTL3=FWKEY+LOCK; while((FCTL3&BUSY)==BUSY); //等待FLASH存储器完成操作 }
//读一个字节 unsigned char FLASH_Readb(unsigned int *Address) { unsigned char Rdata; Rdata=*Address; return Rdata; } void delay(void) { unsigned int tmp; for(tmp = 18000;tmp > 0;tmp--); } void main( void ) { unsigned int t; unsigned char Rdata;
unsigned int *P; WDTCTL = WDTPW + WDTHOLD; t=0x00; P2DIR=0XFF; P5DIR=0XFF; P1DIR=0XF0; flashinit();
while(1) { P2OUT=t; if((P1IN&0x0f)==0x0e) { delay(); if((P1IN&0x0f)==0x0e) { while(P1IN&0X0F==0X0E); t++; FLASH_Erase(*Address); FLASH_Writeb(*Address,t); } } if((P1IN&0x0f)==0x0d) { delay(); if((P1IN&0x0f)==0x0d) { while(P1IN&0X0F==0X0d); FLASH_Readb(*Address); t=Rdata; } } }
}
我的问题可能也比较明朗,就是在主函数里我不会调用上面的子函数,编译后也是那三行红色的代码有问题,请大家告诉我正确的调用语句是怎样的,另外flash里面写数据的地址不是任意的吗,所以我在一开始宏定义了指针p的地址不知道对不对?谢谢
|