最近在学习MSP430 Flahs存储,用的官方G2仿真板,想法是把一组数据存储到MCU自带的信息存储器里面去,主程序先在0x1000地址存储了一个数组{1,2,3,4,5,6},然后在用程序改写这个地址的内容,结果程序运行后发现地址里的数据不是程序写入的数据,主要程序如下:
#include
#include
#pragma location = 0x1000
const uchar P_Word[6]={1,2,3,4,5,6};
void main()
{
FCTL2=FWKEY +FSSEL_1+FN2;//+FN0+FN1+FN2+FN4 //Flash时钟设置,MCLK,4分频
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
keysel(); //键盘设置
_EINT(); //使能全局中断
LCD_Init(); //LCD初始化
TA_sel(); //设置TA定时器
SevePassword();
while(1)
{}
}
void SevePassword(void)
{
_DINT(); //关闭中断
double* Flash_data_ptr;
unsigned int* Flash_int_ptr;
Flash_data_ptr = (double*)0x1000; //intialize
FCTL1 = FWKEY + ERASE; //允许擦出
FCTL3 = FWKEY; //解锁
*Flash_data_ptr = 0;//空写,启动擦除
FCTL1 = FWKEY + WRT;//允许写
*Flash_data_ptr++=0x04030201; //重新写入的数据
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
_EINT(); //使能全局中断
}
程序刚载入后用仿真器读取INFO地址内容如下:
0x1000 0x04030201
0x1004 0xFFFF0605
运行后仿真器观察INFO地址内容变成了:
0x1000 0x4C800640
0x1004 0xFFFFFFFF
按说程序执行以后应该是把数据变成:
0x1000 0x04030201
0x1004 0xFFFFFFFF
查了很多资料说Flash读写要注意频率控制在257KHz至476KHz之间,我用的G2开发板,默认用的是DCO时钟,仿真器读取DCO=3,rsel=7资料上说频率在0.8~1.5MHZ之间,这样的话Flash时钟源选MCLK,分频在2~6之间就可以,我从2到6分频全部试过了,结果还是老样子。不知道哪位高手也遇到这个问题给讲解一下,现行谢过了!!
找到问题了,这句:Flash_data_ptr = (double*)0x1000; //intialize
改成:Flash_data_ptr = (char*)0x1000; //intialize
就解决了