打印
[STM32F4]

stm32F4XX之独立看门狗 HAL库

[复制链接]
417|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1:简介
独立看门狗 (IWDG) 由其专用低速时钟 (LSI) 驱动,因此即便在主时钟发生故障时仍然保持 工作状态。窗口看门狗 (WWDG) 时钟由 APB1 时钟经预分频后提供,通过可配置的时间窗 口来检测应用程序非正常的过迟或过早的操作。

IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时 间精度要求较低的场合。WWDG 最适合那些要求看门狗在精确计时窗口起作用的应用程 序。

独立看门狗的时钟是一个内部 RC时钟,所以并不是准确的 32Khz,而是在 15~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的

2:特性
● 自由运行递减计数器
● 时钟由独立 RC 振荡器提供(可在待机和停止模式下运行)
● 当递减计数器值达到 0x000 时产生复位(如果看门狗已激活)


使用特权

评论回复
沙发
heimaojingzhang|  楼主 | 2021-8-4 11:44 | 只看该作者
3:功能说明
独立看门狗有几个寄存器与我们这节相关,我们分别介绍这几个寄存器。首先是关键字寄存器 IWDG_KR。当通过对关键字寄存器 (IWDG_KR) 写入值 0xCCCC 启动独立看门狗时,计数器开始从复位 值 0xFFF 递减计数。当计数器计数到终值 (0x000) 时会产生一个复位信号(IWDG 复位)。任何时候将关键字 0xAAAA 写到 IWWDG_KR 寄存器中,IWDG_RLR 的值就会被重载到计 数器,从而避免产生看门狗复位

IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR 寄存器中写入 0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能

接下来,我们介绍预分频寄存器(IWDG_PR),该寄存器用来设置看门狗时钟的分频系数,最低为 4,最高位 256,该寄存器是一个 32 位的寄存器,但是我们只用了最低 3 位,其他都是保留位。

在介绍完 IWDG_PR 之后,我们介绍一下重装载寄存器 IWDG_RLR。该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32 位寄存器,但是只有低 12 位是有效的


使用特权

评论回复
板凳
heimaojingzhang|  楼主 | 2021-8-4 11:44 | 只看该作者
4:配置步骤
1)取消寄存器写保护,设置看门狗预分频系数和重装载值首先我们必须取消 IWDG_PR 和 IWDG_RLR 寄存器的写保护,这样才可以设置寄存器IWDG_PR 和 IWDG_RLR 的值。取消写保护和设置预分频系数以及重装载值在 HAL 库中是通
过函数 HAL_IWDG_Init 实现的。该函数声明为:
HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);该函数只有一个入口参数 hiwdg,该参数是 IWDG_HandleTypeDef 结构体指针类型。接下来我们看看结构体 IWDG_HandleTypeDef 定义:
typedef struct
{
IWDG_TypeDef *Instance;
IWDG_InitTypeDef Init;
HAL_LockTypeDef Lock;
__IO HAL_IWDG_StateTypeDef State;
}IWDG_HandleTypeDef;

成员变量 Instance 用来设置看门狗寄存器基地址,实际上在 HAL 库中已经通过标识符定义了,这里对于独立看门狗直接设置为标识符 IWDG 即可。

成员变量 Init 是一个 IWDG_InitTypeDef 结构体类型,该结构体只有 2 个成员变量,分别用
来设置独立看门狗的预分频系数和重装载值,定义如下:
typedef struct
{
uint32_t Prescaler;
uint32_t Reload;
}IWDG_InitTypeDef;

成员变量 Lock 是一个锁存变量,该变量在 HAL 库中当操作配置 IWDG 之前设置为锁住LOCK,当配置操作完成之后设置为 UNLOCK,实际上是一个操作状态标识符。成员变量 State 也是 HAL 定义的一个过程标识符,用来记录 IWDG 处理状态

2)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)在 HAL 中重载计数值的函数是 HAL_IWDG_Refresh,该函数声明为:
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);该函数有一个入口参数为前面讲解的 IWDG_HandleTypeDef 结构体类型指针,它的作用是把值0xAAAA写入到IWDG_KR寄存器,从而触发计数器重载,即实现独立看门狗的喂狗操作。

3) 启动看门狗(向 IWDG_KR 写入 0XCCCC)
HAL 库函数里面启动独立看门狗的函数是 HAL_IWDG_Start:
HAL_StatusTypeDef HAL_IWDG_Start(IWDG_HandleTypeDef *hiwdg);

通过上面 3 个步骤,我们就可以启动 STM32F4 的独立看门狗了,使能了看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。


使用特权

评论回复
地板
heimaojingzhang|  楼主 | 2021-8-4 11:45 | 只看该作者
下面附相关代码

1:初始化部分

IWDG_HandleTypeDef IWDG_Handler; //独立看门狗句柄

//初始化独立看门狗
//prer:分频数:IWDG_PRESCALER_4~IWDG_PRESCALER_256
//rlr:自动重装载值,0~0XFFF.
//时间计算(大概):Tout=((4*2^prer)*rlr)/32 (ms).
void IWDG_Init(u8 prer,u16 rlr)
{
    IWDG_Handler.Instance=IWDG;
    IWDG_Handler.Init.Prescaler=prer;        //设置IWDG分频系数
    IWDG_Handler.Init.Reload=rlr;                //重装载值
    HAL_IWDG_Init(&IWDG_Handler);                //初始化IWDG  
       
    HAL_IWDG_Start(&IWDG_Handler);                //开启独立看门狗
}


2:喂狗

//喂独立看门狗
void IWDG_Feed(void)
{   
    HAL_IWDG_Refresh(&IWDG_Handler);         //喂狗
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

3942

帖子

4

粉丝