|
本帖最后由 苹果520 于 2015-5-5 08:23 编辑
求助各位430的大侠:
M430F2013 info 掉电后info flash里面的数据丢了,如果写了之后马上查看info里面的消息。会发现写的数据都是对的。但是掉电之后再去读取数据就都没有了。(有时候可以成功,有时候不成功!!!)很不解!!!!望大侠指点! 在线等!!!!
下面附上代码:
配置也改了:
#include <msp430.h>
char value; // 8-bit value to write to segment A
#define Flash_PtrA (char *)0x10B0; // Initialize Flash segment A pointer
#define Flash_PtrB (char *)0x1080; // Initialize Flash segment B pointer
#define Flash_PtrC (char *)0x1040; // Initialize Flash segment C pointer
#define Flash_PtrD (char *)0x1000; // Initialize Flash segment D pointer
unsigned char aabb[10]={4,9,1,8,5,6,7,4,9,11};
unsigned char ccdd[10]={0,1,1,1,1,1,1,1,1,1};
// Function prototypes
void write_SegX(unsigned char sSegment,unsigned char *sValue,unsigned char sLength);
void Read_SegX(unsigned char sSegment,unsigned char *sValue,unsigned char sLength);
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
if (CALBC1_12MHZ==0xFF) // If calibration constants erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_12MHZ; // Set DCO to 12MHz
DCOCTL = CALDCO_12MHZ;
FCTL2 = FWKEY + FSSEL_2 + FN2 + FN5; // MCLK/3 for Flash Timing Generator
value = 0; // initialize value
// write_SegX(1,aabb,10);
Read_SegX(1,ccdd,10);
while(1) // Repeat forever
{
// write_SegC(value++); // Write segment C, increment value
// copy_C2D(); // Copy segment C to D
// __no_operation(); // SET BREAKPOINT HERE
// Read_SegX(1,ccdd,10);
}
}
void write_SegX(unsigned char sSegment,unsigned char *sValue,unsigned char sLength)
{
char *Flash_ptr; // Flash pointer
unsigned int i;
switch(sSegment)
{
case 1:
Flash_ptr = Flash_PtrD; // Initialize Flash pointer
break;
case 2:
Flash_ptr = Flash_PtrC; // Initialize Flash pointer
break;
case 3:
Flash_ptr = Flash_PtrB; // Initialize Flash pointer
break;
case 4:
Flash_ptr = Flash_PtrA; // Initialize Flash pointer
break;
}
// Flash_ptr = (char *) 0x1040; // Initialize Flash pointer
_DINT();
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptr = 0; // Dummy write to erase Flash segment
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<sLength; i++)
{
*Flash_ptr++ = sValue; // Write value to flash
// while((FCTL3 & BUSY) == BUSY); //Busy
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
_EINT();
}
void Read_SegX(unsigned char sSegment,unsigned char *sValue,unsigned char sLength)
{
char *Flash_ptr; // Flash pointer
unsigned int i;
switch(sSegment)
{
case 1:
Flash_ptr = Flash_PtrD; // Initialize Flash pointer
break;
case 2:
Flash_ptr = Flash_PtrC; // Initialize Flash pointer
break;
case 3:
Flash_ptr = Flash_PtrB; // Initialize Flash pointer
break;
case 4:
Flash_ptr = Flash_PtrA; // Initialize Flash pointer
break;
}
for (i=0; i<sLength; i++)
{
sValue = *Flash_ptr++; // copy value segment C to segment D
}
} |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|