常见问答
- M051 系列(95)
- M0518 系列(97)
- M0519 系列(43)
- M0564 系列(1)
- Mini51 系列(90)
- Nano100 / 102 系列(101)
- Nano103 Base 系列(10)
- Nano110 / 112 LCD 系列(100)
- Nano120 USB 系列(111)
- Nano130 USB+LCD 系列(110)
- NUC029 系列(94)
- NUC100 / 200 系列(102)
- NUC120 / 122 / 123 / 220 USB 系列(116)
- NUC121/125 系列(1)
- NUC126 USB 系列(2)
- NUC130 / 230 CAN 系列(103)
- NUC131/NUC1311 CAN 系列(98)
- NUC140 / 240 USB+CAN 系列(114)
- M451 Base 系列(118)
- M451M 系列(117)
- M452 USB 系列(130)
- M4521 USB 系列(1)
- M453 CAN 系列(128)
- M463 CAN FD/USB HS 系列(1)
- M467 Ethernet/Crypto 系列(1)
- M471 系列(1)
- M479 Motor Control Series(1)
- M481 Base 系列(4)
- M482 USB FS OTG 系列(4)
- M483 CAN 系列(4)
- M484 USB HS OTG 系列(4)
- M485 Crypto 系列(4)
- M487 Ethernet 系列(4)
- M4TK 触摸 IC 系列(25)
- NUC442 / 472 系列(130)
- NUC472 Series(1)
- NUC505 系列(138)
常见问答
当芯片进行复位(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();
}
……
}
注: 本流程图引用自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) |