STM32 HAL 复位源识别
STM32启动后可以识别本次启动是对应哪一种复位源,从而可以根据复位源的状态,做一些特殊处理。
HAL库的复位源识别
以下代码,识别是否是硬件上电的复位源,如果是,则清除本次启动的复位源标识,并触发软件复位,而重新启动后,识别到不是硬件上电复位,本次启动实际上是软件复位引起,则程序继续向下运行。
int main(void)
{
if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST)!= RESET)
{
__disable_irq() ;
__HAL_RCC_CLEAR_RESET_FLAGS();
for(uint32_t t=0;t<1000000;t++);
HAL_NVIC_SystemReset();
}
__enable_irq() ;
其中,RESET是枚举值0, RCC_FLAG_PORRST对应上电复位,__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST)读取上电复位标识,如果是1(非0),则判断本次启动是上电复位引起。__HAL_RCC_CLEAR_RESET_FLAGS()清除当前的复位标识。__disable_irq() 关闭全局中断,__enable_irq() ;打开全局中断,以便于软件HAL_NVIC_SystemReset()不被异常中断打断。for(uint32_t t=0;t<1000000;t++)用于增加特定的延时,可以对1000000的空指令延时时间进行调整。 以上代码实现了上电复位后的一种延时软件重启。
HAL库的复位源类型
HAL库的复位源类型主要有如下几种:
#define RCC_FLAG_BORRST ((uint8_t)0x95)
#define RCC_FLAG_PINRST ((uint8_t)0x96)
#define RCC_FLAG_PORRST ((uint8_t)0x97)
#define RCC_FLAG_SFTRST ((uint8_t)0x98)
#define RCC_FLAG_IWDG1RST ((uint8_t)0x9A)
#define RCC_FLAG_WWDG1RST ((uint8_t)0x9C)
其中: RCC_FLAG_BORRST是供电电压低于阀值产生的复位 RCC_FLAG_PINRST是RESET管脚产生的复位 RCC_FLAG_PORRST是上电复位(冷启动) RCC_FLAG_SFTRST是软件重启产生的复位 RCC_FLAG_IWDG1RST是内置看门狗产生的复位 RCC_FLAG_WWDG1RST是外置看门狗产生的复位
另外,基于芯片的功能,还有其它的一些复位源,如: RCC_FLAG_CPURST RCC_FLAG_D1RST RCC_FLAG_D2RST RCC_FLAG_OBLRST RCC_FLAG_FWRST RCC_FLAG_LPWRRST RCC_FLAG_LPWR1RST RCC_FLAG_LPWR2RST 可以从官方PDF文档《Description of STM32*** HAL and low-layer drivers》了解其含义。
–End–
|