打印
[技术问答]

当芯片进行复位(Reset)时,如何保持复位前的SRAM状态

[复制链接]
480|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
以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();
    }
    ……
}


使用特权

评论回复
沙发
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 | 只看该作者
需要不停的对代码搬家吧

使用特权

评论回复
5
nawu| | 2020-11-10 13:36 | 只看该作者
看不太明白汇编语言啊

使用特权

评论回复
6
qcliu| | 2020-11-10 13:36 | 只看该作者
官网有详细的代码吗?

使用特权

评论回复
7
tfqi| | 2020-11-10 13:37 | 只看该作者
太细心了 连网址都有了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

3530

帖子

10

粉丝