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

1 篇文章 0 订阅
1 篇文章 0 订阅

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

1、复位类型判断

参考文档:nRF52810_PS_v1.3.pdf
在这里插入图片描述

	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 源文件代码

#pragma location = 0x20005ff8
__root __no_init volatile uint32_t g_timeStamp;

2.2) app工程 .icf文件修改
用 ram 的最后一小部分空间作为 noinit 块使用

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;
define region noinit_region  = mem:[from __ICFEDIT_region_noinit_RAM_start__  to __ICFEDIT_region_noinit_RAM_end__ ];
place in noinit_region  { readwrite section .noinit};

3、设置boot工程 非初始化块ram地址范围 与app工程一致
3.1) boot工程 .c 源文件代码

#pragma location = 0x20005ff8
__root __no_init volatile uint32_t s_usrTime;
void UpdataUsrTimestamp()
{
    static uint32_t startTime  = 0;
    
    if(0 == startTime)
        startTime = s_usrTime;

    s_usrTime = startTime + (nrf_bootloader_dfu_timer_counter_get() >> 15);
}

喂狗函数内添加上述时间更新函数 UpdataUsrTimestamp

void nrf_bootloader_wdt_feed(void)
{
    UpdataUsrTimestamp();
    if (nrf_wdt_started())
    {
        wdt_feed();
    }
}

3.2) boot工程 .icf文件修改

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;
define region noinit_region = mem:[from __ICFEDIT_region_noinit_RAM_start__  to __ICFEDIT_region_noinit_RAM_end__];
place in noinit_region { readwrite section .noinit };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值