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.

[参考译文] TMS570LS1224:通过擦除和写入数据来测试闪存的代码

Guru**** 2577385 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/747091/tms570ls1224-code-to-test-flash-by-erasing-and-writing-data

器件型号:TMS570LS1224

您好!

我想编写一个代码来测试闪存擦除和写入。
假设我要向地址(0x00010100)写入一个字节的数据(0x1)。
FlashDestination 应为:0x00010100
buf 为:uint8 buf[1]={0x1}
DATA_SIZE 应为:1
ImageSize 将为:1.
您认为以下代码是否适用于单元测试:

//初始化闪存包装程序寄存器。
oReturnCheck = 0;
oReturnCheck = Fapi_BlockErase (Bank0、FlashDestination、ImageSize);
//如果发生访问冲突则返回错误。
if (oReturnCheck)
{
state = AbortHeader;
}
oReturnCheck = 0;

oReturnCheck = Fapi_BlockProgram (Bank0、FlashDestination、buf、data_size);
if (oReturnCheck)
{
//指示闪存编程失败。
状态= AbortHeader;
} 


谢谢、此致、
Abrar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Abrar、
    您的问题将由我们的专家解答。

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

    地址应在64位边界上对齐:0x...... 00、0x…… 08.您可以写入1字节数据、但 ECC 是使用附加了零(56位)的1字节数据计算得出的。

    在单次操作中、闪存状态机实际上可以对16字节数据和2字节 ECC 进行编程。 它将加快编程速度。 我在引导加载程序示例代码中这样做了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的回复。

    我尝试存储一个16字节的缓冲区:

    uint8 buf[16]={1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16};

    到地址0x00120000

    在检查存储器窗口中的内容后、显示如下:

    它是否错误地将数据存储在闪存中?

    谢谢、此致、

    Abrar

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

    您好 Abrar、

    您需要在 SRAM 中执行您的代码。

    这是我的代码和测试结果。  

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

    您好!

    感谢您的回复。

    我使用的是 IAR v8.22.2。

    因此、我必须将以下行添加到链接器文件中:

    通过复制{对象 F021_API_CortexR4_be.lib}进行初始化;

    通过复制{对象 BL_FLASH.o }进行初始化;

    在 F021闪存 API 头文件- CGT.IAR.h 中     ,我将#if !defined (__lit_ENDIAN__)替换为#if (__lit_ENDIAN__=0)。

    在代码中、我必须在闪存操作之前禁用中断。

    uint8 buf[16]={1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16};
    uint8 rbuf[16]={0};
    
    disable_interrupt_();
    
    oReturnCheck = Fapi_BlockErase (0x0、0x00120000、0x1000);
    //如果发生访问冲突则返回错误。
    if (oReturnCheck)
    {
    状态= AbortHeader;
    }
    
    oReturnCheck = Fapi_BlockProgram (0x0、0x00120000、(UINT32) buf、16);
    if (oReturnCheck)
    {
    //指示闪存编程失败。
    State = AbortHeader;
    }
    
    fapi_BlockRead (0x0、(UINT32) rbuf、0x00120000、16);
    
    _enable_interrupt_(); 

    此致、

    Abrar