[技术问答] 当芯片进行复位(Reset)时,如何保持复位前的SRAM状态

[复制链接]
802|6
 楼主| yiyigirl2014 发表于 2020-10-20 22:56 | 显示全部楼层 |阅读模式
以M031芯片被看门狗定时器(WDT)复位为例。
芯片进行复位后,会由startup_M031Series.s开始执行程序代码。其中会跳转到system_M031Series.c中的System_Init的函数,再跳转至__main函数。

LDR    R0, =SystemInit  // 设定R0为SystemInit的位置
BLX    R0            // 跳转至R0位置并执行Thumb指令
LDR    R0, =__main    // 设定R0为__main函数的位置
BX      R0            // 跳转至R0的位置

__main函数是由编译程序自行创建,此函数会对SRAM进行初始化的动作,包含将RW-data与ZI-data复制到SRAM、初始化ZI-data为0等,再跳转至__rt_entry函数。
__rt_entry函数也由编译程序自行创建,此函数会建立执行程序所需的环境,包含初始化Stack与Heap以及Library等,最后再跳转至main()函数。

若是用户在芯片受到看门狗定时器复位后想要保持复位前的SRAM状态,只要在进入__main函数前,直接跳转至main()函数即可。

extern int32_t main(void);
void SystemInit(void)
{
    /* If the last reset source is WDT Reset, do not reset SRAM */
    if(SYS->RSTSRC & SYS_RSTSRC_RSTS_WDT_Msk)
    {
        main();
    }
    ……
}
8495f8efa8d0d6e0.png


 楼主| yiyigirl2014 发表于 2020-10-20 22:57 | 显示全部楼层
欲了解更详细的Startup 行为请参考KEIL的官方文件: https://www.keil.com/support/man/docs/armclang_intro/armclang_intro_asa1505906246660.htm
gwsan 发表于 2020-11-10 13:35 | 显示全部楼层
是不是需要外扩一个存储芯片啊
kxsi 发表于 2020-11-10 13:36 | 显示全部楼层
需要不停的对代码搬家吧
nawu 发表于 2020-11-10 13:36 | 显示全部楼层
看不太明白汇编语言啊
qcliu 发表于 2020-11-10 13:36 | 显示全部楼层
官网有详细的代码吗?
tfqi 发表于 2020-11-10 13:37 | 显示全部楼层
太细心了 连网址都有了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

230

主题

3676

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部