“线程”中讨论的其它部件:TM4C123, 测试
TI-RTOS 2.16.01.14
蒂瓦尔 C 2.2.0.295
CCS 10.2.0
我希望能够将一些配置信息(如默认 IP 地址,固件版本和一些常量)存储在闪存中的空位置(与我的程序存储器非常分离)-查看0xf0000以供参考。 是否有方法手动或通过脚本加载这些值? 我似乎无法在内存浏览器中直接编辑它。 它需要是只在初始程序加载时运行的位置。 有什么建议?
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.
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 的内容。 下面的帖子也会很有帮助。
[引用 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,应将其放置在何处?
通过使用 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。
通过 CCS 写入 EEPROM 是一个示例 CCS 凝胶文件,用于在 TM4C123设备上对 EEPROM 进行编程。 这可以用作定制凝胶脚本的基础,当 CCS 下载程序并写入 EEPROM 时,将使用该脚本。
我没有尝试自己测试。