[求助] MSP430F149flash程序问题

王阿东   2011-8-26 09:14 楼主

我的目的是想练习使用一下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的地址不知道对不对?谢谢

回复评论 (4)

函数定义有问题,能把报错的句子贴上来么??

点赞  2011-8-26 10:06

回复 LZ的帖子

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 编辑 ]
点赞  2011-8-26 10:51

回答

你好!
    一个很明显的问题:
void FLASH_Writeb(unsigned int *Address,unsigned char nValue)
unsigned char nValue;
而你在传参数的时候:
FLASH_Writeb(*Address,t);
unsigned int t;

这些问题不是和你语言好不好有关,和你对待问题的态度有关。
请改后在编译一下
Fred
点赞  2011-8-26 19:54

回复 沙发 wzjhuohua 的帖子

版主好,编译后的问题就是
Error[Pe075]: operand of "*" must be a pointer D:\MSP430单片机\测试程序\flash\main.c 82
Error[Pe075]: operand of "*" must be a pointer D:\MSP430单片机\测试程序\flash\main.c 83
Error[Pe075]: operand of "*" must be a pointer D:\MSP430单片机\测试程序\flash\main.c 92
Error[Pe075]: operand of "*" must be a pointer D:\MSP430单片机\测试程序\flash\main.c 93
说是那四个调用的函数中对“*”的操作必须是指针
点赞  2011-8-26 22:10
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复