我是靠谱客的博主 失眠紫菜,最近开发中收集的这篇文章主要介绍IAR下 __no_init ram nRF52810 软复位不丢时间戳 ram 保持,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

最后

以上就是失眠紫菜为你收集整理的IAR下 __no_init ram nRF52810 软复位不丢时间戳 ram 保持的全部内容,希望文章能够帮你解决IAR下 __no_init ram nRF52810 软复位不丢时间戳 ram 保持所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部