STM32+复位学习总结

文章目录

  • 复位
    • 电源复位
    • 系统复位
    • 备份域复位
    • API相关函数接口使用
      • 复位标志类型
      • 获取
      • 清除中断标志位

复位

共有三种类型的复位,分别为系统复位、电源复位和备份域复位

电源复位

只要发生以下事件之一,就会产生电源复位:

  1. 欠压复位 (BOR)。
  2. 退出待机模式时。
  3. 退出关断模式时。
    欠压复位,包括上电或掉电复位 (POR/PDR),将所有寄存器设置为其复位值,备份域除外。
    退出待机模式时,VCORE 域的所有寄存器都设置为其复位值。VCORE 域外的寄存器(RTC,
    WKUP,IWDG,以及待机/关断模式控制)不受影响。
    退出关断模式时,会产生欠压复位,将除备份域中的寄存器以外的所有寄存器全部复位。

系统复位

除了时钟控制/状态寄存器 (RCC_CSR) 中的复位标志和备份域中的寄存器外,系统复位会将
其他全部寄存器都复位为复位值。
只要发生以下事件之一,就会产生系统复位:

  1. NRST 引脚低电平(外部复位)
  2. 窗口看门狗事件(WWDG 复位)
  3. 独立看门狗事件(IWDG 复位)
  4. 防火墙事件(FIREWALL 复位)
  5. 软件复位(SW 复位)
  6. 低功耗模式安全复位
  7. 选项字节加载器复位
  8. 欠压复位

可通过查看控制/状态寄存器 (RCC_CSR) 中的复位标志确定复位源
STM32+复位学习总结_第1张图片

备份域复位

备份域具有两个特殊复位。
只要发生以下事件之一,就会产生备份域复位:

  1. 软件复位,通过将备份域控制寄存器 (RCC_BDCR) 中的 BDRST 位置 1 触发。
  2. 在电源 VDD 和 VBAT 都已掉电后,其中任何一个又再上电。
    备份域复位仅影响 LSE 振荡器、RTC、备份寄存器和 RCC 备份域控制寄存器

API相关函数接口使用

复位标志类型

/* Flags in the CSR register */
#define RCC_FLAG_LSIRDY                ((CSR_REG_INDEX << 5U) | RCC_CSR_LSIRDY_Pos)    /*!< LSI Ready flag */
#define RCC_FLAG_FWRST                 ((CSR_REG_INDEX << 5U) | RCC_CSR_FWRSTF_Pos)    /*!< Firewall reset flag */
#define RCC_FLAG_OBLRST                ((CSR_REG_INDEX << 5U) | RCC_CSR_OBLRSTF_Pos)   /*!< Option Byte Loader reset flag */
#define RCC_FLAG_PINRST                ((CSR_REG_INDEX << 5U) | RCC_CSR_PINRSTF_Pos)   /*!< PIN reset flag */
#define RCC_FLAG_BORRST                ((CSR_REG_INDEX << 5U) | RCC_CSR_BORRSTF_Pos)   /*!< BOR reset flag */
#define RCC_FLAG_SFTRST                ((CSR_REG_INDEX << 5U) | RCC_CSR_SFTRSTF_Pos)   /*!< Software Reset flag */
#define RCC_FLAG_IWDGRST               ((CSR_REG_INDEX << 5U) | RCC_CSR_IWDGRSTF_Pos)  /*!< Independent Watchdog reset flag */
#define RCC_FLAG_WWDGRST               ((CSR_REG_INDEX << 5U) | RCC_CSR_WWDGRSTF_Pos)  /*!< Window watchdog reset flag */
#define RCC_FLAG_LPWRRST               ((CSR_REG_INDEX << 5U) | RCC_CSR_LPWRRSTF_Pos)  /*!< Low-Power reset flag */

获取

/** @brief  检查是否设置了所选的RCC标志。
  * @param  __FLAG__指定要检查的标志。
  *         This parameter can be one of the following values:
  *            @arg @ref RCC_FLAG_MSIRDY  MSI oscillator clock ready
  *            @arg @ref RCC_FLAG_HSIRDY  HSI oscillator clock ready
  *            @arg @ref RCC_FLAG_HSERDY  HSE oscillator clock ready
  *            @arg @ref RCC_FLAG_PLLRDY  Main PLL clock ready
  *            @arg @ref RCC_FLAG_PLLSAI1RDY  PLLSAI1 clock ready for devices with PLLSAI1
  *            @arg @ref RCC_FLAG_PLLSAI2RDY  PLLSAI2 clock ready for devices with PLLSAI2
  @if STM32L443xx
  *            @arg @ref RCC_FLAG_HSI48RDY  HSI48 clock ready for devices with HSI48
  @endif
  @if STM32L4A6xx
  *            @arg @ref RCC_FLAG_HSI48RDY  HSI48 clock ready for devices with HSI48
  @endif
  *            @arg @ref RCC_FLAG_LSERDY  LSE oscillator clock ready
  *            @arg @ref RCC_FLAG_LSECSSD  Clock security system failure on LSE oscillator detection
  *            @arg @ref RCC_FLAG_LSIRDY  LSI oscillator clock ready
  *            @arg @ref RCC_FLAG_BORRST  BOR reset
  *            @arg @ref RCC_FLAG_OBLRST  OBLRST reset
  *            @arg @ref RCC_FLAG_PINRST  Pin reset
  *            @arg @ref RCC_FLAG_FWRST  FIREWALL reset
  *            @arg @ref RCC_FLAG_SFTRST  Software reset
  *            @arg @ref RCC_FLAG_IWDGRST  Independent Watchdog reset
  *            @arg @ref RCC_FLAG_WWDGRST  Window Watchdog reset
  *            @arg @ref RCC_FLAG_LPWRRST  Low Power reset
  * @retval The new state of __FLAG__ (TRUE or FALSE).
  */
#if defined(RCC_HSI48_SUPPORT)
#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U) == 1U) ? RCC->CR :                    \
                                        ((((__FLAG__) >> 5U) == 4U) ? RCC->CRRCR :                 \
                                        ((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :                  \
                                        ((((__FLAG__) >> 5U) == 3U) ? RCC->CSR : RCC->CIFR)))) &   \
                                          (1U << ((__FLAG__) & RCC_FLAG_MASK))) != 0U) ? 1U : 0U)
#else
#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U) == 1U) ? RCC->CR :                    \
                                        ((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :                  \
                                        ((((__FLAG__) >> 5U) == 3U) ? RCC->CSR : RCC->CIFR))) &    \
                                          (1U << ((__FLAG__) & RCC_FLAG_MASK))) != 0U) ? 1U : 0U)
#endif /* RCC_HSI48_SUPPORT */

清除中断标志位

/** @brief 将RMVF位置1可清除复位标志。
  *        The reset flags are: RCC_FLAG_FWRRST, RCC_FLAG_OBLRST, RCC_FLAG_PINRST, RCC_FLAG_BORRST,
  *        RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST and RCC_FLAG_LPWRRST.
  * @retval None
 */
#define __HAL_RCC_CLEAR_RESET_FLAGS() SET_BIT(RCC->CSR, RCC_CSR_RMVF)

你可能感兴趣的:(工作)