主题中讨论的其他器件: MSP430G2231
........................................................................................................................................
问题:
大约0.5%的器件上的信息内存段 D 丢失。 用于校准数据的信息 D、因此器件会失去校准。 重新校准成功重新写入信息 D。闪存其余部分没有问题。 由于安全保险丝熔断、我无法检查其他信息段(特别是 C 和 B)。 但是、段 C 和 B 未使用。 我正在考虑将校准存储在 D 和 C 中、并在启动时运行数据完整性检查、但我更希望找到根本原因、而不是添加此带辅助。
........................................................................................................................................
硬件描述:
处理器-以16MHz 运行的 MSP430G2533 (请参阅下面的注释以了解闪存时钟时序)
电源- 3.3V、250mA -具有大量大容量电容的刚性 LDO
编程环境-低噪声、ESD 安全、受温度控制的组装区域
工作环境-室内/室外使用、典型温度在30-100 F 之间、无冷凝
故障器件-故障器件上的高温或高湿度无使用迹象
........................................................................................................................................
时钟说明:
根据 MSP430G2xx 数据表:闪存时序发生器工作频率、fFTG、必须在大约257kHz 至大约476kHz 的范围内(请参阅器件专用数据表)。
我将以250kHz 的频率运行闪存、刚好低于此规格的底部。 我的理解是、如果写入闪存时该值太高、可能会导致一个泄漏的弱写入。
注1 -我错误地运行了接近1MHz 的闪存时钟、并且看到了同样的问题。 将代码降至250kHz 会导致相同的问题。 损耗发生在大约0.5%的器件上、样本大小为7000个器件、5000 @ 1MHz、2000 @ 250kHz。
注2 -在采用 MSP430G2231的类似器件上以1MHz 和250kHz 闪存时钟运行相同的闪存代码、我看到信息段 D 的零丢失。0%的器件、3000个器件的样本大小、2000 @ 1MHz、1000 @ 250kHz。
........................................................................................................................................
固件描述:
固件在正常运行期间不会写入信息 D。 信息 D 用于编程后的校准、然后在正常器件使用中的正常代码执行期间保持不变。
这些器件的 JTAG 安全保险丝熔断、因此我无法通过这种方式进入它们。 。 我添加了诊断代码来显示操作器件中的0x1000和0x1002内容、因此可在数据损坏后检查内容。 在损坏的器件上、数据被复位为0xFFFF、看起来好像正在进行擦除。 它不会被单个位或类似的位破坏。
当数据丢失后重新运行校准时、器件会成功地重新写入信息 D 并保留而不会进一步丢失(任何重新校准的器件都不会再次丢失其信息 D)。 不过、这可能只是一个将低赔率相乘的游戏。 0.5% x 0.5%= 0.0025%
////////////////////////////// CALIBRATION 1 STARTED /////////////////////////////// __disable_interrupt(); // Disable Interrupts /* Code that does average sampling goes here */ ////////////////////////////// ERASE FLASH ///////////////////////////////////////// Flash_ptr = (unsigned int *) 0x1000; // Initialize Flash RF pointer FCTL1 = FWKEY + ERASE; // Set Erase bit FCTL2 = FWKEY+FSSEL1+FN5+FN4+FN3+FN2+FN1+FN0;// MCLK/64 = 250 kHz as FCLK FCTL3 = FWKEY; // Clear Lock bit *Flash_ptr = 0; // Dummy write to erase Flash segment D while(BUSY & FCTL3); // Wait for flash write to finish ////////////////////////////// WRITE FLASH ///////////////////////////////////////// FCTL1 = FWKEY + WRT; // Set WRT bit for write operation *Flash_ptr = average; // Write value to flash while(BUSY & FCTL3); // Wait for flash write to finish FCTL1 = FWKEY; // Clear WRT bit ////////////////////////////// CALIBRATION 1 FINISHED /////////////////////////////// ////////////////////////////// CALIBRATION 2 STARTED //////////////////////////////// /* Code that does average sampling goes here */ ////////////////////////////// WRITE FLASH ///////////////////////////////////////// Flash_ptr = (unsigned int *) 0x1002; // Initialize Flash segment D pointer FCTL2 = FWKEY+FSSEL1+FN5+FN4+FN3+FN2+FN1+FN0;// MCLK/64 = 250 kHz as FCLK FCTL1 = FWKEY + WRT; // Set WRT bit for write operation *Flash_ptr = average; // Write value to flash while(BUSY & FCTL3); // Wait for flash write to finish FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCK; // Set LOCK bit ////////////////////////////// CALIBRATION 2 FINISHED /////////////////////////////// __enable_interrupt(); // Enable Interrupts }
........................................................................................................................................
其他类似的线程:
https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/92849/flash-corruption-in-application-that-never-writes
https://www.embeddedrelated.com/showthread/msp430/37737-1.php