独立看门狗---STM32----HAL

基本概念
看门狗解决的问题是什么?

在系统跑飞(程序异常执行)的情况,是系统复位,程序重新执行。

独立看门狗适应用于需要看门狗作为一个在主程序之外能够完全独立工作,并且对时间精度要求低的场合。

工作原理

在键值寄存器中写入0xCCCC,开始启用独立看门狗,此时计数器开始从其复位值递减,当计数器值计数到0时会产生一个复位信号。
无论何时,只要在键值寄存器中写入0xAAAA,重装载寄存器的值就会重新加载到计数器,从而避免计数器到0,产生复位信号。如果程序异常,就无法往键值寄存器中写入0xAAAA,重装载寄存器的值无法加载到计数器中,计数器会减到0,从而产生一个系统复位信号。

独立看门狗寄存器
  • IWDG_KR:键值寄存器,0~15位有效
  • IWDG_PR:预分频寄存器,0-2位有效
    在这里插入图片描述
  • IWDG_RLR:重装载寄存器,0~11位有效
  • IWDG_SR:状态寄存器,0~1位有效
独立看门狗超时时间

Tout = ((4*2prer)rlr)/32

Tout:看门狗溢出时间,单位为ms
prer:预分频值IWDG_PR
rlr:重装载值(IWDG_RLR)

独立看门狗操作步骤
  1. 初始化看门狗:预分频系数,重装载值
HAL_IWDG_Init();
  1. 启用看门狗
HAL_IWDG_Start();
  1. 喂狗
HAL_IWDG_Refresh();
具体代码
  1. 初始化看门狗:预分频系数,重装载值
IWDG_HandleTypeDef iwdg_handler;
void iwdg_init(void)
{
	iwdg_handler.Instance = IWDG;
	iwdg_handler.Init.Prescaler = IWDG_PRESCALER_64; //设置预分频寄存器 IWDG_PR
	iwdg_handler.Init.Reload = 500;						//设置重装载寄存器IWDG_RLR
	HAL_IWDG_Init(&iwdg_handler);
		HAL_IWDG_Start(&iwdg_handler);						//启用看门狗
}

Prescaler = IWDG_PRESCALER_64;设置的是4*2^prer=64,Reload = 500设置的是rlr,注意IWDG_RLR重装载寄存器,只有0~11位有效,不能超过寄存器存储范围。

  1. 启用看门狗,在第一步实现了
  2. 喂狗,在main函数实现了
int main(void)
{
   // u8 key;
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED 
    KEY_Init();                     //初始化按键
	delay_ms(100);
	
	iwdg_init();
	//HAL_IWDG_Start(&iwdg_handler);						//启用看门狗

	LED0 = 0;
    while(1)
    {
        if(KEY_Scan(0)==KEY0_PRES)
		{
			HAL_IWDG_Refresh(&iwdg_handler);
			//LED1 = !LED1;
			delay_ms(10);
		}
		
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值