亲爱的Dialog_Support,
我已经存储了一个变量的值到flash中,我想在重置发生看门狗定时器后检索那个值。但我不能认识到复位发生由于看门狗或任何其他原因。我读过这篇文章
https://support.dialog-semiconductor.com/how-could-i-know-whether-reset-..。
我知道,如果我们在保留RAM中声明变量,那么我们就可以在watchdog之后检索它。另一个解决方案是使用外部存储器。由于我的应用程序没有任何外部内存,我必须声明变量到保留RAM。我已经尝试这样做,但我不能检索它的价值后watchdog重置。你能不能给我举个例子,把值存储到保留RAM中,然后在设备重置后取回。
提前谢谢你
与问候,
前腿帕特尔
设备:
嗨,前腿帕特尔
你可以将你的数据存储到保留RAM中,就像你在过去发布的线程中描述的那样。请注意,在设备重置后,您存储的数据将会丢失。请检查SystemInit()函数,你会发现SetBits16(PMU_CTRL_REG, RETENTION_MODE, 0xF);,因此所有保留内存的位设置为0,您已经看到了归零的保留内存区域是应该在设备启动时自保留区域在深度睡眠,除了用户数据,额外的祝福信息(BLE堆、栈等)。
重置后,归零功能将再次运行,并将清除任何数据,你在保留记忆区域。为了避免这种情况,你可以做的是知道你的“数据”驻留在保留内存区域的什么地方,并且在初始化期间你应该避免将它们归零。没有参考设计或例子可以证明这一点,我想做的是:
在scatterfile中,保留区是为深度睡眠定义的,分配一个空间将保存不应该初始化的数据。
§LR_RETENTION_RAM0 0x00080768 (RETRAM_LEN + EXCHANGE_MEMORY_SIZE + SZ_AFT_RST_DATA) {
§RET_RESET01 0x00080768 UNINIT SZ_AFT_RST_DATA {. any (unitialized_data_test)} <-标记新区域。
因此,现在您知道将被unitialized_data_test标记的数据将驻留在地址0x00080768到地址0x00080768 + SZ_AFT_RST_DATA之间。因为您知道,可以转到SystemInit()函数,并指示该函数不要将0x00080768和0x00080768+SZ_AFT_RST_DATA之间的内存归零。
//用0填充0x80000 - 0x83000
Unsigned int *p_retmem = (Unsigned int *)0x80000;
for (i = 0xBFF;我> = 0;我——)
{
If ((p_retmem > (unsigned int *)0x80768) && (p_retmem < (unsigned int *)(0x80768 + 80)))
*(不稳定的无符号*)p_retmem + +;
其他的
*(volatile unsigned *)p_retmem++ = 0;
}
谢谢,PM_Dialog
我也需要这个功能,以便在看门狗咬人的情况下进行无声重置。
我使用的是SDK5,这与这个解释并不完全一致。
你能把这个指南重新应用到SDK5吗?
我做了进一步的调查
如果我使用uint8_t silent_reset __attribute__((section("retention_mem_area_uninit"));(省略zero_init属性)我的变量" silent_reset "结束于" Execution Region RET_DATA "的开头,并且类型为Data而不是Zero -像这样:
0x07fd4804 0x00000001数据RW
不过,它被看门狗咬了一口也活不了。
如果我使用__attribute__((section("retention_mem_area_uninit"));一个人应该认为它结束在执行区域RET_DATA_UNINIT,但它结束在LR_IROM3 -为什么?
嗨jarirenejensen,
凯尔的部门是32个字节对齐,所以最大保留未初始化的数据,需要由应用程序(CFG_RET_DATA_UNINIT_SIZE da1458x_stack_config.h头文件中定义)必须是4的倍数(4 x 8 = 32字节)大于或等于总的数据的总和。如果CFG_RET_DATA_UNINIT_SIZE不是4的倍数,Keil会将其截断为4的最小倍数,否则如果数据不能匹配,则会删除hole部分。请确保CFG_RET_DATA_UNINIT_SIZE是4的倍数。
谢谢,PM_Dialog
谢谢-这是我错过的部分。