MSP430F149 写字符到FLASH后,读取出来会有时出错,大部分时候正常,对FLASH不是非常了解,但是偶尔不正常会造成信息出错,很麻烦,请帮忙看看。代码如下:
//*****将字符串写入FLASH,给定首地址
void Write_string_to_flash(char *value,unsigned int addr_flash)
{
unsigned char *Flash_ptr,i; // Flash pointer
_DINT();
Flash_ptr = (unsigned char *) addr_flash;
/*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
*/
if((addr_flash < RECORD_FLASH_ADDR))//保存记录时不擦除
{
Flash_erase(addr_flash);
}
while(FCTL3 & BUSY) //如果处于忙状态,则等待
{
;//MY_WATCH_DOG; //看门狗计数器清零(WDTCTL=0x5A08)
}
FCTL3 = FWKEY ; //清出LOCK标志
FCTL1 = FWKEY + WRT ; //写操作,块编程,+ BLKWRT;
if(addr_flash < 0x1100) //在information 区,写128个
{
i=128;
while(i--)
{
*Flash_ptr++ =*value++;
while(!(FCTL3 & WAIT)) //如果处于忙状态,则等待 ,若用软件仿真,去掉 //这语句
{
;//MY_WATCH_DOG; //看门狗计数器清零(WDTCTL=0x5A08)
}
}
}
else
{
while(*value!=0)
{
*Flash_ptr++ =*value++;
while(!(FCTL3 & WAIT)) //如果处于忙状态,则等待 ,若用软件仿真,去掉 //这语句
{
;//MY_WATCH_DOG; //看门狗计数器清零(WDTCTL=0x5A08)
}
}
}
FCTL1 = FWKEY; //写操作完成,清除编程允许位 WRT,BLKWRT
while(FCTL3 & BUSY)
{
;//MY_WATCH_DOG; //看门狗计数器清零(WDTCTL=0x5A08)
}
FCTL3 = FWKEY + LOCK;
_EINT();
}
//***********从给定的FLASH首地值起读固定长度的数据
void Read_data_from_flash(char *goal,unsigned int addr_flash,int length)
{
char i=0;
unsigned char *Flash_ptr; // Flash pointer
_DINT();
Flash_ptr = (unsigned char *) addr_flash;
for(i=0;i<length;i++)
{
*(goal+i)=*(Flash_ptr+i);
}
_EINT();
}
//******************************************************************************
//FLASH段擦除
void Flash_erase(unsigned int addr_flash)
{
unsigned char *pc_word; // Flash pointer
pc_word = (unsigned char *) addr_flash;
//_DINT();
while(FCTL3 & BUSY) //如果处于忙状态,则等待
{
;//MY_WATCH_DOG; //看门狗计数器清零(WDTCTL=0x5A08)
}
FCTL3 = FWKEY ; //清出LOCK标志,解锁
FCTL1 = FWKEY + ERASE ; //允许段擦除
*pc_word = 0; //擦除..擦除..
while(FCTL3 & BUSY)
{
;//MY_WATCH_DOG; //看门狗计数器清零(WDTCTL=0x5A08)
}
FCTL3 = FWKEY + LOCK ; //加锁
//_EINT();
}
此帖出自
小平头技术问答
我暂时没遇到过读写问题,也许不是你读出来的数据出错,而是你写的时候数据就是错的。
另外FLASH擦除后的初始数据是FF,而不是00,看看是不是有影响。
写进去的数据我确认过没有错,读出来的数据会有问题。擦除的操作我都是掉同一个函数进行的,但是单独擦除后就再写进去读出来就没有问题了,很奇怪。
时钟问题,我看看是不是时钟,但是如果时钟有问题不可能是不稳定的啊
那就是擦除问题了,是我说的最后一个原因。
擦除后是FF,写数据进去应该是&操作,如果你不擦除,本身里面有数据,比如说是F0,而你写入0F,可能写入的数据就变成了00,但你擦除后再写就保持0F不变的。
一周热门 更多>