最近做一个项目,使用新唐的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的,用它监测程序是否跑飞这个没做进去。
求高手指点。 |