外包网站建设费用包括网站备份,百度网站打不开,企业所得税最新优惠政策,做空的网站有哪些STM32F1 的独立看门狗#xff08;以下简称 IWDG#xff09;。
STM32F1内部自带了两个看门狗#xff0c;一个是独立看门狗 IWDG#xff0c;另一个是窗口看门狗 WWDG#xff0c; 本章只介绍独立看门狗 IWDG#xff0c;窗口看门狗 WWDG 会在后面章节介绍。 本章要实现的功能…STM32F1 的独立看门狗以下简称 IWDG。
STM32F1内部自带了两个看门狗一个是独立看门狗 IWDG另一个是窗口看门狗 WWDG 本章只介绍独立看门狗 IWDG窗口看门狗 WWDG 会在后面章节介绍。 本章要实现的功能是
通过 K1 按键进行喂狗喂狗的时候 D1 指示灯点亮超过喂狗时间产生复位后 D1 指示灯熄灭
同时使用 D2 指示灯闪烁表示系统运行。 26.1 IWDG 介绍
IWDG 简介
STM32F1 芯片内部含有两个看门狗外设
一个是 独立看门狗 IWDG
另一个是 窗口看门狗 WWDG。 两个看门狗外设独立和窗口均可用于检测并解决由软件错误导致的故障。 独立看门狗简单理解其实就是一个 12 位递减计数器当计数器从某一个值递减到 0 时如果看门狗已激活系统就会产生一次复位。
如果在计数器递减到 0 之前刷新了计数器值那么系统就不会产生复位。 这个刷新计数器值过程我们称之为“喂狗”。
看门狗功能由 VDD 电压域供电在停止模式和待机模式下仍能工作。
IWDG 结构框图 1标号 1IWDG 时钟
独立看门狗(IWDG)由其专用低速时钟 (LSI) 驱动因此即便在主时钟发生故障时仍然保持工作状态。
在前面介绍时钟树时我们就讲解过 LSI其频率一般在 30-60KHz 之间通常选择 40KHz 作为 IWDG 时钟。
由于 LSI 的时钟频率并不非常精确所以独立看门狗只适用于对时间精度要求比较低的场合。 2标号 2预分频器寄存器
LSI 时钟并不是直接提供给计数器时钟而是通过一个 8 位预分频寄存器
IWDG_PR 分频后输入给计数器时钟。 我们可以操作 IWDG_PR 寄存器来设置分频因
子分频因子可以为 4、8、16、32、64、128、256。 分频后的计数器时钟为CK_CNT 40/ 42^PREPRE 为预分频系数0-6
*4*2^PRE 大小就是 4、8、16、32、64、128、256 值。每经过一个计数器时钟
计数器就减 1。
3标号 3计数器
独立看门狗的计数器是一个 12 位的递减计数器计数最大值为 0XFFF当
递减到 0 时会产生一个复位信号让系统重新启动运行如果在计数器减到 0
之前刷新了计数器值的话就不会产生复位信号这个刷新计数器值过程我们称
之为“喂狗”。 4标号 4重装载寄存器
重装载寄存器是一个 12 位的寄存器里面装着要刷新到计数器的值这个
值的大小决定着独立看门狗的溢出时间。溢出时间 Tout (4*2^pre) / 40 * rlr
(ms)pre 是预分频器系数0-6rlr 是重装载寄存器的值公式内的 40 是
独立看门狗的时钟。
比如设置 pre4rlr800那么独立看门狗溢出时间是 1280ms也就是说
如果在 1280ms 内没有进行喂狗那么系统将进行重启即程序重新开始运行 5标号 5密钥寄存器
密钥寄存器IWDG_KR也称为关键字寄存器或键寄存器。此寄存器可以说
是 IWDG 的一个控制寄存器。往该寄存器写入三种值会有三种控制效果
①写入 0X5555由于 IWDG_PR 和 IWDG_RLR 寄存器具有写访问保护。若要
修改寄存器必须首先对 IWDG_KR 寄存器写入代码 0x5555。若写入其他值将重
启写保护。
②写入 0XAAAA把 IWDG_RLR 寄存器内值重装载到计数器中。
③写入 0XCCCC启动 IWDG 功能。此方式属于软件启动一旦开启独立看门
狗它就关不掉只有复位才能关掉。 6标号 6状态寄存器
状态寄存器 IWDG_SR 只有位 0 PVU 和位 1 RVU 有效这两位只能由
硬件操作。RVU看门狗计数器重装载值更新硬件置 1 表示重装载值的更新正
在进行中更新完毕之后由硬件清 0。 PVU: 看门狗预分频值更新硬件置 1
表示预分频值的更新正在进行中当更新完成后由硬件清 0。 所以只有当RVU/PVU 等于 0 的时候才可以更新重装载寄存器/预分频寄存器。
由于篇幅限制本章并没有对相关寄存器进行介绍大家可以参考
《STM32F10x 中文参考手册》-17 独立看门狗IWDG章节里面有详细的讲解。
如果看不懂的可以暂时放下因为我们使用的是库函数开发。 26.2 IWDG 配置步骤
IWDG 相关库函数在 stm32f10x_iwdg.c 和 stm32f10x_iwdg.h 文件中 1开启寄存器访问给 IWDG_KR 寄存器写入 0X5555
通过前面内容的介绍我们知道 IWDG_PR 和 IWDG_RLR 寄存器具有写访问保
护。 若要修改寄存器必须首先对 IWDG_KR 寄存器写入代码 0x5555如果写入
其他的值将重新开启写保护。 在库函数中实现函数如下 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护
这个函数非常简单里面的参数就是用来使能或失能写访问即开启或关闭写访问。 2设置 IWDG 预分频系数和重装载值 设置 IWDG 预分频系数函数为 void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值 设置 IWDG 重装载值函数为 void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值
设置好 IWDG 的分频系数 pre 和重装载值就可以知道独立看门狗的喂狗时
间也就是看门狗溢出时间该时间的计算公式前面已经介绍
公式如下
Tout (4*2^pre) / 40 * rlr 3重载计数器值喂狗给 IWDG_KR 寄存器写入 0XAAAA 重载计数器值喂狗库函数是 IWDG_ReloadCounter(); //重装载初值 此函数功能是将 IWDG_RLR 寄存器内值重新加载到独立看门狗计数器内实现喂狗操作。 4开启 IWDG给 IWDG_KR 寄存器写入 0XCCCC
要使用独立看门狗我们还需要打开它开启 IWDG 的库函数是 IWDG_Enable(); //打开独立看门狗
这里提醒下大家IWDG 在一旦启用就不能再被关闭想要关闭只能重
启并且重启之后不能打开 IWDG否则问题依旧存在。所以如果不用 IWDG 的
话就不要去打开它免得麻烦。
通过以上几步配置好后我们就可以正常使用独立看门狗了我们需要在规
定的时间内喂狗否则系统即会重新启动。 26.3 硬件设计
由于 IWDG 是 STM32F1 内部资源因此本硬件电路非常简单只有 LED 指示
灯、KEY1 按键连接其对应的电路图在前面章节中都有介绍这里就不多说。
D2 用来提示系统运行D1 用来作为喂狗和系统重启时的提示KEY1 按键用来喂
狗操作喂狗时 D1 亮喂狗失败系统重启D1 灭。 26.4 软件设计
本章所要实现的功能是通过 KEY1 按键进行喂狗喂狗的时候 D1 点亮同
时串口输出“喂狗”提示信息超过喂狗时间系统重启 D1 熄灭同时串口输出
“复位系统”提示信息同时使用 D2 指示灯闪烁表示系统运行。 程序框架如下
1初始化 IWDG开启 IWDG设置溢出时间
#include iwdg.h/*
u8 Pre 预分频值
u16 rlr 重装载值
*/// IWDG 初始化
void IWDG_Init(u8 pre,u16 rlr)
{// 第一步IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护 // 第二步IWDG_SetPrescaler(pre); //设置 IWDG 预分频值IWDG_SetReload(rlr); //设置 IWDG 重装载值// 第三步IWDG_ReloadCounter(); //重装载初值// 第四步IWDG_Enable(); //打开独立看门狗}// 喂狗
void IWDG_FeedDog(void)
{IWDG_ReloadCounter();
}2编写主函数
#include system.h
#include SysTick.h
#include led.h
#include usart.h
#include key.h
#include iwdg.hint main()
{u8 i0;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组分2组LED_Init();USART1_Init(115200);KEY_Init();IWDG_Init(4,800); // 1280msLED11;printf(复位系统\r\n);while(1){ if(KEY_Scan(0)KEY1_PRESS){IWDG_FeedDog();LED1 0;printf(喂狗\r\n);}i;if(i%100)LED0!LED0;delay_ms(10);}
}