F2274单片机FLASH擦写出错是什么原因

楼主
F2274单片机FLASH擦写出错是什么原因
[P]我的程序是这样写的:[/P][P]#include  <msp430x22x2.h>[/P][P]void FlashWB_A(void)                              //存储电流和温度数据
{
  _DINT();
  unsigned int *Flash_ptr;
  Flash_ptr = (unsigned int *)0x1040;       [/P][P]  FCTL3=FWKEY;
  FCTL1 = FWKEY + ERASE;          
  *Flash_ptr = 0;                          
  FCTL1 = FWKEY + WRT;                    
  *Flash_ptr++ = current_set_value[0];
  *Flash_ptr++ = current_set_value[1];
  *Flash_ptr++ = current_set_value[2];
  *Flash_ptr++ = wendu_set_value;          
  FCTL1=FWKEY;
  FCTL3=FWKEY+LOCK;
  _EINT();
}[/P][P]void InitialFlash(void)       //FLASH初始化[/P][P]{[/P][P]  FCTL2 = FWKEY + FSSEL_0+ FN4+FN2+FN0;   //时钟源为ACLK,擦写频率大约是360KHz[/P][P]}[/P][P]void Initialvar(void)       //变量初始化    读取flash中的电流设定值、温度设定值[/P][P]{
  unsigned int *q0;                            
  q0=(unsigned int *)0x1040;                   //读取flash中的电流设定值
 
  current_set_value[0] = *q0++;
  if((current_set_value[0]<0)||(current_set_value[0]>R_CURRENT_MAX))  
  {
   
    current_set_value[0] = R_CURRENT_MAX-20;          
  }
 
  current_set_value[1] = *q0++;
  if((current_set_value[1]<0)||(current_set_value[1]>G_CURRENT_MAX))                [/P][P]  {
   
    current_set_value[1] = G_CURRENT_MAX-50;
  }
 
  current_set_value[2] = *q0++;
  if((current_set_value[2]<0)||(current_set_value[2]>B_CURRENT_MAX))
  {
    current_set_value[2] = B_CURRENT_MAX-20;     [/P][P]  }
 
  wendu_set_value = *q0++;
    if((wendu_set_value<100)||(wendu_set_value>350))            [/P][P]  {
    wendu_set_value = 250;
  }
}[/P][P]程序中还用到了:[/P][P]Timer A:时钟源为SMCLK;[/P][P]ADC10:时钟源为ADC10OSC;[/P][P]UART:时钟源为SMCLK;[/P][P]IIC:用P4口模拟的主机IIC,未用自带的模块。[/P][P]此程序用串口设定电流和温度,写入FLASH里,每次开机自动从FLASH里面读取这些数据。在大多数板子上运行没发现问题,但有几块板子电流和温度的设定值偶尔会出现复位现象,即所谓的“记不住数”:FLASH里的数据会恢复成初始值。[/P][P]请各位高手帮我分析一下是哪里的原因?[/P][P] [/P]
1楼
建议要实行这种功能,前提不要做太多其他动作先。为确保这部分的成功,你必须先其他动作屏蔽掉。然后对FLASH的操作读写成功后再做开关机的验证。
在FLASH操作部分,你需要注意以下几点:
[1]确保FLASH操作时,时钟频率。我想你已注意到了...。
[2]在此过程期间,将其他的中断功能屏蔽掉,以保证FLASH的操作能不受中断打扰。
[3]确保供电的电压要适合FLASH操作的电压,我想这点不难做到。
以上是我给你的建议,先确保基础条件为前提,然后让这部分操用成功运作起来后。再将相关的其他模块动作一步一步地加入进去调试。直至碰到问题为止。
大概是这样...。[EM06]
2楼
[P]谢谢斑竹。[/P][P]我知道了,我再按您说的试试。主要是该问题是随机出现的,在线调试不容易捕捉到异常。[/P]

电脑版 Page created in 0.1562 seconds width 3 queries.