常见问答

常见问答

当芯片进行复位(Reset)时,如何保持复位前的SRAM状态,不对SRAM进行初始化的动作?  日期:2020-02-07

以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();

    }

    ……

}

282-1

注: 本流程图引用自KEIL官方文件

 

欲了解更详细的Startup 行为请参考KEIL的官方文件: http://www.keil.com/support/man/docs/armclang_intro/armclang_intro_
asa1505906246660.htm

产品: 微控制器 ,8 位 8051 微控制器 ,Arm Cortex-M0 微控制器 ,Arm Cortex-M23 微控制器 ,Arm Cortex-M4 微控制器
应用:
功能: Peripherals,Memory,SRAM,System Operation,Reset,Timer and PWM,Watchdog Timer (WDT)