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.

[参考译文] TM4C129ENCPDT:仅在加载时将变量编程到闪存位置

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1072327/tm4c129encpdt-programming-variable-to-flash-location-only-at-load

部件号:TM4C129ENCPDT
“线程”中讨论的其它部件:TM4C123测试

TI-RTOS 2.16.01.14

蒂瓦尔 C 2.2.0.295

CCS 10.2.0

我希望能够将一些配置信息(如默认 IP 地址,固件版本和一些常量)存储在闪存中的空位置(与我的程序存储器非常分离)-查看0xf0000以供参考。 是否有方法手动或通过脚本加载这些值? 我似乎无法在内存浏览器中直接编辑它。 它需要是只在初始程序加载时运行的位置。 有什么建议?  

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

    嗨 Peter,

     请参阅 ARM 编译器用户指南第 5.11.8节中关于使用 data_section Pragma 的内容。 下面的帖子也会很有帮助。  

    https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/897732/compiler-msp432e401y-pragma-data_section-requiring-my-variable-be-declared-as-constant

    [引用 userid="500172" url="~/support/icros/arm-based 微处理器组/基于 ARM 的微控制器/f/arm-based 微控制器-forum/1072327/tm4c129encpdt-programming-variable to flash-location-only-load"]我似乎无法在浏览器/引用内存中直接编辑它[。]

    闪存是非易失性的。 不能在调试器(如 SRAM)中写入闪存。如果要在运行时将数据写入闪存,可以使用 FlashProgram()和 FlashEras() API。 请参阅以下内容,并参阅了解详细信息的 TivAware 外设驱动程序用户指南。  

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

    谢谢,这种联系非常有帮助。 我将研究持久性 pragma。  

    我对该线程中的答案感兴趣,该线程建议使用 EEPROM,因为这是我最初开始使用的。 我转而选择 Flash,希望我能充分利用这样一个事实:您必须故意删除它,然后才能重新编程。 我的计划是在我的应用程序初始化过程中只使用  程序 API 函数进行一次编程。 然后,只要需要更改,我就会重新删除块和程序。 这样,重置不会覆盖新编程的值,但程序加载会将其恢复为默认值。  

    这里的问题是,在擦除数据块之前,我必须先读取,保存和比较数据块中未更改的任何内容,或者将每条数据保留在单独的闪存块上。  

    通过使用 EEPROM,我不仅可以避免擦除,还可以覆盖特定位置并更密集地使用内存。  

    那么,问题是持久性 pragma 是否也会应用于 EEPROM 中的位置?

    #define IP_ADDR_LOC 0x400AF420

    #pragma PERSISTENT

    #pragma location = IP_ADDR_LOC

    uint32_t IPAddr = 0xAC100A01;

    这样,可以在主页眉中设置一个默认值,这实际上是在 EEPROM 中将该值编程到该位置,还是我需要使用 API 功能? 如果是 API,应将其放置在何处?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="500172" url="~/support/icles/arm-based 微处理器组/基于 ARM 的微处理器/f/arm-based 微处理器- forum/1072327/tm4c129encpdt-programming-variable to flash-location-only-load/3968899#3968899 "]

    通过使用 EEPROM,我不仅可以避免擦除,还可以覆盖特定位置并更密集地使用内存。  

    那么,问题是持久性 pragma 是否也会应用于 EEPROM 中的位置?

    [/引用]

    嗨 Peter,

     不能,您不能在 EEPROM 上使用 pragma。 EEPROM 存储器不是映射到 CPU 地址空间的内存。 EEPROM 程序和擦除也需要通过 API。 EEPROM 编程与主闪存编程不同。 从程序员的模型角度看,您需要将它们视为两种不同的非易失性记忆。  我相信您已经了解了 EEPROM API。 下面是如何使用它们的示例。 您说您在开始使用 EEPROM。 你有什么问题?

     

    uint32_t ui32EEPROMInit;
    uint32_t pui32Data[2];
    uint32_t pui32Read[2];
    //
    // Enable the EEPROM module.
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_EEPROM0);
    //
    // Wait for the EEPROM module to be ready.
    //
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_EEPROM0))
    {
    }
    //
    // Wait for the EEPROM Initialization to complete
    //
    ui32EEPROMInit = EEPROMInit();
    //
    // Check if the EEPROM Initialization returned an error
    // and inform the application
    //
    if(ui32EEPROMInit != EEPROM_INIT_OK)
    {
    while(1)
    {
    }
    }
    //
    // Program some data into the EEPROM at address 0x400.
    //
    pui32Data[0] = 0x12345678;
    pui32Data[1] = 0x56789abc;
    EEPROMProgram(pui32Data, 0x400, sizeof(pui32Data));
    //
    // Read it back.
    //
    EEPROMRead(pui32Read, 0x400, sizeof(pui32Read));

    [引用 userid="500172" url="~/support/icros/arm-based 微处理器组/基于 ARM 的微控制器/f/基于 ARM 的微控制器-forum/1072327/tm4c129encpdt-programming-variable to flash-location-only-load/3968899#3968899",我是否需要在该默认程序中设置该功能,或在该功能中设置?] 如果是 API,应将其放置在何处?

    正如我在上面所解释的,您必须使用 EEPROM API 将数据编程到 EEPROM 中。 如果您需要在运行时更新不受重置或电源循环影响的数据,我还认为 EEPROM 是您的应用程序的正确选择。  

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

    我的问题是在加载程序时只初始化一次。 这很容易通过闪存中的持久性 pragma 实现,但闪存的缺点是覆盖整个块,并且必须基本上保存,编辑并重新编程。 我更喜欢按照您的建议和我的想法使用 EEPROM,但我无法确定如何在  程序加载时只初始化其中的位置一次。 这是一个用例:

    1.我有一个默认的 IP 地址,在程序加载时,我将编程到每个微系统中。  

    2.用户可以在使用新 IP 重置堆栈时更改地址(我已了解此部分)

    3.该 IP 现在应该在 EEPROM 中,并从现在开始在后续重置和电源循环后使用<-这是我缺少的,因为我对步骤1的初始化将用默认值覆盖

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

    嗨 Peter,

     您是否还可以在 EEPROM 上存储标志,作为初始化默认 IP 或跳过步骤1的条件? 例如,如果标志值等于0xA5A5,则不要 运行初始化步骤。 该标志将默认为 EEPROM 上的0xFFFFFFFF,因为这将是原始硅上的值。 在步骤3中,在对新 IP 进行编程后,您还可以将该标志编程为0xA5A5或任何所需值。  在下一个加电循环中,该标志保持为0xA5A5, 您将跳过步骤1。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="500172" url="~/support/icros/arm-based 微处理器-组/基于 ARM 的微处理器/f/基于 ARM 的微控制器- forum/1072327/tm4c129encpdt-编程-可变-闪存-位置-仅限加载/3969145#3969145"我的程序在加载时初始化一次]。

    通过 CCS 写入 EEPROM 是一个示例 CCS 凝胶文件,用于在 TM4C123设备上对 EEPROM 进行编程。 这可以用作定制凝胶脚本的基础,当 CCS 下载程序并写入 EEPROM 时,将使用该脚本。

    我没有尝试自己测试。