mcu_reset

单片机复位介绍

经典的STM32内部复位电路如下

image-20240410090253667

可以看到复位分为两大类:内部复位和外部复位

  • 内部复位源通过脉冲发生器在 NRST 引脚产生延时至少 20μs 的脉冲,引起 NRST 保持电平产生复位;

  • 外部复位源则直接将 NRST 引脚电平拉低产生复 位。

外部复位

NRST 引脚上的低电平。

软件复位

将 Arm® Cortex®-M3 中断应用和复位控制寄存器中的 SYSRESETREQ 置“1” 时,可实现软件复位。JLINK对设备的复位就是控制的这一位。Reset: Reset device via AIRCR.SYSRESETREQ.

内核复位

在Cortex-M内核文档中大概有这样的描述:通过设置 NVIC 中应用程序中断与复位控制寄存器(AIRCR)的VECTRESET 位,可只复位处理器内核而不复位其它片上设施。

也就是说,这样操作只复位Cortex-M内核,不会复位UART这些片内外设。

1
2
3
4
5
6
7
8
9
void NVIC_CoreReset(void)
{
__DSB();
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_VECTRESET_Msk); //置位 VECTRESET
__DSB();
while(1) { __NOP(); }
}
系统复位

软件复位中的系统复位操作的寄存器位(SYSRESETREQ)不同,复位的对象为整个芯片(除后备区域)。

系统复位函数:

1
2
3
4
5
6
7
8
9
void NVIC_SysReset(void)
{
__DSB();
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_SYSRESETREQ_Msk); //置位 SYSRESETREQ
__DSB();
while(1) { __NOP(); }
}
电源复位

分为上电复位(POR 复位),掉电复位(PDR 复位),从待机模式唤醒。

依靠单片机内部的电源监控电路,在供电电压达不到设定值时自动进行复位。当检测到 VDD/VDDA低于阈值电压 VPOR和 VPDR 时,芯片将会自动保持为复位状 态,上电复位和掉电复位的波形图如下。

image-20240410114131548

低功耗复位

低功耗管理复位的产生有两种情况,一种是进入待机模式时,另一种是进入停止 模式时。在这两种情况下,如果把用户选择字节中的 RSTSTDB 位(待机模式 时)或 RSTSTOP 位(停止模式时)清零,系统将被复位而不是进入待机模式或 停止模式。

复位源查看

可以通过查看 RCM_CSTS(控制/状态寄存器)中的复位标志位识别复位事件来源,也可以相应清除标志位。

image-20240410114427398