我想把债券信息存储在NOINIT部分,这样当被深度睡眠重置时,我的债券信息不会丢失。
嗨cgha,
因为你使用的是DA14580,我假设是SDK5.04, SDK的一些变化应该是不赢的,以便在重置期间保留初始化数据。DA14585/6和我们最新的SDK6(最新版本6.0.10),有存储初始化数据的能力。你有没有想过搬进DA14585/6?有一个软件示例演示了这种功能。
SW举例:DA14585/586检测复位源
谢谢,PM_Dialog
你能告诉我重置后,我应该对sdk 5.0.4进行哪些更改来存储和获取值吗?在我的想法中,我应该改变散点文件,任何其他地方我应该修改sdk 5.0.4,以保留重置后的值?
我在正常模式下使用延长睡眠,当ble上接收到sleep命令时,da14580就会进入深度睡眠,另一个mcu在需要重启时给da14580一个复位信号,重启后,我需要保留绑定信息以连接回绑定ios设备。
我注意到我的数据存储位于区域被标记为uninit分散的文件,例如,映射文件显示我的数据起始地址是0 x00082448,和数据长度是476字节,和散射文件列表这个区域uninit“ZI_RET20 0 x00080768 uninit 0 x22b8”,但似乎我的数据仍然丢失重置后,即使当我设置da14580延长睡眠前重置(因为我注意到这个区域是在SysRAM区域)。
请检查SystemInit()函数,你会发现SetBits16(PMU_CTRL_REG, RETENTION_MODE, 0xF);,因此所有保留内存的位设置为0,您已经看到了归零的保留内存区域是应该在设备启动时自保留区域在深度睡眠,除了用户数据,额外的祝福信息(BLE堆、栈等)。
重置后,将再次运行归零功能,并将清除保留内存区域中的任何数据。为了避免这种情况,你可以做的就是知道你的“数据”在存储区中的位置,在初始化期间,你应该避免将它们归零。没有任何参考设计或例子可以证明这一点,我想做的是:
在scatterfile中,为深度睡眠定义了保留内存区域,分配一个空间来保存不应该初始化的数据。
部分RETRAM_LEN将从你的新区段中使用,所以从#define RETRAM_LEN中删除你将使用的字节数,并添加新区段的大小(new RETRAM_LEN = RETRAM_LEN - SZ_AFT_RST_DATA):
§LR_RETENTION_RAM0 0x00080768 (RETRAM_LEN + EXCHANGE_MEMORY_SIZE + SZ_AFT_RST_DATA) {
在LR_RETENTION_RAM0中声明一个从0x00080768开始的执行区域。新的执行区域将从区域0x00080768开始,并具有您的需求范围(例如,您希望的范围将是SZ_AFT_RST_DATA 80字节)。所以scatterfile会变成:
§RET_RESET01 0x00080768 UNINIT SZ_AFT_RST_DATA {. any (unitialized_data_test)} <-标记新区域。
在此之后,ZI_RET00将从地址0x00080768 + SZ_AFT_RST_DATA开始,而不是从0x00080768开始。
因此,现在您知道,将使用unitialized_data_test标记的数据将驻留在地址0x00080768到地址0x00080768 + SZ_AFT_RST_DATA之间。因为您知道,您可以转到SystemInit()函数,并指示该函数不要将0x00080768和0x00080768+SZ_AFT_RST_DATA之间的内存归零。
//用零填充0x80000 - 0x83000 unsigned int *p_retmem = (unsigned int *)0x80000;for (i = 0xBFF;我> = 0;I——){if((p_retmem > (unsigned int *)0x80768) && (p_retmem < (unsigned int *)(0x80768 + 80)) *(volatile unsigned *)p_retmem++;Else (volatile unsigned *)p_retmem++ = 0;}
嗨cgha,
因为你使用的是DA14580,我假设是SDK5.04, SDK的一些变化应该是不赢的,以便在重置期间保留初始化数据。DA14585/6和我们最新的SDK6(最新版本6.0.10),有存储初始化数据的能力。你有没有想过搬进DA14585/6?有一个软件示例演示了这种功能。
SW举例:DA14585/586检测复位源
谢谢,PM_Dialog
你能告诉我重置后,我应该对sdk 5.0.4进行哪些更改来存储和获取值吗?在我的想法中,我应该改变散点文件,任何其他地方我应该修改sdk 5.0.4,以保留重置后的值?
我在正常模式下使用延长睡眠,当ble上接收到sleep命令时,da14580就会进入深度睡眠,另一个mcu在需要重启时给da14580一个复位信号,重启后,我需要保留绑定信息以连接回绑定ios设备。
我注意到我的数据存储位于区域被标记为uninit分散的文件,例如,映射文件显示我的数据起始地址是0 x00082448,和数据长度是476字节,和散射文件列表这个区域uninit“ZI_RET20 0 x00080768 uninit 0 x22b8”,但似乎我的数据仍然丢失重置后,即使当我设置da14580延长睡眠前重置(因为我注意到这个区域是在SysRAM区域)。
嗨cgha,
请检查SystemInit()函数,你会发现SetBits16(PMU_CTRL_REG, RETENTION_MODE, 0xF);,因此所有保留内存的位设置为0,您已经看到了归零的保留内存区域是应该在设备启动时自保留区域在深度睡眠,除了用户数据,额外的祝福信息(BLE堆、栈等)。
重置后,将再次运行归零功能,并将清除保留内存区域中的任何数据。为了避免这种情况,你可以做的就是知道你的“数据”在存储区中的位置,在初始化期间,你应该避免将它们归零。没有任何参考设计或例子可以证明这一点,我想做的是:
在scatterfile中,为深度睡眠定义了保留内存区域,分配一个空间来保存不应该初始化的数据。
部分RETRAM_LEN将从你的新区段中使用,所以从#define RETRAM_LEN中删除你将使用的字节数,并添加新区段的大小(new RETRAM_LEN = RETRAM_LEN - SZ_AFT_RST_DATA):
在LR_RETENTION_RAM0中声明一个从0x00080768开始的执行区域。新的执行区域将从区域0x00080768开始,并具有您的需求范围(例如,您希望的范围将是SZ_AFT_RST_DATA 80字节)。所以scatterfile会变成:
在此之后,ZI_RET00将从地址0x00080768 + SZ_AFT_RST_DATA开始,而不是从0x00080768开始。
因此,现在您知道,将使用unitialized_data_test标记的数据将驻留在地址0x00080768到地址0x00080768 + SZ_AFT_RST_DATA之间。因为您知道,您可以转到SystemInit()函数,并指示该函数不要将0x00080768和0x00080768+SZ_AFT_RST_DATA之间的内存归零。
谢谢,PM_Dialog