需求 :nRF52810 软复位不丢时间戳 ram 保持
1、复位类型判断
参考文档:nRF52810_PS_v1.3.pdf
1 2 3 4 5 6 7 8 9 | if(0 == (0x0005000f & nrf_power_resetreas_get())){ g_timeStamp = (NRF_RTC0->COUNTER)>>15; NRF_LOG_DEBUG("--> HardWare reset"); }else if(1 == nrf_power_resetreas_get()){ g_timeStamp = (NRF_RTC0->COUNTER)>>15; NRF_LOG_DEBUG("--> Reset Pin reset");//根据实测复位按键复位和上电复位一样会丢失 noinit ram数据 }else{ NRF_LOG_DEBUG("--> SoftWare reset"); } |
2、设置app工程 非初始化块ram地址范围 与 boot工程一致
2.1) app工程 .c 源文件代码
1 2 | #pragma location = 0x20005ff8 __root __no_init volatile uint32_t g_timeStamp; |
2.2) app工程 .icf文件修改
用 ram 的最后一小部分空间作为 noinit 块使用
1 2 3 4 | define symbol __ICFEDIT_region_RAM_start__ = 0x20002510; define symbol __ICFEDIT_region_RAM_end__ = 0x20005fff - 8; define symbol __ICFEDIT_region_noinit_RAM_start__ = 0x20005ff8; define symbol __ICFEDIT_region_noinit_RAM_end__ = 0x20005fff; |
1 | define region noinit_region = mem:[from __ICFEDIT_region_noinit_RAM_start__ to __ICFEDIT_region_noinit_RAM_end__ ]; |
1 | place in noinit_region { readwrite section .noinit}; |
3、设置boot工程 非初始化块ram地址范围 与app工程一致
1 2 3 4 | define symbol __ICFEDIT_region_RAM_start__ = 0x20002390; define symbol __ICFEDIT_region_RAM_end__ = 0x20005fff - 8; define symbol __ICFEDIT_region_noinit_RAM_start__ = 0x20005ff8; define symbol __ICFEDIT_region_noinit_RAM_end__ = 0x20005fff; |
1 | define region noinit_region = mem:[from __ICFEDIT_region_noinit_RAM_start__ to __ICFEDIT_region_noinit_RAM_end__]; |
1 | place in noinit_region { readwrite section .noinit }; |