MSP 团队、
此客户正在 MSP430G2452上的信息 C 存储器空间中存储一些校准数据。 首先、它们将旧数据复制到 RAM、然后通过将所有0写入一个段来测试存储器。 他们发现,5%的电路板在读回0时出现故障。 (某些值仍然为1)。
他们在同一个板上重新测试、并且将继续失败。
您能否查看下面的代码、看看它是否看起来不错? 他们插入的延迟是否不够,或者是否在错误的位置?
volatile uint16_t * Flash_ptr; //闪存指针
volatile uint16_t i;
volatile uint16_t backup[INFO_C_SIZE];
uint16_t Backup_Calib、Backup_IR_POWER;
//擦除前备份信息 C 内存
Flash_ptr =(uint16_t *) 0x1040; //初始化闪存指针
//测试前备份信息 C 内存
Flash_ptr =(uint16_t *) 0x1040; //初始化闪存指针
Backup_Calib =*(Flash_PTR + TRIGGER_value_offset);
backup_IR_power =*(Flash_ptr + IR_POWER_value_offset);
//初始化0的数组
(i=0;<INFO_C_SIZE; i++ )
Backup[i]= 0;
//启动段擦除操作
FCTL1 = FWKEY + ERASE; //设置擦除位
FCTL3 = FWKEY; //清除锁定位
*闪存_ptr = 0; //虚拟写入以擦除闪存段
FCTL1 = FWKEY + WRT; //为写入操作设置 WRT 位
//写入具有0数组的信息 C 内存块
Flash_ptr =(uint16_t *) 0x1040; //再次初始化闪存指针
(i=0;<INFO_C_SIZE; i++ )
*闪存_PTR++=备份[i];
FCTL1 = FWKEY; //清除 WRT 位
FCTL3 = FWKEY + LOCK; //设置 LOCK 位
wAclkIntrvlTmr_t0 (250); //确保每个数据表的写入之间的最小延迟(每个计数83.333us)
//读回 INFO C MEMORY 并验证所有地址都是0
(i=0;<INFO_C_SIZE; i++ ){
if (0!=(READ_SegC_TrigVal (I)))
返回(失败); //检测到内存错误,退出并提醒用户
}
//启动段擦除操作(默认为0xFFFF)
FCTL1 = FWKEY + ERASE; //设置擦除位
FCTL3 = FWKEY; //清除锁定位
*闪存_ptr = 0; //虚拟写入以擦除闪存段
FCTL1 = FWKEY + WRT; //为写入操作设置 WRT 位
FCTL1 = FWKEY; //清除 WRT 位
FCTL3 = FWKEY + LOCK; //设置 LOCK 位
wAclkIntrvlTmr_t0 (250); //确保每个数据表的写入之间的最小延迟(每个计数83.333us)
//读回信息 C 内存并验证所有地址都为1
(i=0;<INFO_C_SIZE; i++ ){
if (0xFFFF!=(READ_SegC_TrigVal (I)))
返回(失败); //检测到内存错误,退出并提醒用户
}
//启动段擦除操作(默认为0xFFFF)
FCTL1 = FWKEY + ERASE; //设置擦除位
FCTL3 = FWKEY; //清除锁定位
*闪存_ptr = 0; //虚拟写入以擦除闪存段
FCTL1 = FWKEY + WRT; //为写入操作设置 WRT 位
//将信息 C 内存块写入数组
Flash_ptr =(uint16_t *) 0x1040; //再次初始化闪存指针
//如果内存正常,则恢复备份参数
*(Flash_ptr + TRIGGER_Value_offset)= Backup_Calib;
*(Flash_ptr + IR_POWER_value_offset)= Backup_IR_power;
FCTL1 = FWKEY; //清除 WRT 位
FCTL3 = FWKEY + LOCK; //设置 LOCK 位
wAclkIntrvlTmr_t0 (250); //确保每个数据表的写入之间的最小延迟(每个计数83.333us)
返回(成功);
谢谢、
Darren