This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F5437A:在擦除一个组后观察显示除 FF 以外的值的擦除故障

Guru**** 2382960 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/931867/msp430f5437a-observing-erase-failure-showing-values-other-than-ff-after-erasing-a-bank

器件型号:MSP430F5437A

您好!

我们使用 MSP4305437A 在主存储器组30000-3fff 中写入一组日志。 我正在尝试在 ISR 例程中将一组日志写入和擦除到此位置。 每次出现中断时、我都会向该组30000写入几个字节、然后将其擦除、并再次重复此操作。 我正在使用以下代码进行擦除和写入。 当我写入和擦除日志时、该中断每16ms 出现一次。 我运行此代码几个小时、之后当我尝试读取位置30000-3fff 中的数据时、我希望它都是 FF、因为我会擦除它、 但我看到它在某些位置保存除 FF 以外的数据、例如 BF、F7等。

我想知道擦除是否失败、因为我已经多次写入和擦除、或者我尝试擦除和写入的方式是否有任何错误。  

此外、所有代码都在闪存存储器中执行- 0x5C00至0xFFFF

闪存擦除:

//禁用中断

//禁用看门狗

flashPtr =(unsigned char*) 0x30000;   //flashPtr 为 time unsigned char *

在 FCTL3中设置忙时//等待
FCTL3 = FWKEY;  
FCTL1 = FWKEY + MERAS_L;

*闪存 Ptr = 0;

//在 FCTL3中设置忙时等待

FCTL1 = FWKEY;//锁定闪存
FCTL3 = FWKEY + LOCK_L;

//启用中断

此致

Lakshmi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您真的每16ms 擦除一次同一存储器、那么您将在大约160秒内达到最小闪存寿命。 典型值是10倍、因此您的故障与之一致。

    我想知道为什么您觉得需要经常擦除内存。 您是否确实以4KB/16ms 的速率获得数据?  它的发展位置是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 David:

    感谢您的回答。 不需要、我们不需要经常擦除和写入。 在实际情况下(在现场)、擦除和写入相对较低。 但我想在本地测试环境中尝试一下。  

    这样做的原因是、当我们从同一个位置(30000)读取数据时、在该字段中我们会看到一些损坏。 我们有时会在这些位置看到0、当我浏览一些与闪存相关的 TI 文档时、它说如果我们覆盖到某个位置、我们会看到0的轨迹。 覆盖的一个原因可能是擦除失败、为了测试擦除是否确实正确发生、我尝试了上述测试。 我还怀疑擦除例程、因为在 MSP4305437A 的勘误表中提到了"组擦除期间的并发闪存读取失败"、并且我们在闪存中运行代码时使用组擦除。 我在下面添加了我们的闪存和写入例程以供参考。

    闪存组擦除

    //禁用中断

    //禁用看门狗

    flashPtr = 0x30000;

    在 FCTL3中设置忙时//等待
    FCTL3 = FWKEY;  
    FCTL1 = FWKEY + MERAS;

    *闪存 Ptr = 0;

    //在 FCTL3中设置忙时等待

    FCTL1 = FWKEY;//锁定闪存
    FCTL3 = FWKEY + LOCK;

    //启用中断

    2.闪存擦除和写入

    INT32U * flashPtR_L;
    INT32U 闪存缓冲器[128];

    //禁用中断

    //禁用看门狗

    flashPtR_L =(INT32U *) 0x30000;

    while (bit( FCTL3,BUSY));  
    FCTL3 = FWKEY;  
    FCTL1 = FWKEY + ERASE;

    *(CH8U*) flashPtR_L=0;

    //在 FCTL3中设置忙时等待

    FCTL1 = FWKEY + BLKWRT;

    memcpy (flashPtR_L、flashBuffer、512); //flashbuffer 具有要写入闪存的数据

    //在 FCTL3中设置忙时等待

    FCTL1 = FWKEY;
    FCTL3 = FWKEY + LOCK;

    //启用中断

    此致

    Lakshmi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    勘误表中描述的问题不会导致擦除失败(块或段)。 也就是说、在执行组擦除时尝试读取闪存将失败。 (用于某种故障值。) 权变措施是从 RAM 执行。 因此、如果您要使用组擦除、则必须将一些代码移入 RAM。 否则、当闪存读取失败时、程序将面临意外操作的风险。

    您会显示两个代码片段。 第一个是组擦除、将出现勘误问题。 即使您等待擦除完成、这也是如此、因为这需要从闪存中获取指令。

    第二个(段擦除)会自动暂停 CPU 执行(闪存读取返回0x3fff、这会导致一个循环就位)、然后在完成后恢复。 这应该正常运行、因为没有勘误表。

    我会警惕"flashPtR_L =(INT32U *) 0x30000;"、因为如果 sizeof (int)为16 (MSP430上的标准)、则会将0强制转换为指针。 即使我确信编译器在默认情况下使用32位整数、我仍有足够的偏执、可以在常量的末尾包含 L。