STM32G474独立看门狗

STM32G474独立看门狗,独立看门狗定时器一旦运行,则IWDG不能被停止。

1、IWDG.c

#include "IWDG.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()

//函数功能:设置看门狗复位周期为3.2秒
void IWDG_Config(void)
{
    IWDG_HandleTypeDef   IwdgHandle;

  __HAL_RCC_LSI_ENABLE();//使能LSI时钟,启动"内部RC 32KHz振荡器"
  while (READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) == 0U);//等待直到LSI READY置位

  IwdgHandle.Instance = IWDG;                     //选择IWDG
  IwdgHandle.Init.Prescaler = IWDG_PRESCALER_64;
    //设置IWDG预分频值为64
    //独立看门狗的分频器输出周期为:64/32KHz=2ms

    IwdgHandle.Init.Window=3200;
  IwdgHandle.Init.Reload = (3200);
  //设置IWDG重装载值为3200,重装载寄存器IWDG_RLR有12位值
    //独立看门狗的复位周期为:3200*64/32KHz=6.4s

    HAL_IWDG_Init(&IwdgHandle);//初始化IWDG
}

//函数功能:喂狗
void IWDG_Counter_Reload(void)
{
//    __HAL_IWDG_RELOAD_COUNTER(&IwdgHandle);
    _HAL_IWDG_RELOAD_COUNTER(IWDG);
//  IWDG_RELOAD_COUNTER();
}

//(__FLAG__)=RCC_FLAG_HSIRDY,若返回1,表示HSI振荡器已经准备好
//(__FLAG__)=RCC_FLAG_HSERDY,若返回1,表示HSE振荡器已经准备好
//(__FLAG__)=RCC_FLAG_PLLRDY,若返回1,表示Main PLL时钟已经准备好
//(__FLAG__)=RCC_FLAG_LSERDY,若返回1,表示LSE振荡器已经准备好
//(__FLAG__)=RCC_FLAG_HSI48RDY
//(__FLAG__)=RCC_FLAG_LSECSSD
//(__FLAG__)=RCC_FLAG_LSIRDY,若返回1,表示LSI振荡器已经准备好
//(__FLAG__)=RCC_FLAG_BORRST,若返回1,表示是由BOR or POR/PDR产生复位
//(__FLAG__)=RCC_FLAG_OBLRST,若返回1,表示是由Option byte loader产生复位
//(__FLAG__)=RCC_FLAG_PINRST,若返回1,表示是由复位引脚产生复位
//(__FLAG__)=RCC_FLAG_SFTRST,若返回1,表示是由软件产生复位
//(__FLAG__)=RCC_FLAG_IWDGRST,若返回1,表示是由独立看门狗产生复位
//(__FLAG__)=RCC_FLAG_WWDGRST,若返回1,表示是由窗口看门狗产生复位
//(__FLAG__)=RCC_FLAG_LPWRRST
//函数功能:打印CPU复位原因

void SysRstSrcRecord(void)
{
    uint8_t i;
    uint8_t Reset_Buffer[11];

    for(i=0;i<11;i++) Reset_Buffer[i]=0;//清除

    Reset_Buffer[0] = __HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY);//读取"内部部24MHz时钟源稳定标志"
  Reset_Buffer[1] = __HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY);//读取"外部4~32MHz时钟源稳定标志"
  Reset_Buffer[2] = __HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY);  //读取"PLL时钟稳定标志"
  Reset_Buffer[3] = __HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY);//读取"外部32.768KHz的时钟源稳定标志"
    Reset_Buffer[4] = __HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY);//读取"内部RC的32KHz时钟源稳定标志"

  Reset_Buffer[5] = __HAL_RCC_GET_FLAG(RCC_FLAG_PINRST);    //读取"外部引脚复位标志"
    Reset_Buffer[6] = __HAL_RCC_GET_FLAG(RCC_FLAG_BORRST);   //读取"BOR/POR/PDR复位标志"
  Reset_Buffer[7] = __HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST);    //读取"软件复位标志"
  Reset_Buffer[8] = __HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST); //读取"独立看门狗定时器复位标志"
    Reset_Buffer[9] = __HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST); //读取"窗口看门狗定时器复位标志"
    Reset_Buffer[10] = __HAL_RCC_GET_FLAG(RCC_FLAG_OBLRST);   //读取"Option byte loader复位标志"
    if( Reset_Buffer[0] ) printf("\r\nHSI OK!");
    if( Reset_Buffer[1] ) printf("\r\nHSE OK!");
    if( Reset_Buffer[2] ) printf("\r\nPLL OK!");
    if( Reset_Buffer[3] ) printf("\r\nLXTAL OK!");
    if( Reset_Buffer[4] ) printf("\r\nLSI OK!");

    if( Reset_Buffer[5] ) printf("\r\nPIN reset!");
    if( Reset_Buffer[6] ) printf("\r\nPOR reset!");
    if( Reset_Buffer[7] ) printf("\r\nSWR reset!");
    if( Reset_Buffer[8] ) printf("\r\nIWDG reset!");
    if( Reset_Buffer[9] ) printf("\r\nWWDG reset!");
    if( Reset_Buffer[10] ) printf("\r\nOption byte loader reset!");
}

//函数功能:使用软件复位CPU
void SoftReset(void)
{
    NVIC_SystemReset();//令CPU复位
}
 

2、IWDG.h

#ifndef __IWDG_H
#define	__IWDG_H

//#include "main.h"
#include "stm32g4xx_hal.h"

#define _HAL_IWDG_RELOAD_COUNTER(__INSTANCE__)       WRITE_REG((__INSTANCE__)->KR, IWDG_KEY_RELOAD)
//将0x0000AAAA写入"密钥寄存器IWDG_KR",表示喂狗,防止看门狗计数器计数到0

#define IWDG_RELOAD_COUNTER() IWDG->KR = IWDG_KEY_RELOAD
//将0x0000AAAA写入"密钥寄存器IWDG_KR",表示喂狗,防止看门狗计数器计数到0

extern void IWDG_Config(void);
extern void IWDG_Counter_Reload(void);
extern void SysRstSrcRecord(void);

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值