通过 __HAL_RCC_GET_FLAG 函数,读取看门狗溢出标志检测程序是否发生复位,
目录
- 一、__HAL_RCC_GET_FLAG 函数
- 二、Stm32CubeMx配置
- 三、代码编写
- 四、运行效果
一、__HAL_RCC_GET_FLAG 函数
HAL库的 __HAL_RCC_GET_FLAG 函数可以获取到程序是否发生过看门狗复位,通常我们可以用该标志位监测我们的程序是否正常运行,需要的是调用该库函数后会清除复位标志,用法如下:
if(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST)!=RESET)
{
printf("Prograss Error,Please Check!\r\n");
__HAL_RCC_CLEAR_RESET_FLAGS();
}
#define RCC_FLAG_PORRST //供电电压低于阀值产生的复位
#define RCC_FLAG_SFTRST //软件复位
#define RCC_FLAG_IWDGRST //独立看门狗复位
#define RCC_FLAG_WWDGRST //窗口看门狗复位
#define RCC_FLAG_LPWRRST //低功耗复位
同样,我们可以将函数的参数替换成下面几个宏,就可以获取对应的复位标志。
二、Stm32CubeMx配置
1、RCC开启外部高速时钟(略)
2、配置STLink调试口(略)
3、配置串口方便调试输出(略)
4、配置工程名、生成路径,之后生成工程(略)
(1-4步的基础配置可以参考前面的文章《STM32基础工程模板创建》)
5、配置看门狗
三、代码编写
#include <stdio.h>
#include <string.h>
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_IWDG_Init();
uint32_t count = 0;
uint8_t u8TempBuf[16];
//读看门狗溢出标志,检测程序是否发生过看门狗复位
if(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST)!=RESET)
{
printf("Prograss Error,Please Check!\r\n");
__HAL_RCC_CLEAR_RESET_FLAGS();
}
while (1)
{
if(count%100 == 0)
{
printf("----------alive \r\n");
}
//串口阻塞接收“WatchDogTest”指令,通过指令触发看门狗溢出
HAL_UART_Receive(&huart1, u8TempBuf, 12, 10);
if(0 == strncmp((char*)&u8TempBuf, "WatchDogTest", 12))
{
//阻塞5秒,触发看门狗
printf("Prograss Stop \r\n");
HAL_Delay(5000);
}
HAL_IWDG_Refresh(&hiwdg);
count++;
}
}
四、运行效果
设备上电;打开串口助手并发送“WatchDogTest”,程序阻塞后会触发看门狗复位;复位后会走进看门狗溢出标志并打印。