nRF52810 软复位不丢时间戳 ram 保持


需求 :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 };