打印
[Cortex-M0技术交流]

M0516LBN 数据保存在FLASH,有时候上电被冲掉的原因?

[复制链接]
1764|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小小财迷|  楼主 | 2013-11-11 15:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近做一个项目,使用新唐的M0516LBN,当然是ARM Cortex-M0内核。具体情况是:我在程序中顶一楼一个数组变量,uint16_t SetupData[100];我把这个数组每次更改后的数据保存在FLASH中,可是有时候上电初始化后会死机,屏幕卡住,程序无**常运行,重新上电后,正常运行,可保存在FLASH中的数据已经被冲掉,不知道什么原因,会不会是,各个初始化函数之间有影响,还是其他原因呢,下面附上我的FLASH读写程序和初始化程序:
uint32_t Data_Flash_Read_DualWord(uint32_t offset)
{
    uint32_t data;
    ISP_Enable();
    ISPCMD = READ;            //设定为读模式
  ISPADR = 0x0001f000 + (offset << 2); //得到要读的地址
  ISP_Triger();
  data   = ISPDAT;               //得到数据
ISP_Disable();
return data;
}

void Data_Flash_Write(uint32_t offset, uint32_t ulDATA)
{
       ISP_Enable();
     LDROM_RW_Enable();
       ISPCMD = PROGRAM;                      //设置为编程模式
   ISPADR = 0x0001f000 + (offset << 2);  //得到要写的地址,等同于0x0001f000 + 4*offset,offset 就是第几个值的意思
  ISPDAT = ulDATA;                                 //往数据寄存器中写入值

      ISP_Triger();
       ISP_Disable();
}

初始化程序:
main(void)
{
         Un_Lock_Reg();                                         //中:解锁被保护的寄存器位,以便用户访问//en:Unlock protected register bits, so that user can access them
   PWRCON |= XTL12M_EN;                                   //中:使能外部12MHz晶振//en:Enable external 12MHz crystal
   while((CLKSTATUS & XTL12M_STB) == 0);                  //中:等12M晶振时钟稳定//en:Wait until external 12M crystal stable       
   CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;              //中:选外部12MHz晶振为系统时钟//en:Select 12M as system clock
   Lock_Reg();                                            //中:重新锁被保护的寄存器位//en:Re-lock protected register bits   
         
         CpuInit();
         WDT_Init();  //看门狗定时器初始化
         TMR0_Init();        //定时器0初始化
         TMR1_Init(); //定时器1初始化
         TMR2_Init(); //定时器2初始化
         ADC_Init();        //ADC初始化
         GPIO_Init(); //GPIO口初始化
         Flash_Init();//DataFlash 初始化
   UART_Init();       

         SelfCheck();
         Delay(2200);//初始上电时蜂鸣器响的时间~=2.2s
         Relay1=0;
         Relay2=0;
         Beel=0;   //1=open,0=close
         DL06=0;
   LeakLed=1;
         TemptureLed=1;
         AlarmLed=1;       //0=open,1=close
         DataInit();
         Delay(2);//2ms
         //自检结束后允许串口中断,防止通讯重启时乱码
   UA0_IER        |= (RDA_IEN        | RLS_IEN);//UARTO接收中断允许,发送不允许(发送采用的查询方式)
         NVIC_ISER = UART0_INT;//允许串口UART0中断
  
   while(1)
   {
                        DisplayCalculate();           //显示
                        ADWork(); //AD采样
      Work();                //主控程序
      UART0Manage();        //通信程序
   }
         
}

我这个里面用到看门狗,用来软重启MCU的,用它监测程序是否跑飞这个没做进去。

求高手指点。

相关帖子

沙发
DLF5| | 2013-11-12 11:08 | 只看该作者
做好上电复位电路!!!

问题解决了,别忘了谢我!

使用特权

评论回复
板凳
小小财迷|  楼主 | 2013-11-13 08:26 | 只看该作者
DLF5,你好。M0516LBN这个上电时,有个RC复位电路,时低电平持续50us复位,我这个用示波器测得低电平复位时间有40ms了,会不会是程序问题呢?

使用特权

评论回复
地板
DLF5| | 2013-11-13 09:28 | 只看该作者
本帖最后由 DLF5 于 2013-11-13 09:30 编辑

程序没细看,估计不会有问题。
复位电路一定要改,RC复位肯定不行!

使用特权

评论回复
5
小小财迷|  楼主 | 2013-11-13 13:08 | 只看该作者
会不会是中断优先级问题,我用了3个定时器,而且优先级都是默认的,没有设置

使用特权

评论回复
6
小小财迷|  楼主 | 2013-11-18 08:32 | 只看该作者
找到原因了,内核供电电压不稳,即是LDO_CAP脚没有外接退耦电容。但是这个电压实际根本达不到datasheet上写的2.5V,大概只有1.9V,怪我没有好好阅读datasheet啊,第一次玩,摔了个大跟头。让我突然想起以前玩FPGA时,内核电压供电还是很讲究的:)

使用特权

评论回复
7
DLF5| | 2013-11-23 23:18 | 只看该作者
找到问题就好,大家都可以借鉴。

使用特权

评论回复
8
oyangsaio| | 2013-11-25 00:23 | 只看该作者
内核供电?可以把电路上传一份吗

使用特权

评论回复
9
springvirus| | 2013-11-26 16:32 | 只看该作者
喔,长知识了!谢楼主!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

144

帖子

2

粉丝