复位
共有三种类型的复位,分别为系统复位、电源复位和备份域复位
电源复位
只要发生以下事件之一,就会产生电源复位:
- 欠压复位 (BOR)。
- 退出待机模式时。
- 退出关断模式时。
欠压复位,包括上电或掉电复位 (POR/PDR),将所有寄存器设置为其复位值,备份域除外。
退出待机模式时,VCORE 域的所有寄存器都设置为其复位值。VCORE 域外的寄存器(RTC,
WKUP,IWDG,以及待机/关断模式控制)不受影响。
退出关断模式时,会产生欠压复位,将除备份域中的寄存器以外的所有寄存器全部复位。
系统复位
除了时钟控制/状态寄存器 (RCC_CSR) 中的复位标志和备份域中的寄存器外,系统复位会将
其他全部寄存器都复位为复位值。
只要发生以下事件之一,就会产生系统复位:
- NRST 引脚低电平(外部复位)
- 窗口看门狗事件(WWDG 复位)
- 独立看门狗事件(IWDG 复位)
- 防火墙事件(FIREWALL 复位)
- 软件复位(SW 复位)
- 低功耗模式安全复位
- 选项字节加载器复位
- 欠压复位
可通过查看控制/状态寄存器 (RCC_CSR) 中的复位标志确定复位源

备份域复位
备份域具有两个特殊复位。
只要发生以下事件之一,就会产生备份域复位:
- 软件复位,通过将备份域控制寄存器 (RCC_BDCR) 中的 BDRST 位置 1 触发。
- 在电源 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)
本文深入探讨了嵌入式系统中的复位机制,包括系统复位、电源复位和备份域复位三种类型,详细解释了每种复位的触发条件及其对系统的影响。同时,文章还介绍了如何通过API函数接口来使用这些复位功能,以及如何获取和清除复位标志。
3391

被折叠的 条评论
为什么被折叠?



