TI中文支持网
TI专业的中文技术问题搜集分享网站

msp430f5342&5418A 信息存储区数据丢失

Other Parts Discussed in Thread:LP2951, MSP430F5418A, MSP430F5342

我们有两款型号的板子,一个MCU用的是msp430f5342,另一个用的是msp430f5418A,24V直流 转3.3V供电,转换芯片用的TI的LP2951;

现在发现 频繁上电的时候,有部分电路板 INFO 区 数据丢失,用串口读出的数据显示为NAN;将此地址的信息存储区 用串口写入固定的值,读出来的值与写入的值一致。

请问 是什么原因导致 INFO 区数据丢失,如何避免?

谢谢!

以下为代码:

#define MAXNUM 110 /*存储的总数据量(字节),最大128*/
/*由于每个数据都需要备份,总数据量越小速度越快,不要留太多余量*/
/*后面存储、读取函数可用的存储地址空间为0~(MAXNUM-1)*/

#define FLASH_SAVEADDR (0x1880) /*Flash数据存储区首地址(InfoC)*/
#define FLASH_COPYADDR (0x1800) /*Flash备份存储区首地址(InfoD)*/

union LongChar //长整字节 复合结构
{ unsigned long int Long;
struct ByteL4
{ unsigned char BHH;
unsigned char BHL;
unsigned char BLH;
unsigned char BLL;
}Bytes;};
union FloatChar //浮点字节 复合结构
{ float Float;
struct ByteF4
{ unsigned char BHH;
unsigned char BHL;
unsigned char BLH;
unsigned char BLL;
}Bytes;};

unsigned char FLASH_PSR;

void Flash_Erase(unsigned int Addr){
unsigned char *Flash_ptr;
Flash_ptr=(unsigned char *)Addr;
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY + ERASE; // Set Erase bit
*Flash_ptr = 0; // Dummy write to erase Flash segment B
Flash_Busy(); //Busy

FCTL3 = FWKEY+LOCK; // Set Lock bit

}

void Flash_CopyC2D()
{
unsigned char *Flash_ptrC; // Segment C pointer
unsigned char *Flash_ptrD; // Segment D pointer
unsigned int i;
Flash_ptrC = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment C pointer
Flash_ptrD = (unsigned char *) FLASH_COPYADDR; // Initialize Flash segment D pointer
Flash_Erase(FLASH_COPYADDR);
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<MAXNUM; i++)
{
*Flash_ptrD++ = *Flash_ptrC++; // copy value segment C to segment D
Flash_Busy(); //Busy
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}

/****************************************************************************
* 名 称:Flash_WriteChar()
* 功 能:向Flash中写入一个字节(Char型变量)
* 入口参数:Addr:存放数据的地址
Data:待写入的数据
* 出口参数:无
* 范 例:Flash_WriteChar(0,123);将常数123写入0单元
Flash_WriteChar(1,a);将整型变量a写入1单元****************************************************************************/
void Flash_WriteChar (unsigned int Addr, char Data)
{
unsigned char *Flash_ptrC; // Segment C pointer
unsigned char *Flash_ptrD; // Segment D pointer
unsigned int i;
_DINT();
Flash_CopyC2D(); //Flash内的数据先保存起来
Flash_ptrC = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment C pointer
Flash_ptrD = (unsigned char *) FLASH_COPYADDR;// Initialize Flash segment D pointer
Flash_Erase(FLASH_SAVEADDR); FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
FCTL3 = FWKEY; // Clear Lock bit
for (i=0; i<MAXNUM; i++)
{
if(i==Addr)
{
*Flash_ptrC++ =Data; // Save Data
Flash_Busy(); //Busy
Flash_ptrD++;
}
else
{
*Flash_ptrC++ = *Flash_ptrD++; // 恢复Flash内的其他数据
Flash_Busy(); //Busy
}
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
delay_ms(1);
_EINT();
}

/****************************************************************************
* 名 称:Flash_ReadChar()
* 功 能:从Flash中读取一个字节
* 入口参数:Addr:存放数据的地址
* 出口参数:读回的数据
****************************************************************************/
unsigned char Flash_ReadChar (unsigned int Addr)
{ unsigned char Data;
unsigned char *Flash_ptrC; // Segment C pointer
_DINT();
Flash_ptrC = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment C pointer
Data=*(Flash_ptrC+Addr);
delay_ms(1);
_EINT();
return(Data);
}
/****************************************************************************
* 名 称:Flash_Writestring()
* 功 能:向FlashROM写入一个字符串
* 入口参数:Addr:被写入FlashROM单元的地址
Data:待写入的char型变量
* 出口参数:无
* 说 明: 该函数保存多个char型数据
* 范 例:
****************************************************************************/
void Flash_Writestring(unsigned int Addr, unsigned int len, char *Data)
{
unsigned char k;
_DINT();
for(k=0;k<len;k++)
{
Flash_WriteChar( Addr+k, Data[k]);
}
delay_ms(1);
_EINT();
}
/****************************************************************************
* 名 称:Flash_Readstring()
* 功 能:从FlashROM读回一个char型变量
* 入口参数:Addr:待读出变量所在FlashROM单元的起始地址(存入的地址)
* 出口参数:读回的char型变量值
****************************************************************************/
void Flash_Readstring (unsigned int Addr, unsigned int len, char *Data)
{
unsigned char k;
_DINT();
for(k=0;k<len;k++)
{
*Data++=Flash_ReadChar (Addr+k);
}
delay_ms(1);
_EINT();
}

Susan Yang:

请问是两款芯片都会出现这样的情况?概率大约是多少?

是否有可能是程序跑飞了或者电源监控及复位的问题。正常情况下,在上电启动过程中,需要芯片电压超过某一阈值才释放复位,进入工作状态,如果提前复位完成,此时系统状态不完全确定,程序跑飞,如果正好运行到flash擦除的代码,那就是您所看到的现象了;同样,在下电的过程中,如果当电压掉到不能正常工作的阈值是仍未复位,也会跑飞。

您可以用示波器看看上电和掉电时reset信号和电压的关系,并看看是否满足芯片的要求。

另外在操作flash时,电压需要为 1.8– 3.6V,还要一些其他参数,您可以看一下数据手册的5.43 Flash Memory

,

lei zhao:

电路上特意加了一个复位IC,MAX809S,复位电压为2.93V
两款芯片都会出现这个情况,概率5%左右

我是拿 INFO 存储作EEPROM使用,刚上电需要对其初始化,先写入一些固定的参数值,然后读取这些写入的值。后续可以在任意时间 用串口对其更改

,

lei zhao:

使用此两款 MCU的产品 均已量产,用了2年了,最近发现返修机器有 INFO存储信息丢失情况,测试发现产品反复上电的时候 会出现数据丢失

,

Susan Yang:

所以之前使用相同的程序和相同的硬件没有出现过类似的问题?只在最近出现过?

,

lei zhao:

之前的产品使用过程中也出现了,所以客户才会把产品退回

这个问题是一直存在的,只不过现象不好复现

,

Susan Yang:

我已经assign了您的问题至相关的BU

,

Eason Zhou:

1. 一般遇到这个问题,都是由于运行了软件erase flash功能导致的。由于flash需要高压进行擦写,因此不大会因为在超spec下工作导致。

2. 对于误触发erase flash功能,原因1,正如susan说的reset电平建立时间不合适。原因2,工作电压波动。

3. 根据你的描述频繁上电会导致代码被擦除。建议1,用示波器检测电源电压与reset引脚的电平。建议2,使用标志位如GPIO来观察是否误触发了Flash_Erase(unsigned int Addr)函数。

,

lei zhao:

reset引脚有专用的复位芯片max809s,阈值电压为2.9V

赞(0)
未经允许不得转载:TI中文支持网 » msp430f5342&5418A 信息存储区数据丢失
分享到: 更多 (0)