您的位置 首页 嵌入式

stm32 独立看门狗[操作寄存器+库函数]

以单片机为核心的微型计算机系统中,单片机经常会受到来自外界电磁场的干扰。造成程序跑飞,只是程序的正常运行状态被打断而进入死循环,从

以单片机为中心的微型核算机体系中,单片机常常会受到来自外界电磁场的搅扰。

形成程序跑飞,仅仅程序的正常运转状况被打断而进入死循环,从而使单片机操控的体系无法正常作业。看门狗便是一种专门用于检测单片机程序运转状况的硬件结构。

stm32也是如此。

stm32的独立看门狗由内部专门的40Khz低速时钟驱动,即便主时钟发生毛病时,它也依然有用。这儿需求留意的是独立看门狗的时钟是一个内部时钟,所以不是准确的40Khz,而是在30~60Khz之间的一个可改动的时钟,看门狗的时钟对时刻的要求不是很准确,所以时钟有误差能够承受。

本例直接操作寄存器完成验证独立看门狗的复位功用,设定一个800ms的喂狗时刻,在主函数中完成LED闪耀,假如设定一个1s的延时,则触发独立看门狗复位,LED常亮。
库函数完成当外部中止发生(按下PA0按键),长时刻不喂狗,引发独立看门狗复位时,向外用串口输出复位提示。

直接操作寄存器

运用独立看门狗,需求了解一下寄存器:

键值寄存器:(IWDG_KR)
低16位有用的寄存器,只写寄存器,读出值恒为0x0000.
软件有必要以必定的距离写入0xAAAA,不然,当计数器为0时,看门狗会发生复位。
写入0x5555表明答应拜访IWDG_PR和IWDG_RLR寄存器。
写入0xCCCC,发动看门狗作业。

预分频寄存器:(IWDG_PR)
第三位有用寄存器,用于设置看门狗的分频系数,最低为4,最高位256.
经过设置PR[2:0]:位来挑选计数器时钟的预分频因子。要改动预分频因子,IWDG_SR寄存器的PVU位有必要为0。

000: 预分频因子=4 100: 预分频因子=64
001: 预分频因子=8 101: 预分频因子=128
010: 预分频因子=16 110: 预分频因子=256
011: 预分频因子=32 111: 预分频因子=256

重装载寄存器:(IWDG_RLR)
低12位有用,RL[11:0]。用于界说看门狗计数器的重装载值。
每逢向IWDG_KR寄存器写入0xAAAA时,重装载值会被传送到计数器中。随后计数器从这个值开端递减计数。看门狗超时周期可经过此重装载值和时钟预分频值来核算。 只要当IWDG_SR寄存器中的RVU位为0时,才干对此寄存器进行修正。

状况寄存器:(IWDG_SR)
只要低两位有用。都由硬件置’1’和 清’0’。
RVU[1]: 看门狗计数器重装载值更新
PVU[0]:看门狗预分频值更新

代码如下: (system.h 和 stm32f10x_it.h 等相关代码参照 stm32 直接操作寄存器开发环境装备)
User/main.c
01 #include
02 #include “system.h”
03 #include “wdg.h”
04
05 #define LED1 PAout(4)
06 #define LED2 PAout(5)
07
08 void Gpio_Init(void);
09
10 int main(void)
11 {
12
13 Rcc_Init(9); //体系时钟设置
14
15 Gpio_Init();
16
17 Iwdg_Init(3,1000); //设定为800ms内喂狗
18
19 while(1){
20
21 LED1 = !LED1;
22
23 delay(100000); //延时100ms后喂狗,LED闪耀
24
25 //delay(1000000); //延时1000ms,引发独立看门狗复位,LED不闪耀
26
27 Iwdg_Feed(); //喂狗
28
29 }
30
31 }
32
33
34 void Gpio_Init(void)
35 {
36 RCC->APB2ENR|=1<<2; //使能PORTA时钟
37
38 GPIOA->CRL&=0x0000FFFF; // PA0~3设置为浮空输入,PA4~7设置为推挽输出
39 GPIOA->CRL|=0x33334444;
40
41 }
Library/wdg.c (此文件包括了独立看门狗和窗口看门狗的驱动函数)
01 #include
02 #include “wdg.h”
03
04 /********************************************
05 *
06 *本文件包括窗口看门狗和独立看门口的相关函数
07 *
08 *********************************************/
09
10 u8 Wwdg_Cnt = 0x7F; //计数器值,默以为最大值127
11
12 //独立看门狗初始化
13 //参数阐明:
14 // pre:分频数(0~7),相应分频因子为4*(2^pre)
15 // rlr:低12位有[11:0]
16 // 喂狗时刻核算: T = (4*(2^pre)*rlr)/40;(ms)
17 void Iwdg_Init(u8 pre,u16 rlr)
18 {
19 IWDG ->KR = 0x5555; //使能对PR RLR寄存器的写操作
20 IWDG ->PR =pre; //设置分频数
21 IWDG ->RLR = rlr; //设定重装值
22 IWDG ->KR = 0xAAAA; //装载RLR值到看门狗计数器,即喂狗
23 IWDG ->KR = 0xCCCC; //发动看门狗
24 }
25
26 //独立看门狗喂狗
27 void Iwdg_Feed()
28 {
29 IWDG -> KR = 0xAAAA; //喂狗
30 }
31
32 //窗口看门狗初始化
33 //参数阐明:
34 // cnt计数器的值,最大 127,0x7F
35 // w_cnt 窗口值,最大 127,0x7F
36 //pre 预分频器的时基值,低两位有用;实践时钟为: PLCK1/4096/2^pre
37 //需求再主函数中敞开中止 WWDG_IRQChannel
38 //设定喂狗时刻规模有必要在:(WWDG时钟为PCLK1,36Mhz)
39 // Tmax =(4096*2^pre*(cnt-63)/36) (us)
40 // Tmin =(4096*2^pre*(cnt-w_cnt)/36) (us)
41 //超出次时刻喂狗复位
42
43 void Wwdg_Init(u8 cnt,u8 w_cnt,u8 pre)
44 {
45 u8 Cnt_Max = 0x7f; //计数器最大值
46
47 Wwdg_Cnt = Cnt_Max&cnt; //设定计数器的值,避免溢出
48
49 RCC->APB1ENR |= 1<<11;
50
51 WWDG -> CFR |=pre<<7; //设定预分频器的时基,实践分频值我
52 WWDG -> CFR |= 1<<9; //使能中止
53
54 WWDG -> CFR &= 0xFF80; //初始化低七位,即窗口值清0
55 WWDG -> CFR |= w_cnt; // 设定窗口值
56
57 WWDG -> CR |= Wwdg_Cnt|(1<<7); //设定计数器值,并激活开门狗
58
59 }
60
61 //窗口看门狗喂狗
62
63 void Wwdg_Feed()
64 {
65 WWDG->CR |= (Wwdg_Cnt&0x7F);
66
67 }
Library/wdg.h
1 #include
2
3 void Iwdg_Init(u8pre,u16 rlr);
4 void Iwdg_Feed(void);
5
6 void Wwdg_Init(u8 cnt,u8 w_cnt,u8);
7 void Wwdg_Feed(void);

需求留意的是 独立看门狗没有响应的中止。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/318101.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部