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条回答
zh2244ou
1楼-- · 2019-03-24 20:52
< 我记得1系列单片机的FLASH写操作是有时钟设置的,对时钟有要求的,你查看下例程,安装例程去改试试。
我暂时没遇到过读写问题,也许不是你读出来的数据出错,而是你写的时候数据就是错的。
另外FLASH擦除后的初始数据是FF,而不是00,看看是不是有影响。
kemasz
2楼-- · 2019-03-24 21:49
 精彩回答 2  元偷偷看……
ivan1022
3楼-- · 2019-03-25 00:36
zh2244ou 发表于 2014-9-25 16:01
我记得1系列单片机的FLASH写操作是有时钟设置的,对时钟有要求的,你查看下例程,安装例程去改试试。
我暂 ...

写进去的数据我确认过没有错,读出来的数据会有问题。擦除的操作我都是掉同一个函数进行的,但是单独擦除后就再写进去读出来就没有问题了,很奇怪。
时钟问题,我看看是不是时钟,但是如果时钟有问题不可能是不稳定的啊
zh2244ou
4楼-- · 2019-03-25 04:21
ivan1022 发表于 2014-9-26 09:34
写进去的数据我确认过没有错,读出来的数据会有问题。擦除的操作我都是掉同一个函数进行的,但是单独擦除 ...

那就是擦除问题了,是我说的最后一个原因。
擦除后是FF,写数据进去应该是&操作,如果你不擦除,本身里面有数据,比如说是F0,而你写入0F,可能写入的数据就变成了00,但你擦除后再写就保持0F不变的。

一周热门 更多>

相关问题

    相关文章