MSP430F149flash程序问题

2019-03-24 15:46发布

我的目的是想练习使用一下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;
     }
   }
      
 }
} 我的问题可能也比较明朗,就是在主函数里我不会调用上面的子函数,编译后也是那三行红 {MOD}的代码有问题,请大家告诉我正确的调用语句是怎样的,另外flash里面写数据的地址不是任意的吗,所以我在一开始宏定义了指针p的地址不知道对不对?谢谢 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
wzjhuohua
1楼-- · 2019-03-24 21:58
<
3g465
2楼-- · 2019-03-25 03:28
< :TI_MSP430_内容页_SA7 -->

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 编辑 ]
wpj1018
3楼-- · 2019-03-25 06:55
 精彩回答 2  元偷偷看……
王阿东
4楼-- · 2019-03-25 08:03
版主好,编译后的问题就是
Error[Pe075]: operand of "*" must be a pointer D:MSP430单片机测试程序flashmain.c 82
Error[Pe075]: operand of "*" must be a pointer D:MSP430单片机测试程序flashmain.c 83
Error[Pe075]: operand of "*" must be a pointer D:MSP430单片机测试程序flashmain.c 92
Error[Pe075]: operand of "*" must be a pointer D:MSP430单片机测试程序flashmain.c 93
说是那四个调用的函数中对“*”的操作必须是指针

一周热门 更多>

相关问题

    相关文章