各位好,现用G2755做串口升级,写flash中总是随机有一行写入失败而且出现在0x8000-0x8200之间。串口升级程序无中断。
贴上code,
时钟:
void Clock_Init(void)
{
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_8MHZ; // Set DCO
DCOCTL = CALDCO_8MHZ;
BCSCTL1 &=~XTS; //XT1低频模式
BCSCTL1 |= DIVA_0 + XT2OFF; //关闭XT2,XT1不分频
BCSCTL2 |= SELM_0 + DIVM_0+DIVS_3;//+ SELS //MCLK选择DCO时钟,不分频,SMCLK选择DCO,分频
BCSCTL3 |=LFXT1S_2; //ACLK为VLO=12KHz
}
flash:
void Flash_Init()
{
FCTL2 = FWKEY +FSSEL_2 + FN1;
}
void EraseFlash(unsigned int waddr,unsigned int APP_START_ADDRESS,unsigned int APP_SEG_NUM,unsigned int FLASH_PAGE_SIZE)
{ char i = 0;
waddr = APP_START_ADDRESS;
__disable_interrupt(); // 关闭总中断 for(i = 0;i < APP_SEG_NUM; i++)
{
FCTL3 = FWKEY; FCTL1 = FWKEY + ERASE; // 擦除操作 *(unsigned char*)waddr=0; // 虚拟的擦除段操作 while(FCTL3 & BUSY);
waddr += FLASH_PAGE_SIZE;
}
FCTL3=FWKEY+LOCK; // __enable_interrupt(); //打开全局中断
}
unsigned char WriteFlash(unsigned int addr,unsigned char *pdata,
unsigned char length)
{
unsigned char ErrorFlag = 0;
unsigned char i;
while(FCTL3 & BUSY);
__disable_interrupt();
FCTL3 = FWKEY; // 清除锁
FCTL1 = FWKEY + WRT; // 设置WRT位为写操作
for(i=0;i<length;i++)
{ *(unsigned char*)addr=*pdata; // 写一个字节
/* if(ReadFlash(addr)!=*pdata) // 验证,写比较.正确或错误 { ErrorFlag = 1; // 设置错误标志 } */
addr++;pdata++; }
FCTL1=FWKEY; FCTL3=FWKEY+LOCK;
// __enable_interrupt(); //打开全局中断
return ErrorFlag;
}
灰小子:
奇怪的问题。你的电源稳定吗?flash的擦除和写操作对电压有要求。
yue feng1:
回复 灰小子:
你好,dirtwillfly.
确实奇怪,昨天一直都有这种现象。我的是MSP430G2755搭配76930,今天一上班,断掉电芯用FET供电升级就没问题,之后再接上电芯升级也没出现异常,很奇怪。