STM32判断软件、硬件启动(看门狗复位启动与上电启动)
转自:https://www.bilibili.com/read/cv14720843
一、STM32寄存器查询方式

寄存器介绍如下:
RCC 时钟控制和状态寄存器 (RCC_CSR)
偏移地址:0x74
复位值:0x0E00 0000
找到RCC基地址:0x40023800

那么 RCC 时钟控制和状态寄存器(RCC_CSR)的地址就是0x40023800+0x74


看寄存器实际用到的就只有24bit到31bit这里声明变量直接指向这几个bit,用来使用。因为是0-31bit是小端存储就是地位在前,所以访问高位8bit地址要加3。
uint8_t* RCC_CSR=(uint8_t*)(0x40023800+0x74+3); //RCC 时钟控制和状态寄存器 +3读取最后8bit
寄存器位功能:
//bit0: RMVF:清除复位标志 1:清零复位标志
//bit1: BOR 复位标志
//bit2: 来自 NRST 引脚的复位时,由硬件置 1
//bit3: POR/PDR 复位时,由硬件置 1
//bit4: 软件复位时,由硬件置 1
//bit5: 发生来自 VDD 域的独立看门狗复位时,由硬件置 1
//bit6: 发生窗口看门狗复位时,由硬件置 1
//bit7: 发生低功耗管理复位时,由硬件置 1
判断代码:
if(*RCC_CSR&0X10){ //bit4
//软件复位
}else if(*RCC_CSR&0X20){ //bit5
//独立看门狗复位
}else{
//上电启动
}
*RCC_CSR=0x01; //写0bit清除复位标志
以上代码即可判断,这里只用到了软件复位、独立看门狗复位要使用其他同理增加if。最后写入RMVF(bit0)用于清除复位标志,不然影响非上电启动的下一次判断。
三、STM32HAl库方式
__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST); //软件启动标志
__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST); //软降复位标志
其他标志宏定义:
#define RCC_FLAG_LSIRDY
#define RCC_FLAG_BORRST
#define RCC_FLAG_PINRST
#define RCC_FLAG_PORRST
#define RCC_FLAG_SFTRST
#define RCC_FLAG_IWDGRST
#define RCC_FLAG_WWDGRST
#define RCC_FLAG_LPWRRST
修改为使用HAL库的方式:
if(__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST)){
//软件复位
}else if(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST)){
//独立看门狗复位
}else{
//上电启动
}
__HAL_RCC_CLEAR_RESET_FLAGS(); //写0bit清除复位标志 作者:几个叶子 https://www.bilibili.com/read/cv14720843 出处:bilibili

浙公网安备 33010602011771号