以下内容全部来自正点原子,本人只是对主要知识点进行整理,方便以后查看。

一、独立看门狗

独立看门狗本质上是一个定时器,这个定时器有一个输出端,可以输出复位信号。该定时 器是一个 12 位的递减计数器,当计数器的值减到 0 的时候,就会产生一个复位信号。如果在计 数没减到 0 之前,重置计数器的值的话,那么就不会产生复位信号,这个动作我们称为喂狗。 看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍然可以工作。

STM32F407 的独立看门狗由内部专门的 32Khz 低速时钟(lsi_ck)驱动,即使主时钟发生故障,它也仍然有效。独立看门狗的时钟不是准确 的 32Khz,而是在 17~47Khz 之间的一个可变化的时钟,我们在估算的时候,以 32Khz 的 频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。

二、独立看门狗寄存器

IWDG 主要用到其中 3 个寄存器:关键字寄存器(IWDG_KR)、预分频寄存器(IWDG_PR)和重载寄存器(IWDG_ RLR)。

2.1、关键字寄存器(IWDG_KR)

关键字寄存器可以看作是独立看门狗的控制寄存器

在键寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。

无 论何时,只要关键字寄存器 IWDG_KR 中被写入 0xAAAA,IWDG_RLR 中的值就会被重新加 载到计数器中从而避免产生看门狗复位。

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

2.2、预分频寄存器(IWDG_PR)

2.3、重载寄存器(IWDG_ RLR)

该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32 位寄存器,只有低 12 位 是有效的。

三、相关函数

IWDG 的初始化函数,其声明如下:

HAL_StatusTypeDef   HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);

参数如下

typedef struct
{
IWDG_TypeDef *Instance; /* IWDG 寄存器基地址 */
IWDG_InitTypeDef Init; /* IWDG 初始化参数 */
}IWDG_HandleTypeDef;

1)Instance:指向 IWDG 寄存器基地址。

2)Init:IWDG 初始化结构体,用于配置计数器的相关参数。

IWDG_InitTypeDef 这个结构体类型定义如下:

typedef struct
{uint32_t Prescaler; /* 预分频系数 */uint32_t Reload; /* 重装载值 */
} IWDG_InitTypeDef;

1)Prescaler:预分频系数,IWDG_PRESCALER_4 到 IWDG_PRESCALER_256。

2)Reload:重装载值,范围:0 到 0x0FFF。

HAL_IWDG_Refresh 函数是独立看门狗的喂狗函数。

HAL_StatusTypeDef     HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);

函数返回值: HAL_StatusTypeDef 枚举类型的值。

独立看门狗配置步骤

1)取消寄存器写保护,通过函数 HAL_IWDG_Init 实现。

看门狗的喂狗时间(也就是看门狗溢 出时间)的计算方式为:

Tout=((4×2^prer) ×rlr) /32

其中 Tout 为看门狗溢出时间(单位为 ms)。

prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7。

rlr 为看门狗的重装载值(IWDG_RLR 的值)。

比如我们设定 prer 值为 4(因为4×2^4=64,所以 prer =4代表的是 64 分频,HAL 库中可以使用宏定义标识符 IWDG_PRESCALER_64),rlr 值为 500,那么就可以得到 Tout=64×500/32=1000ms,这样,看 门狗的溢出时间就是 1s,只要在一秒钟之内,有一次写入 0xAAAA 到 IWDG_KR,就不会导 致看门狗复位。

注:看门狗的时钟不是准确的 32Khz,最好不要太晚喂狗,否则,有可能发生看门狗复位。

2)重载计数值喂狗(向 IWDG_KR 写入 0xAAAA) 在 HAL 中重载计数值的函数是 HAL_IWDG_Refresh,把值 0xAAAA 写入 到 IWDG_KR 寄存器,从而触发计数器重载,即实现独立看门狗的喂狗操作。

3) 启动看门狗(向 IWDG_KR 写入 0xCCCC) HAL 库函数里面启动独立看门狗是通过宏定义标识符来实现的:

#define __HAL_IWDG_START(__HANDLE__)
WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_ENABLE);

我们只需要调用宏定义标识符__HAL_IWDG_START 即可实现看门狗使能。实际上,当我 们调用了看门狗初始化函数 HAL_IWDG_Init 之后,在内部已经调用了该宏启动看门狗。

注:调用了看门狗初始化函数 HAL_IWDG_Init 之后,在内部会自动启动看门狗。

四、实战


#include "stm32f4xx.h"
#include "core_cm4.h"
#include "stm32f4xx_hal.h"
#include "stdio.h"IWDG_HandleTypeDef g_iwdg_handle;
uint8_t keyval = 0;                         /* 保存按键状态 */ void KEY_int(void)
{GPIO_InitTypeDef gpio_init_struct;                      /* 定义结构体 */gpio_init_struct.Pin = GPIO_PIN_0;                     /* LED1引脚 */gpio_init_struct.Mode = GPIO_MODE_INPUT;                /* 输入 */gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */HAL_GPIO_Init(GPIOA, &gpio_init_struct);                /* 初始化KEY引脚 */
}/* ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓看门狗参数配置↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
void iwdg_init(uint8_t prer, uint16_t rlr)
{g_iwdg_handle.Instance = IWDG;g_iwdg_handle.Init.Prescaler = prer; /* 设置 IWDG 分频系数 */g_iwdg_handle.Init.Reload = rlr;     /* 重装载值 */HAL_IWDG_Init(&g_iwdg_handle);
}/* ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓喂狗↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
void iwdg_feed(void)
{ HAL_IWDG_Refresh(&g_iwdg_handle); /* 重装载计数器 */
}/* ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓检测按键↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
void key(void)
{ if(keyval=1) keyval=0;if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0){delay_ms(10);  /* 消抖 */if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0) keyval=1;}
}int main()
{HAL_Init();                             /* 初始化HAL库 */__HAL_RCC_GPIOA_CLK_ENABLE();           /* 端口A的时钟使能 */delay_init(168);                        /* 延时初始化 */KEY_init();                             /* 初始化LED */iwdg_init(IWDG_PRESCALER_64,500);keyval = 0;while(1){key();if(keyval==1){iwdg_feed(); }delay_ms(10);}
}

注:delay_ms(500);  在后面时钟才能学到,这里只是表示一下。

stm32f407关于独立看门狗各种函数(一)(HAL库)相关推荐

  1. 【stm32f407】独立看门狗 iwdog

    一.独立看门狗 STM32F4的独立看门狗由内部专门的32Khz低速时钟(LSI)驱动,即使主时钟发生故障,它也仍然有效.这里需要注意独立看门狗的时钟是一个内部RC时钟,所以并不是准确的32Khz,而 ...

  2. 【STM32】HAL库 STM32CubeMX教程五----看门狗(独立看门狗,窗口看门狗)

    前言:   今天我们来学习看门狗的配置与函数,看门狗可以有效解决程序的跑飞,在使用过程中比较常见,是防止芯片故障的有效外设,我们一起来学习下HAL库 STM32CubeMX的独立看门狗,窗口看门狗的使 ...

  3. STM32F4 HAL库开发 -- 独立看门狗(IWDG)

    之前讲过看门狗,参看:STM32开发 – 看门狗详解 一.HAL库配置独立看门狗步骤 1.取消寄存器写保护,设置看门狗预分频系数和重装载值. 首先我们必须取消 IWDG_PR和 IWDG_RLR寄存器 ...

  4. stm32看门狗_「正点原子NANO STM32开发板资料连载」第十一章 独立看门狗实验

    1)实验平台:ALIENTEK NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第十一章 独 ...

  5. STM32之独立看门狗与窗口看门狗总结

    一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...

  6. STM32F103_IWDG独立看门狗

    1.STM32 独立看门狗简介 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然 有效.这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 ...

  7. stm32f103 c 语言编程,stm32f103 独立看门狗 - 全文

    STM32的独立看门狗由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,它也仍然有效.这里需要注意独立看门狗的时钟是一个内部RC时钟,所以并不是准确的40Khz,而是在30~60Khz之间的一个 ...

  8. STM32F4 | 独立看门狗(IWDG)实验

    文章目录 一.STM32F4 独立看门狗简介 二.硬件设计 三.软件设计 四.实验现象 五.STM32CubeMX 配置 IWDG   这一章介绍如何使用 STM32F429 的独立看门狗(以下简称 ...

  9. stm32f103 独立看门狗

    STM32的独立看门狗由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,它也仍然有效.这里需要注意独立看门狗的时钟是一个内部RC时钟,所以并不是准确的40Khz,而是在30~60Khz之间的一个 ...

最新文章

  1. 阿里云网盘内测_阿里云网盘内测,下载10M/s;百度网盘...?
  2. 第39次《中国互联网络发展状况统计报告》发布
  3. 一文弄懂用户画像以及如何召回用户
  4. python把模块装到文件夹中_把模块有关联的放在一个文件夹中 在python2中调用文件夹名会直接失败 在python3中调用会成功,但是调用不能成功的解决方案...
  5. 各种触发器的特性方程_薛定谔方程,究竟神奇在哪里?
  6. python golang 小工具_使用Go语言简单模拟Python的生成器
  7. c语言制作图片软件,大佬们,小菜鸟想问一问用vc编译器做简易画图软件
  8. mysql的%rowtype_Oracle %TYPE 和 %ROWTYPE 使用
  9. oracle 开并行写入命令,Oracle等待事件“日志文件并行写入”更改
  10. CAD手机精准看图隐私政策
  11. 紫微斗数排盘JS算法 源码 和解析
  12. 网传宝塔“0day”挂马事件—附检测脚本
  13. Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1030E: The operator 'SUBTR
  14. 动物识别系统代码python_人工智能-动物识别专家系统算法Python + Pyqt 实现
  15. Java入门教程(视频)
  16. 登陆动网论坛时报“Microsoft JET Database Engine 错误 '80004005' ”
  17. 二叉树的遍历之先序遍历、中序遍历和后序遍历
  18. URLDecoder.decode
  19. Larave 利用smtp.office365.com发送邮件遇到问题
  20. ZL.HT老大的甲方乙方

热门文章

  1. Python数据基本类型3
  2. 如何使用CSDN中的Markdown写博客——纯小白篇
  3. ArrayAdapter使用示例
  4. 渔王争霸他是如何通过QQ群获得公司投资的?
  5. 执行mvn test命令后报:Cannot find class in classpath
  6. net use使用方法
  7. VC++ | DLL的创建和使用
  8. 监听浏览器窗口关闭事件onbeforeunload不起作用
  9. onclick 常用手册
  10. 高德地图API的应用