zoukankan      html  css  js  c++  java
  • STM32F407 独立看门狗 个人笔记

    什么是看门狗

    如果程序跑飞了怎么办?
    可以用看门狗来监控。
    看门狗是:
    一个递减的计数器,如果不按时给计数器赋值,计数器的值减到一定程度,就会使系统复位。
    也就是说如果程序运行异常,无法正常给计数器赋值(喂狗),系统会自动复位。
    STM32F407有两种看门狗:

    1. 独立看门狗
    2. 窗口看门狗

    独立看门狗

    • 在键值寄存器(IWDG_KR)中写入0xCCCC:开始启用独立看门狗。
    • 此时计数器开始递减
    • 当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。
    • 无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗),
    • 自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。
    • 如果程序异常,就无法正常喂狗,从而系统复位。

    独立看门狗时钟接线图

    • 时钟源是频率为32K的LSI(low speed internal 时钟),经过预分频寄存器的值分频后,即为独立看门狗的计数器的频率。
    • 预分频寄存器IWDG_PR和键值寄存器IWDG_KR都有写保护功能,要操作他们需要先取消写保护。

    独立看门狗时间计算

    如何计算超时时间,即独立看门狗多久不喂会复位?
    下图适用与M4:


    由图可知
    分频系数 = (2^PR寄存器的值)×4

    ∴超时时间= 周期×初值
    =(分频系数/32K)× rlr
    =(2^PR寄存器的值)×4 ×rlr

    独立看门狗适用场合

    • 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效。
    • 独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。

    独立看门狗代码写法

    #include "iwdg.h"
    	  
    ////////////////////////////////////////////////////////////////////////////////// 
    
    //初始化独立看门狗
    //prer:分频数:0~7(只有低3位有效!)
    //rlr:自动重装载值,0~0XFFF.
    //分频因子=4*2^prer.但最大值只能是256!
    //rlr:重装载寄存器值:低11位有效.
    //时间计算(大概):Tout=((4*2^prer)*rlr)/32 (ms).
    void IWDG_Init(u8 prer,u16 rlr)
    {
    	//1.取消寄存器写保护:0x5555使能
    	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对IWDG->PR IWDG->RLR的写
    	
    	//2. 设置IWDG分频系数:写PR
    	IWDG_SetPrescaler(prer); 
    	
    	//3. 设置IWDG装载值
    	IWDG_SetReload(rlr);   
    
    	//4. 喂狗:写0xAAAA到KR,赋初值
    	IWDG_ReloadCounter(); //reload
    	
    	//5. 使能看门狗:写0xCCCC到KR
    	IWDG_Enable();       
    }
    
    //喂独立看门狗
    void IWDG_Feed(void)
    {
    	IWDG_ReloadCounter();//喂狗:写0xAAAA到KR
    }
    
  • 相关阅读:
    WSP_mainActivity
    使用Xutils(HttpUtils)请求网络数据
    ScrollView横向滑动与fragment的联动
    侧滑菜单
    Pull解析xml文件
    Xlistview的应用1(上拉刷新,下拉加载)fragment
    XlistView4(脚部刷新)
    XlistView3(头部的代码)
    GCD队列组的使用
    GCD栅栏函数dispatch_barrier
  • 原文地址:https://www.cnblogs.com/YuQiao0303/p/10064757.html
Copyright © 2011-2022 走看看