在线情况
楼主
  • 头像
  • 级别
    • 积分13
    • 经验421
    • 文章14
    • 注册2010-07-24
    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]
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    建议要实行这种功能,前提不要做太多其他动作先。为确保这部分的成功,你必须先其他动作屏蔽掉。然后对FLASH的操作读写成功后再做开关机的验证。
    在FLASH操作部分,你需要注意以下几点:
    [1]确保FLASH操作时,时钟频率。我想你已注意到了...。
    [2]在此过程期间,将其他的中断功能屏蔽掉,以保证FLASH的操作能不受中断打扰。
    [3]确保供电的电压要适合FLASH操作的电压,我想这点不难做到。
    以上是我给你的建议,先确保基础条件为前提,然后让这部分操用成功运作起来后。再将相关的其他模块动作一步一步地加入进去调试。直至碰到问题为止。
    大概是这样...。[EM06]
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分13
      • 经验421
      • 文章14
      • 注册2010-07-24
      [P]谢谢斑竹。[/P][P]我知道了,我再按您说的试试。主要是该问题是随机出现的,在线调试不容易捕捉到异常。[/P]
      微控网感谢您的参与
      Powered by LeadBBS 9.2 .
      Page created in 0.1875 seconds with 5 queries.