STM32F10XXX的复位

2019-07-13 23:11发布

1. 电源

  • STM32的工作电压(VDD)为2.0~3.6V。通过内置的电压调节器提供所需的1.8V电源。
  • 当主电源VDD掉电后,通过VBAT脚为实时时钟(RTC)和备份寄存器提供电源。
这里写图片描述 注:VDDA和VSSA必须分别联到VDD和VSS。

2. STM32F10XXX的复位

STM32F10XXX支持三种复位形式,分别为系统复位、上电复位和备份区域复位

2.1. 系统复位

除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器(见图1)以外,系统复位将复位所有寄存器至它们的复位状态。 当发生以下任一事件时,产生一个系统复位:
  • NRST引脚上的低电平(外部复位)
  • 窗口看门狗计数终止(WWDG复位)
  • 独立看门狗计数终止(IWDG复位)
  • 软件复位(SW复位)
  • 低功耗管理复位
可通过查看RCC_CSR控制状态寄存器中的复位状态标志位识别复位事件来源。

2.1.1. 软件复位

通过将Cortex™-M3中断应用和复位控制寄存器中的SYSRESETREQ位置’1’,可实现软件复位,详见第三章

2.1.2. 低功耗管理复位

在以下两种情况下可产生低功耗管理复位:
  • 在进入待机模式时产生低功耗管理复位: 通过将用户选择字节中的nRST_STDBY位置’1’将使能该复位。这时,即使执行了进入待机模式的过程,系统将被复位而不是进入待机模式。
  • 在进入停止模式时产生低功耗管理复位: 通过将用户选择字节中的nRST_STOP位置’1’将使能该复位。这时,即使执行了进入停机模式的过程,系统将被复位而不是进入停机模式。

2.2. 电源复位

当以下事件中之一发生时,产生电源复位:
  • 上电/掉电复位(POR/PDR复位)
  • 从待机模式中返回
电源复位将复位除了备份区域外的所有寄存器。(见图1) 图中复位源将最终作用于RESET引脚,并在复位过程中保持低电平。复位入口矢量被固定在地址0x0000_0004。 芯片内部的复位信号会在NRST引脚上输出,脉冲发生器保证每一个(外部或内部)复位源都能有至少20μs的脉冲延时;当NRST引脚被拉低产生外部复位时,它将产生复位脉冲 这里写图片描述

2.3. 备份域复位

备份区域拥有两个专门的复位,它们只影响备份区域(见图1)。 当以下事件中之一发生时,产生备份区域复位。
  • 软件复位,备份区域复位可由设置备份域控制寄存器 (RCC_BDCR) BDRST位产生。
  • 在VDD和VBAT两者掉电的前提下,VDD或VBAT上电将引发备份区域复位。

3. 应用中断与复位控制寄存器

3.1. 寄存器

应用中断与复位控制寄存器用于:
  • 决定数据的字节顺序
  • 清除所有有效的状态信息,以便进行调试或从硬故障中恢复
  • 执行系统复位
  • 改变优先级分组位置(二进制小数点)
寄存器地址、访问类型和复位状态:
  • 地址:0xE000ED0C
  • 访问类型:读/写
  • 复位状态:0x00000000
图3:应用中断与复位控制寄存器 应用中断与复位控制寄存器的位分配如图:
这里写图片描述这里写图片描述

3.2. 代码

  • 寄存器版:
*((u32 *)0xE000ED0C) = 0x05fa0004;
  • 库函数版:
static __INLINE void NVIC_SystemReset(void) { SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | /* 取消写保护 */ (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | /* 优先级分组不变 */ SCB_AIRCR_SYSRESETREQ_Msk); /* 请求复位 */ __DSB(); /* 确保内存访问完毕 */ while(1); /* 等待复位 */ } DSB指令即Data Synchronization Barrier(数据同步屏障),它是一种特殊类型的内存屏障。 只有当此指令执行完毕后,才会执行程序中位于此指令后的指令。 当满足以下条件时,此指令才会完成:
  • 位于此指令前的所有显式内存访问均完成。
  • 位于此指令前的所有缓存、跳转预测和 TLB 维护操作全部完成。
该指令用来保证在软件复位之后保证内存数据操作都已完成,避免在有些数据还没有来的及更新到目标地址或者目标寄存器前就触发芯片复位从而造成数据丢失,这个还是很重要的 另外和内存屏障相关的还有两个指令,为DMB(Data Memory Barrier)和ISB(Instruction Synchronization Barrier)。