打印
[STM32F1]

STM32基础篇————独立看门狗 实验

[复制链接]
989|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 aizaixiyuanqian 于 2017-12-30 21:23 编辑

这次实验,我们将使用 STM32 的独立看门狗(以下简称IWDG)。 STM32 内部自带了 2 个看门狗:独立看门狗( IWDG)和窗口看门狗( WWDG)。这一章我们只介绍独立看门狗,窗口看门狗将在下个试验学习,试验目标:
1、了解 STM32 的内部看门狗。
2、学会配置看门狗。
沙发
aizaixiyuanqian|  楼主 | 2017-12-30 21:24 | 只看该作者
STM32  独立看门狗简介
STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 40Khz,
而是在 30~60Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 40Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。
首先我们得讲解一下看门狗的原理。 这个百度百科里面有很详细的解释。 我们总结一下:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环, 看门狗电路就是为了避免这种情况的发生。 看门狗的作用就是在一定时间内(通过定时计数器实现) 没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。

使用特权

评论回复
板凳
aizaixiyuanqian|  楼主 | 2017-12-30 21:26 | 只看该作者
下面我们在了解几个与独立看门狗相关联的寄存器之后讲解怎么通过库函数来实现配置。首先是键值寄存器 IWDG_KR,该寄存器的各位描述如图所示:


使用特权

评论回复
地板
aizaixiyuanqian|  楼主 | 2017-12-30 21:27 | 只看该作者
在键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。无论何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR 中的值就会被重新加载到计数器中从而避免产生看门狗复位。IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向 IWDG_KR 寄存器中写入 0x5555。 将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。还有两个寄存器,一个预分频寄存器( IWDG_PR),该寄存器用来设置看门狗时钟的分频系数。 另一个重装载寄存器。该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32 位寄存器,但是只有低 12 位是有效的。只要对以上三个寄存器进行相应的设置,我们就可以启动 STM32 的独立看门狗,启动过程可以按如下步骤实现。

使用特权

评论回复
5
aizaixiyuanqian|  楼主 | 2017-12-30 21:27 | 只看该作者
1 )  取消寄存器写保护(  向 IWDG_KR  写入 0X5555 )
通过这步,我们取消 IWDG_PR 和 IWDG_RLR 的写保护,使后面可以操作这两个寄存器,设置 IWDG_PR 和 IWDG_RLR 的值。 这在库函数中的实现函数是:
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
这个函数非常简单, 顾名思义就是开启/取消写保护,也就是使能/失能写权限。

使用特权

评论回复
6
aizaixiyuanqian|  楼主 | 2017-12-30 21:28 | 只看该作者
2 )  设置独立看门狗的预分频系数和重装载值
设置看门狗的分频系数的函数是:
IWDG_SetPrescaler(IWDG_Prescaler_64);//设置 IWDG 预分频值//40K/64=1.6ms
设置看门狗的重装载值的函数是:
IWDG_SetReload(800);//设置 IWDG 重装载值 12 位的(0~4095)//800*1.6ms=1.28s
设置好看门狗的分频系数和重装载值就可以知道看门狗的喂狗时间(也就是看门狗溢出时间),该时间的计算方式为:Tout=((4×2^prer) ×rlr) /40其中 Tout 为看门狗溢出时间(单位为 ms); prer 为看门狗时钟预分频值( IWDG_PR 值),范围为 0~7; rlr 为看门狗的重装载值( IWDG_RLR 的值);
比如我们设定 prer 值为 4, rlr 值为 625,那么就可以得到 Tout=64×625/40=1000ms,这样,看门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA到 IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确的 40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。

使用特权

评论回复
7
aizaixiyuanqian|  楼主 | 2017-12-30 21:28 | 只看该作者
本帖最后由 aizaixiyuanqian 于 2017-12-30 21:30 编辑

3)  重载计数值喂狗
库函数里面重载计数值的函数是:
IWDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器通过这句,将使 STM32 重新加载 IWDG_RLR 的值到看门狗计数器里面。 即实现独立看门狗的喂狗操作。

使用特权

评论回复
8
aizaixiyuanqian|  楼主 | 2017-12-30 21:30 | 只看该作者
4)  启动看门狗
库函数里面启动独立看门狗的函数是:
IWDG_Enable(); //使能 IWDG通过这句,来启动 STM32 的看门狗。 注意 IWDG 在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开 IWDG,否则问题依旧,所以在这里提醒大家,如果不用 IWDG 的话,就不要去打开它,免得麻烦。通过上面 4 个步骤,我们就可以启动 STM32 的看门狗了,使能了看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。在配置看门狗后, printf 不断打印输出喂狗。如果喂狗时间超过设定时间系统将不断复位重启。

使用特权

评论回复
9
aizaixiyuanqian|  楼主 | 2017-12-30 21:30 | 只看该作者
独立看门狗配置程序
void iwdg_init()  //独立看门狗初始化配置
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//使能寄存器,写功能
IWDG_SetPrescaler(IWDG_Prescaler_64);//设置 IWDG 预分频值//40K/64=1.6ms
IWDG_SetReload(800);//设置 IWDG 重装载值 12 位的(0~4095)//800*1.6ms=1.28s
IWDG_ReloadCounter();//按照 IWDG 重装载寄存器的值重装载 IWDG 计数器
IWDG_Enable();//使能 IWDG
}

使用特权

评论回复
10
aizaixiyuanqian|  楼主 | 2017-12-30 21:31 | 只看该作者
主函数
int main()
{
printf_init(); //printf 初始化
iwdg_init(); //独立看门狗初始化配置
while(1)
{
IWDG_ReloadCounter(); //喂狗的时间是 1.28s
printf("进入喂狗模式\r\n");
delay_ms(1000);  //只要在喂狗时间内喂狗就不会让系统以为死机进入复位状态
}
}

使用特权

评论回复
11
aizaixiyuanqian|  楼主 | 2017-12-30 21:32 | 只看该作者
主函数的程序效果是:串口输出 while 循环,一直喂狗,喂狗时间是 1 秒,由于独立看门狗配置的喂狗时间是 1.28 秒,因此系统会一直喂狗。

使用特权

评论回复
12
aizaixiyuanqian|  楼主 | 2017-12-30 21:33 | 只看该作者
当程序下载进去后,打开串口,对 DTR 前进行勾选,然后在取消。再通过发送字符即可以显示。如图


使用特权

评论回复
13
aizaixiyuanqian|  楼主 | 2017-12-30 21:35 | 只看该作者
独立看门狗比较简单只需调用库函数完成初始化即可。这次就到这里了,感谢大家

使用特权

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

本版积分规则

62

主题

1353

帖子

6

粉丝