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.

[参考译文] UCD3138A:如何设置数据闪存变量的结构

Guru**** 2535150 points


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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1041431/ucd3138a-how-to-setup-structure-for-data-flash-variables

器件型号:UCD3138A

大家好、

我想通过以下结构访问存储在数据闪存中的变量、从而对其进行清理:

typedef struct{
    float   Io_cal0;
    float   Io_cal1;
    char    ID[32];
    char    SN[16];
}data_flash_t;

其理念是只有一个变量/ 段、到目前为止、我在段的开头为每个变量提供了#pragma 定义。 但是、可能有更巧妙的方法将它们组合在一起、因此可以像"data_flash.sn"一样对它们进行访问。 主要的问题是、一些变量的长度只有4个字节、而段的长度为32个字节、并且位于准确的存储器位置。  我不知道我是否试图过多地推动变量的组织...

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

    我不知道你要做什么、或者你为什么要这么做。  EVM 代码通常将 dflash 值排列在单个结构中。  其最大优势是、使用结构的地址和大小值来创建校验和计算函数相对容易。  另一个好处是、对于单个结构、编译器会将结构开头的地址放入 CPU 中的通用寄存器中、然后仅使用偏移量来访问其余部分。  请注意、ARM7没有完全立即寻址。  相反、它会将存储器指针加载到寄存器中、然后使用偏移来访问区域中的内容。   

    如果您在同一段中有多个段、甚至有多个结构体或单个变量、它将为每个段重新加载一个新指针。   

    另一方面、在结构中混合不同大小的变量没有问题。  尽管如果您有一个8位后跟一个32位、但它可能会在8位1之后保留一个空的3个字节、因为 UCD 是一个32位字定向机器。  所以我建议组织一些事情,这样就不会有这样的漏洞。  将4 8个位值组织在一起、或将8个位值放在结构的末尾。   

    你也可以这样做,但你会遇到我上面提到的困难。   

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

    因此、我想保留数据闪存系数、用户可以使用串行接口更改这些系数。 我只有 ~10个变量、并且由于有64个32字节的块 、我只想 保留一个变量/块、因此我不需要优化存储器、 它将使擦除更简单-在擦除之前、无需将其他变量复制到 RAM

    结构如下所示:

    typedef struct{
        float   Io_cal0;    // block 0 &0x18800
        float   Io_cal1;    // block 1 &0x18820
        char    ID[32];     // block 2 &0x18840
        char    SN[16];     // block 3 &0x18860
    }data_flash_t;

    问题是、默认情况下、编译器会按以下方式打包数据:

    typedef struct{
        float   Io_cal0;    // block 0 &0x18800
        float   Io_cal1;    // block 0 &0x18802
        char    ID[32];     // block 0 and 1 &0x18804
        char    SN[16];     // block 1 &0x18824
    }data_flash_t;

    当然、我可以制作这样的结构来保持 这种对齐、但我想知道它是否可以更优雅地完成

    typedef struct{
        float   Io_cal0;    // block 0 &0x18800
        char    fill1[28];  // block 0 &0x18804
        float   Io_cal1;    // block 1 &0x18820
        char    fill2[28];  // block 1 &0x18824
        char    ID[32];     // block 2 &0x18840
        char    SN[16];     // block 3 &0x18860
        char    fill3[16];  // block 3 &0x18870
    }data_flash_t;

    BTW、您是否可以 使用数据闪存链接我、请发送 EVM 代码? 我下载 了026、027和029 (正如数据表中的建议)、并且在那里看不到任何数据闪存存储的变量

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

    您可以通过查找类似以下内容在所有这些工具中找到它:

    #pragma DATA_SECTION (pFC_config_constants_a、".config");
    volatile const PFC_config_struct PFC_config_constants_a = PFC_CONFIG_DEFAULT;

    这来自026 PFC。  有时它可能是.config_A  然后、您可以搜索 PFC_config_constants_A 的定义

    在数据闪存擦除/写入期间、如果电源发生故障、我们有两组配置数据和校验和。  在擦除另一组数据中的旧数据之前、我们始终确保正确写入新数据。