Other Parts Discussed in Thread:MSP430F149, MSPWARE
项目中使用低功耗单片机MSP430F149,线路板采用3.6V锂电池(最大电压4.2V)直接供电,设备的运行参数保存在SEGA的开始20多个字节,每次上电程序都会读取这些参数并校验如果标志字不对就恢复默认的参数,每台设备设置完成后入库(部分带电池长期运行,部分去掉电池),过段时间再次上电读取参数时有很多设备(大概1/3) 的参数都复归了,说明程序读出来的校验标志字不对了,同时也不能保证其他设置参数的正确性。
请专家帮忙分析一下是读flash的SEGA程序不对还是在某种情况下存在SEGA中的参数出现错误或者丢失所致呢?
线路板硬件:单片机外部配置XT1= 32.768kHz XT2=8.000MHz,锂电池的3.6V(最大4.2V)电压直接给MSP430供电,未经过LDO变化为3.3V,程序中使能了看门狗,使用ACLK(32.768kHz)作为时钟源,在TIMERB的比较中断(CCR1=655,约20ms)中喂狗,而且是累积50次中断喂一次。
Susan Yang:
若是可以的话,请给出相关代码,谢谢。
关于SegA,在MSPware内有一个例程,您可以参考一下
fet140_flashwrite_01.cFlash In-System Programming, Copy SegA to SegB
dev.ti.com/…/node
,
chunfeng liang:
您好, 可以的, 代码详细如下
相关代码如下:
1、下面的是写信息存储处器函数:
// 写Flash Seg
void Flash_Write_Seg( uint Addr,uchar *value,uchar Len )
{uchar *Flash_ptr;// Flash pointeruint i;uchar reg1,reg2; reg1 = _BIC_SR(GIE);reg2 = IE1;IE1=0;// 保护原来中断标志,并关闭有关中断。
Flash_ptr = (uchar *) Addr;// Initialize Flash pointerFCTL1 = FWKEY + ERASE;// Set Erase bitFCTL3 = 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 < Len; i++ ){*Flash_ptr++ = value[i];// Write value to flash}
FCTL1 = FWKEY;// Clear WRT bitFCTL3 = FWKEY + LOCK;// Set LOCK bitif( reg1 & GIE ) _BIS_SR(GIE);// 恢复中断标志IE1=reg2;return;
}
调用格式为:Flash_Write_Seg(SegA_Addr,dat,24);其中SegA_Addr宏定义#defineSegA_Addr0x10802、读取SEGA函数如下:
void Flash_Read( uint wAddr,uchar *bBuf,uchar bLen )
{while( bLen– )*bBuf++=*(uchar *)wAddr++;
return;
}调用格式:Flash_Read( SegA_Addr, dat1, 24 );
,
Susan Yang:
写入后,直接读出的话,数值是否相同?
看了一下您的代码,并未发现问题。您可以试一下我之前贴出来的例程,看是否能复现问题
在论坛有一个分享贴,您可以参考一下:
e2echina.ti.com/…/30948
另外在操作flash时,电压需要为 2.7– 3.6V,还要一些其他参数,您可以看一下数据手册的 5.29 Flash Memory
或用户指南第5章
Note: Minimum VCC During Flash Write or Erase
The minimum VCC voltage during a flash write or erase operation is 2.7 V.
If VCC falls below 2.7 V during a write or erase, the result of the write or erase will be unpredictable.
,
chunfeng liang:
好的,十分感谢您的热心帮助,再去查查
,
Susan Yang:
期待您的反馈