M430 FLASH seg-A seg-B 读写问题

2019-03-24 10:52发布

   MSP430F149 写字符到FLASH后,读取出来会有时出错,大部分时候正常,对FLASH不是非常了解,但是偶尔不正常会造成信息出错,很麻烦,请帮忙看看。代码如下:
              //*****将字符串写入FLASH,给定首地址
void Write_string_to_flash(char *value,unsigned int addr_flash)
{
  unsigned char *Flash_ptr,i;                          // Flash pointer
  _DINT();
  Flash_ptr = (unsigned char *) addr_flash;
  /*FCTL1 = FWKEY + ERASE;                    // Set Erase bit
  FCTL3 = FWKEY;                            // Clear Lock bit
  *Flash_ptr = 0;                           // Dummy write to erase Flash segment
  FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
  */
  if((addr_flash <  RECORD_FLASH_ADDR))//保存记录时不擦除
  {
    Flash_erase(addr_flash);
  }

while(FCTL3 & BUSY)                    //如果处于忙状态,则等待
{
   ;//MY_WATCH_DOG;       //看门狗计数器清零(WDTCTL=0x5A08)
}
FCTL3 = FWKEY ;                       //清出LOCK标志
FCTL1 = FWKEY  + WRT ;              //写操作,块编程,+ BLKWRT;
if(addr_flash <  0x1100)  //在information 区,写128个
{
   i=128;
   while(i--)
   {
     *Flash_ptr++ =*value++;
    while(!(FCTL3 & WAIT))  //如果处于忙状态,则等待 ,若用软件仿真,去掉                 //这语句
      {
          ;//MY_WATCH_DOG;       //看门狗计数器清零(WDTCTL=0x5A08)
      }
   }
}
else
{
  while(*value!=0)
  {
    *Flash_ptr++ =*value++;
    while(!(FCTL3 & WAIT))  //如果处于忙状态,则等待 ,若用软件仿真,去掉                 //这语句
      {
          ;//MY_WATCH_DOG;       //看门狗计数器清零(WDTCTL=0x5A08)
      }
  }
}

FCTL1 = FWKEY;           //写操作完成,清除编程允许位 WRT,BLKWRT
while(FCTL3 & BUSY)
    {
       ;//MY_WATCH_DOG;       //看门狗计数器清零(WDTCTL=0x5A08)
    }
FCTL3 = FWKEY + LOCK;
_EINT();
}

//***********从给定的FLASH首地值起读固定长度的数据
void Read_data_from_flash(char *goal,unsigned int addr_flash,int length)
{
  char i=0;
  unsigned char *Flash_ptr;                          // Flash pointer
  _DINT();
  Flash_ptr = (unsigned char *) addr_flash;
  for(i=0;i<length;i++)
  {
    *(goal+i)=*(Flash_ptr+i);
  }
  _EINT();
}

//******************************************************************************
//FLASH段擦除
void Flash_erase(unsigned int addr_flash)
{
   unsigned char *pc_word;                          // Flash pointer
  pc_word = (unsigned char *) addr_flash;
   //_DINT();
while(FCTL3 & BUSY)                       //如果处于忙状态,则等待
{
   ;//MY_WATCH_DOG;       //看门狗计数器清零(WDTCTL=0x5A08)
}
FCTL3 = FWKEY ;                          //清出LOCK标志,解锁
FCTL1 = FWKEY + ERASE ;                 //允许段擦除
*pc_word = 0;                         //擦除..擦除..
while(FCTL3 & BUSY)
{
   ;//MY_WATCH_DOG;       //看门狗计数器清零(WDTCTL=0x5A08)
}
FCTL3 = FWKEY + LOCK ;             //加锁
  //_EINT();
}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
ivan1022
2019-03-25 00:36
zh2244ou 发表于 2014-9-25 16:01
我记得1系列单片机的FLASH写操作是有时钟设置的,对时钟有要求的,你查看下例程,安装例程去改试试。
我暂 ...

写进去的数据我确认过没有错,读出来的数据会有问题。擦除的操作我都是掉同一个函数进行的,但是单独擦除后就再写进去读出来就没有问题了,很奇怪。
时钟问题,我看看是不是时钟,但是如果时钟有问题不可能是不稳定的啊

一周热门 更多>

相关问题

    相关文章