This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430G2452 修改Flash存储器中信息段InfoFlash指定地址处的值,调试实现不了预期效果,求指导




FlashModifyChar(...)进行测试时,实现不了对应段地址处修改其存储的数据,请高人指点,谢谢。。。

思路:是将该数据段中的值先保存到数组TempArry[SegSize],然后修改指定的TempArry[Addrnum]里的值,再将临时保存在
数组中的值全部回写到该数据段。调试过程中,发现一直有问题,实现不了预期效果。

/********************Flash 修改字节********************/
void FlashModifyChar(uint SegX,char AddrNum,char wdata)
{
  char i,TempArry[SegSize];
  for(i=0;i<SegSize;i++)
  {
    TempArry[i]=*(uint*)(SegX+i);
  }
  TempArry[AddrNum]= wdata; //在数组中的某一位置 AddrNum 写入 wdata
  FlashErase(SegX);//段擦除
  _DINT();
  FCTL1=FWKEY+WRT+BLKWRT;//批量写模式
  FCTL3=FWKEY;//开锁 
  for(i=0;i<SegSize;i++)
  {
    *(uint*)(SegX+i)=TempArry[i];
    while((FCTL3&WAIT)==0);//等待字节写完成
  }
  FCTL1=FWKEY; //写关闭
  while(FCTL3&BUSY);//等待块写操作完成
  FCTL3=FWKEY+LOCK; //上锁
  _EINT();
}

测试代码:

#include "msp430g2452.h"
#include "Flash.h"
#include "BascClock.h"
/****************************************************
g2553 有 4 个数据段,每个数据段有 64bytes,共 256bytes
D:0x1000 -- 0x103F
C:0x1040 -- 0x107F
B:0x1080 -- 0x10BF
A:0x10C0 -- 0x10FF 
****************************************************/
void main()
{
  char ReadChar; 
  uint ReadWord;
  int p[]={'a','b','c','d'}; 
  WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
  BascClockInit();//时钟初始化,MCLK为8MHz DCO时钟,SMCLK为LF,ACLK为XT1 32768Hz
  FlashInit();
  FlashErase(SegA);
  FlashErase(SegB);
  FlashErase(SegC);
  FlashErase(SegD);
  FlashWriteChar(0x01007,0x12); //向地址 01007h 写入 12h
  ReadChar=FlashReadChar(0x01007); //读取地址 01007h 的值
  FlashWriteWord(0x01008,0x3456); //向地址 01008h 和 01009h 依次写入 56h 和 34h
  ReadWord=FlashReadWord(0x01008); //读取从地址 01008h 起的一个字
  FlashWriteChar(0x01017,ReadChar); //向地址 01017h 写入 12h
  FlashWriteWord(0x01018,ReadWord); //向地址 01018h 和 0109h 依次写入 56h 和34h 
  FlashBurstWrite(SegC,p); //向 SegC 段从地址 1040h 依次写入 a、 b、 c、d
  FlashModifyChar(SegD,10,0x57); //将地址 0112h 和 0113h 内容改为 e 和 f
  _BIS_SR(CPUOFF);   //关闭 CPU
}

FlashModifyChar(SegD,10,0x57); 之前INFO内容为:

运行到FlashModifyChar(SegD,10,0x57); 处时对应的INFO内容为: