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.

[参考译文] AM13E23019:AM13E23019:闪存写入验证问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1629418/am13e23019-am13e23019-flash-write-verification-issues

部件号: AM13E23019

执行 64 位写入操作后、我们希望验证第一个编程字节是否包含正确的数据、但是在检查所述字节时、如果存储器显示数据在那里、通过读取获得的值将显示为 0xFF、不是空白。
这种情况在从 O0 到 O3 的不同优化级别下发生。 诸如易失性、数据障碍、阻塞等待等同步机制对问题没有帮助。 数据缓存有问题吗? 在 TRM 中、它指出“ 对闪存进行编程后、处理器的高速缓存逻辑中可能存在过时的数据。 在读取编程的位置之前、TI 建议首先刷新 CPU 子系统中的高速缓存。 “但是、我们确实尝试了清除缓存函数并使其失效、但它们没有解决问题。 是否有一个示例说明了在读取编程的闪存之前如何刷新缓存?
我在闪存示例代码中重新创建了一个类似的情况、该情况未通过对第一个编程字节的检查。 文中附上了该文件以及显示存储器和读取字节值彼此不匹配的屏幕截图。
image.png
以下是文件: main.c 
谢谢、祝您愉快!
Viktoriia

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

    您好、 Viktoriia Palianytsia 
    当您尝试回读并验证写入的闪存内容时、可以通过向 FRI->FRD_INTF_CTRL 寄存器写入值来禁用代码和数据缓存。  

    static bool Flash_Write_64_Bit(uint32_t address, uint8_t *data_buffer)
    {
        bool result = false;
        FRI->FRD_INTF_CTRL = 0;
        if (DL_FlashCTL_acquireFlashSemaphore() == DL_FLASH_SUCCESS)
        {
            DL_FlashCTL_executeClearStatus(NVMNW);
            DL_FlashCTL_unprotectSector(NVMNW, address, DL_FLASHCTL_REGION_SELECT_MAIN);
            DL_FLASHCTL_COMMAND_STATUS command_status = DL_FlashCTL_programMemory64WithECCGenerated(NVMNW, address, ((uint32_t *)(&data_buffer[0])));
            if (command_status == DL_FLASHCTL_COMMAND_STATUS_PASSED) // proceed if the programming operation has passed
            {
                volatile uint8_t check_value_target = ((uint8_t *)(address))[0u];
                volatile uint8_t check_value_source = data_buffer[0];
                if ((check_value_target == check_value_source)) // verify whether correct data was written (first byte)
                {
                    result = true;
                }
            }
            if (DL_FlashCTL_releaseFlashSemaphore() != DL_FLASH_SUCCESS) // semaphore should be released successfully
            {
                result = false;
            }
        }
    
        return result;
    }


    此致  
    Adwait Dhamane 

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

    感谢您发送编修。我们会重新检视您的建议。 是否可以实际刷新缓存而不是禁用然后再次启用缓存? 还是禁用也会清除高速缓存? 因为即使使用了禁用的缓存、如果我们想稍后读取数据、编程和验证后再次启用它、还会再次从缓存中获取一些过时的值吗?

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

    “Disable(禁用)“也会清除高速缓存。 因此、在验证之后、如果您再次启用高速缓存、则每当您再次读取闪存时、它不会返回过时的值。

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

    感谢您的澄清!