zoukankan      html  css  js  c++  java
  • (stm32f103学习总结)—独立看门狗(IWDG)

    一、IWDG介绍

    1.1 IWDG简介

       STM32F1芯片内部含有两个看门狗外设,一个是独立看门狗IWDG,另 一个是窗口看门狗WWDG。两个看门狗外设(独立和窗口)均可用于检测 并解决由软件错误导致的故障。独立看门狗简单理解其是就是一个12位 递减计数器,当计数器从某一个值递减到0时(如果看门狗已激活),系 统就会产生一次复位。如果在计数器递减到0之前刷新了计数器值,那么 系统就不会产生复位。这个刷新计数器值过程我们称之为“喂狗”。看 门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作

    1.2 IWDG结构框图

      要更好的理解独立看门狗,就需要了解它内部的结构

     

    二、IWDG配置步骤

    (1)开启寄存器访问(给IWDG_KR寄存器写入0X5555)

       IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

    2)设置IWDG预分频系数和重装载值

      void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);

      void IWDG_SetReload(uint16_t Reload);

    Tout = (4*2^pre) / 40 * rlr

    其中Tout为独立看门狗溢出时间,单位是ms。pre是预分频器系数(0-6),rlr 是重装载寄存器的值,公式内的40是独立看门狗的时钟。

    (3)重载计数器值(喂狗)(给IWDG_KR寄存器写入0XAAAA)

       IWDG_ReloadCounter();

    (4)开启IWDG(给IWDG_KR寄存器写入0XCCCC)(外设开启)

      IWDG_Enable();

    4.编写独立看门狗控制程序

      本章所要实现的功能是:通过K_UP按键进行喂狗,喂狗的时候D2指示 灯亮,同时串口输出“喂狗”提示信息,超过喂狗时间系统重启D2指示 灯灭,同时串口输出“复位系统”提示信息,同时使用D1指示灯闪烁表 示系统运行。程序框架如下:

    (1)初始化IWDG(开启IWDG,设置溢出时间)

    (2)编写主函数

    1 #ifndef _iwdg_H
    2 #define _iwdg_H
    3 
    4 #include "system.h"
    5 void IWDG_Init(u8 pre,u16 rlr);
    6 void IWDG_FeedDog(void);  //喂狗
    7 
    8 #endif
     1 #include "iwdg.h"
     2 
     3 /*******************************************************************************
     4 * 函 数 名         : IWDG_Init
     5 * 函数功能           : IWDG初始化
     6 * 输    入         : pre:预分频系数(0-6)
     7                      rlr:重装载值(12位范围0xfff)
     8                      独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40
     9 * 输    出         : 无
    10 *******************************************************************************/
    11 void IWDG_Init(u8 pre,u16 rlr)
    12 {
    13     IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护
    14     IWDG_SetPrescaler(pre);//设置预分频系数 0-6
    15     IWDG_SetReload(rlr);//设置重装载值
    16     IWDG_ReloadCounter();  //重装载初值
    17     IWDG_Enable(); //打开独立看门狗
    18     
    19 }
    20 
    21 /*******************************************************************************
    22 * 函 数 名         : IWDG_FeedDog
    23 * 函数功能           : 喂狗
    24 * 输    入         : 无
    25 * 输    出         : 无
    26 *******************************************************************************/
    27 void IWDG_FeedDog(void)  //喂狗
    28 {
    29     IWDG_ReloadCounter();  //重装载初值
    30 }
     1 #include "system.h"
     2 #include "SysTick.h"
     3 #include "led.h"
     4 #include "usart.h"
     5 #include "key.h"
     6 #include "iwdg.h"
     7 
     8 
     9 /*******************************************************************************
    10 * 函 数 名         : main
    11 * 函数功能           : 主函数
    12 * 输    入         : 无
    13 * 输    出         : 无
    14 *******************************************************************************/
    15 int main()
    16 {
    17     u8 i=0; 
    18         
    19     SysTick_Init(72);
    20     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
    21     LED_Init();
    22     USART1_Init(9600);
    23     
    24     KEY_Init();
    25     IWDG_Init(4,800); //只要在1280ms内进行喂狗就不会复位系统
    26     
    27     led2=1;
    28     printf("复位系统
    ");
    29     
    30     while(1)
    31     {
    32         if(KEY_Scan(0)==KEY_UP)
    33         {
    34             IWDG_FeedDog();//喂狗
    35             led2=0;
    36             printf("喂狗
    ");
    37         }
    38         
    39         i++;
    40         if(i%20==0)
    41         {
    42             led1=!led1;
    43             
    44         }
    45         delay_ms(10);
    46     }
    47 }
  • 相关阅读:
    async和await是如何实现异步编程?
    HD-ACM算法专攻系列(23)——Crixalis's Equipment
    HD-ACM算法专攻系列(22)——Max Sum
    HD-ACM算法专攻系列(21)——Wooden Sticks
    HD-ACM算法专攻系列(20)——七夕节
    HD-ACM算法专攻系列(19)——Leftmost Digit
    搭建Prometheus平台,你必须考虑的6个因素
    实用教程丨使用K3s和MySQL运行Rancher 2.4
    Kubernetes Ingress简单入门
    一文讲透Cluster API的前世、今生与未来
  • 原文地址:https://www.cnblogs.com/zhj868/p/12661236.html
Copyright © 2011-2022 走看看