在线情况
楼主
  • 头像
  • 级别
    • 积分5
    • 经验378
    • 文章6
    • 注册2012-08-15
    flash中ACCVIFG问题
    [P][P]本意是写一个计数器程序,数码管上不断显示计数值,掉电后充新上电则从掉电后数据开始接着计数。程序运行时,有时候掉电后重新上电能显示掉电值,有时候直接从0显示。[/P][P]调试时发现在flash写程序中,执行到*p=0这一句ACCVIFG置位,不知道置位原因,不知道问题是不是出在这。[/P][P]typedef unsigned char uchar;
    typedef unsigned int  uint;
    #include  <msp430x16x.h>[/P][P]#define uchar unsigned char
    #define uint unsigned int[/P][P]#define wei_h   P5OUT|= BIT5
    #define wei_l   P5OUT&= ~BIT5
    #define duan_h  P6OUT |= BIT6
    #define duan_l  P6OUT &= ~BIT6
    //数码管7位段码:0--f
    const unsigned char scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
    uchar  value;                                // 8-bit value to write to segment A
    uchar  DataBuffer[128];
    uchar  val;
    uchar  tt;[/P][P]// Function prototypes
    void  write_SegA (uchar value);
    void  copy_A2B (void);
    void delay(uint z);
    void disp_smg (uchar number) ;
    void init (void);
    void read_SegA(void);
    void main(void)
    {
        //初始化端口
        P1DIR = 0XFF;P1OUT = 0XFF;
        P2DIR = 0XFF;P2OUT = 0XFF;
        P3DIR = 0XFF;P3OUT = 0XFF;
        P4DIR = 0XFF;P4OUT = 0XFF;
        P5DIR = 0XFF;P5OUT = 0XFF;
        P6DIR = 0XFF;P6OUT = 0XFF;
      P6DIR |= BIT2;P6OUT |= BIT2;              //关电平转换
      WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
      init();
      //write_SegA(value);  
      read_SegA();
        while(1)                                  // Repeat forever
      {
         write_SegA(value);                    // Write segment A, increment value
         //read_SegA();
         disp_smg (value);
         value++;
         if(value==200)
          value=0;
     }
                       
     
    }[/P][P]void write_SegA (uchar value)
    {[/P][P] _DINT();
      uchar *Flash_ptr;                          // Flash pointer
      uchar *p;
     //while ((FCTL3&BUSY)==BUSY);//等待忙状态结束
        Flash_ptr = (uchar *) 0x1080;              // Initialize Flash pointer
      p=(uchar *)0x1000;
     
      FCTL1 = FWKEY + ERASE;                    // Set Erase bit
      FCTL3 = FWKEY;                            // Clear Lock bit
      *Flash_ptr = 0;                           // Dummy write to erase Flash segment
      *p=0;//??ACCVIFG置位
    //while ((FCTL3&BUSY)==BUSY);//等待忙状态结束
      FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
      *Flash_ptr = value;                   // Write value to flash
      val=*Flash_ptr;
      *p=0xaa;
     
      FCTL1 = FWKEY;                            // Clear WRT bit
      FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
     _EINT();
     
    }
    void read_SegA(void)
    {[/P][P]  _DINT();
      uchar *Flash_ptr;                          // Flash pointer
      uchar *p;
      Flash_ptr = (uchar *) 0x1080;              // Initialize Flash pointer
      p= (uchar *) 0x1000;
      value=*Flash_ptr;
      tt=*p;
     _EINT();
      if(tt!=0xaa)
        value=100;
    }[/P][P]void disp_smg (uchar number)
    {
        unsigned int disp,i;
        unsigned int num[3];
        num[0]=number/100;
        num[1]=number%100/10;
        num[2]=number%100%10;
       
      for(i=0;i<3;i++)
        {
        disp=num[I];
        P4OUT = ~(1 << i);           //输出位选信号
        wei_h;
        wei_l;
        P4OUT = scandata[disp];        //输出段选信号
        duan_h;
        duan_l;
        delay(1000);
        }
    }[/P][P]void delay(uint z)
    {
        uint i;
        i = z;                              // Delay
        do (i--);
        while (i != 0);
    }
    void init (void)
    {
      FCTL2 = FWKEY + FSSEL0 + FN0;             // MCLK/2 for Flash Timing Generator
    }
    [/P][/I][/P]
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    在程序中找bug通常看得头晕,不过要实现这样的功能。换我来,我会用外部的EEPROM,常用的用24C04,用IO模拟IIC总线控制读写。[P]如果非要用内的LFASH的话,要用信息区的256字节。看你的程序写得也不怎么规范,不过建议你不要将显示与FLASH程序一起调试。这样有便以减少错误,最方面的方法是将显示删除,然后单纯在线调完这FLASH 信息区读写。简单点可以直接使用TI提供的例子,然后再修改。通过写与读的数据来测定是否存储成功。[/P][P]关于这样的例子,我记得在微控论坛的学习库也有写过的。去找找...[/P]
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分5
      • 经验378
      • 文章6
      • 注册2012-08-15
      [P]先谢谢版主了。我初学,看到flash模块,就想自己编个程序测试一下。操作的时候就是仿照TI的例程改的,结果还是出错了。[/P][P] [/P]
      微控网感谢您的参与
      在线情况
      4
      • 头像
      • 级别
      • 门派
      • 职务总版主
      • 声望+9
      • 财富5
      • 积分3065
      • 经验390701
      • 文章6744
      • 注册2006-03-07
      [FACE=宋体][SIZE=9pt]看看这个例子吧:[/SIZE][/FACE]
      [FACE=宋体][SIZE=12px]http://www.microcontrol.cn/bbs/a/a.asp?B=112&ID=9201&E=1&EID=69&RootID=10686&p=1&q=1&r=10686[/SIZE][/FACE]
      [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
      Powered by LeadBBS 9.2 .
      Page created in 0.4531 seconds with 5 queries.