Fork me on GitHub

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

posted @ 2022-09-06 13:14  _浮尘  阅读(1552)  评论(0)    收藏  举报