我的目的是想练习使用一下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的地址不知道对不对?谢谢
LZ你好,
先赞下LZ,代码贴的很清晰。
void FLASH_Writeb(unsigned int *Address,unsigned char nValue)
LZ想问的是这句如何调用吧。
两个参数,一个是地址,一个是数据。
但是unsigned int *Address。*是间接访问符,指向地址所在的数据,就像*Address=nValue;这条语句,LZ这样定义不是相当于传送了两个数据?
LZ可以试着这样定义
//写一个字节
void FLASH_Writeb(unsigned int Address,unsigned char nValue)
{
char *ptr;
ptr= (char *)Address;
...
}
Address就是地址0X1800什么的~
另外宏定义指针地址是可以,但是请LZ注意,149的FLASH不是哪里都是擦除的。。
[ 本帖最后由 3g465 于 2011-8-26 10:53 编辑 ]