MSP430 FLASH擦写问题
__no_init uint16 FLASH_CN @0x1040;void CN_Write(void)
{
uint16 *pf;
pf = (uint16 *)&Flash_CN;
WDT_Stop();
__disable_interrupt();
FCTL1 = FWKEY + ERASE;
FCTL2=FWKEY | FSSEL_1 | 24; //时钟源选择MCLK,25分频,约320K;
FCTL3 = FWKEY;
pf = 0;
FCTL1 = FWKEY + WRT;
pf=CN;
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
WDT_Reset();
__enable_interrupt();
}
对FLASH擦写无效,问题出在哪里? /*擦除FLASH中某一段的函数*/
void FlashErase(INT16U adr)
{
FCTL1 = FWKEY + ERASE;
FCTL2 = FWKEY + FSSEL_1 + defFlashFreq;
FCTL3 = FWKEY;
while ( (FCTL3 & BUSY) == BUSY);//等待FLASH空闲*********************************
*((INT16U *)adr) = 0; //段内地址任意写,启动擦除
while ( (FCTL3 & BUSY) == BUSY);//等待擦除完毕**********************************
FCTL3 = FWKEY + LOCK; //上锁
}
/*在指定的地址写入数据(字宽度)*/
void FlashWriteWord(INT16U adr,INT16U dat)
{
FCTL1 = FWKEY + WRT;
FCTL2 = FWKEY + FSSEL_1 + defFlashFreq;
FCTL3 = FWKEY;
while ( (FCTL3 & BUSY) == BUSY);//等待FLASH空闲***************************
*((INT16U *)adr) = dat; //写数据
while ( (FCTL3 & BUSY) == BUSY);//等待FLASH完成操作***********************
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
} #define Flash_CN 0x1040
void CN_Write(void)
{
uint16 *pf;
pf = (uint16 *)Flash_CN;
WDT_Stop();
__disable_interrupt();
FCTL1 = FWKEY + ERASE;
FCTL2=FWKEY | FSSEL_1 | 24; //时钟源选择MCLK,25分频,约320K;
FCTL3 = FWKEY;
pf = 0;
FCTL1 = FWKEY + WRT;
pf=CN;
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
WDT_Reset();
__enable_interrupt();
}
程序改成这样就可以了,不明白两者有什么不同. 注意注释****************************
那是给你看的
擦、写FLASH必须要插入等待时间,否则可能出现不可预料的错误
你在楼主位那里的程序,插入等待的话,应该可以的。 void flash_eraseFLASH(int *seg)
{
FCTL2 = FWKEY | FSSEL0 | 20; //clock source is MCLK, divisor is 20
do
{
_NOP();
} while(FCTL3 & 0x0001); // wait for BUSY to reset
FCTL3 = FWKEY; // reset the LOCK bit to enable program/erase
FCTL1 = FWKEY | ERASE; // set single segment erase function
*seg = 0xFF; // do a dummy write to start erase
FCTL3 = FWKEY | LOCK; // lock the flash again
return;
}
void flash_writeByte(int *dst, int value)
{
FCTL2 = FWKEY | FSSEL0 | 20; //clock source is MCLK, divisor is 20
do
{
_NOP();
} while(FCTL3 & 0x0001); // wait for BUSY to reset
FCTL3 = FWKEY; // reset the LOCK bit to enable program/erase
FCTL1 = FWKEY | WRT; // set WRT for single acces
*dst = value; // do the write as a byte
*Flash_ptr = *dst;
return;
}
/////////////
写数据必需先擦除,再写.... lou楼上都是高手呀 膜拜 //////////////////////////////////////////////
//功能:FLASH操作-BYTE数据写入 //
//参数:char *Data_ptr,char byte //
//返回:无 //
//日期:2003.11.6 //
//////////////////////////////////////////////
void Flash_wb(char *Data_ptr,char byte)
{
FCTL3=0x0A500; // Lock=0
FCTL1=0x0A540; // WRT=1
*Data_ptr=byte;
} //////////////////////////////////////////////
//功能:FLASH操作-word数据写入 //
//参数:int *Data_ptr, int word //
//返回:无 //
//日期:2003.11.6 //
//////////////////////////////////////////////
void Flash_ww(int *Data_ptr,int word)
{
FCTL3=0X0A500; //Lock=0
FCTL1=0X0A540; //WRT=1
*Data_ptr=word;
} //////////////////////////////////////////////
//功能:FLASH操作-段擦除 //
//参数:int *Data_ptr //
//返回:无 //
//日期:2003.11.6 //
//////////////////////////////////////////////
void Flash_clr(int *Data_ptr)
{
FCTL1=0X0A502; // ERASE=1
FCTL3=0X0A500; //Lock=0
*Data_ptr=0;
} //////////////////////////////////////////////
//功能:FLASH 操作,先保存在擦写 //
//参数:uchar num //
//返回:无 //
//日期:2003.11.14 //
//////////////////////////////////////////////
void Flash_do(uchar num)
{
uint lshi,linshi; //
uchar i=0;
int *addr;
_DINT();
addr=(int *)0x1000;
for(i=0;i<13;i++)
{
linshi=*(addr+i);
}
linshi=Flash_save;//更新数据
Flash_clr(addr); //段擦除
for(i=0;i<13;i++)
{
lshi=linshi;
Flash_ww(addr+i,lshi);//写入
}
_EINT();
}
页:
[1]