STM32固件库-看门狗入门

以下记录资料设计单片机均为STM32F103C8T6

    看门狗,这个名字非常形象,这是单片机的一个功能,主要用来监测单片机的程序运行是否正常,看门狗其实就是一个自减计数器。其整个运行过程为:先对看门狗进行初始化,这里需要给这个计数器定义一个初值,然后这个值会随着看门狗时钟慢慢减小,初始化后需要在程序的某一位置进行喂狗,喂狗就是将看门狗计数器的值恢复到初值,如果某一块程序出了问题,没有及时喂狗,那么单片机就会复位,这就是看门狗运行的简要流程。看门狗有两种,一种是独立看门狗,一种是窗口看门狗,这两种看门狗运行流程类似,但也有一些不同。

①独立看门狗

    独立看门狗的计数器是一个12位的计数器,即计数器的初值最大为0xFFF,其看门狗时钟是一个40KHz的RC振荡器提供的时钟,这个振荡器是独立看门狗特有的,独立于主频之外的,而且该时钟和计数器之间,还有一个8位的预分频器,用来将RC振荡器的时钟进行分频,通过调节计数器的初值和预分频器的分频系数,就可以计算独立看门狗从初值到0的总共时长,只要两次喂狗的时间差小于该时长,即可成功喂狗,单片机正常运行。

接下来看一下库函数:

    该功能的所以库函数位于stm32f10x_iwdg.h文件,点击进入此文件,拉到最下面,可以看到如下几个函数:

这就是独立看门狗的所有函数了。一个一个看一下。

void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);

这个函数就是使能独立看门狗寄存器写访问的函数,可以填入IWDG_WriteAccess_Enable和IWDG_WriteAccess_Disable 对寄存器进行使能或失能操作。

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);

这个函数就是用来设置独立看门狗特有的那个时钟的分频系数的,比方说设置一个40,那么那个40KHz的频率输入到计数器时就只有1KHz。

void IWDG_SetReload(uint16_t Reload);

这个函数就是用来设置计数器初值的,但要记得不要超出范围了。

void IWDG_ReloadCounter(void);

这个函数就是所说的喂狗,启动这个函数,就可以将上面函数设置的初值加载到计数器中。

void IWDG_Enable(void);

这个就是使能独立看门狗的。

    总结:所以独立看门狗的使用,就是在我们自己建立的IWDG.c文件中,依次调用上面几个函数,对独立看门狗进行初始化,然后我们再将IWDG_ReloadCounter函数封装起来,在IWDG.h文件中声明,再在主程序中合适的位置进行调用即可。

②窗口看门狗

    窗口看门狗与独立看门狗类似,但有几点不同。首先窗口看门狗的计数器只有7位,其次,窗口看门狗没用独立的时钟源,其使用的是主时钟驱动,而且窗口看门狗有一个窗口期,程序只能在窗口期进行喂狗,窗口期的最小值是固定的,最后在窗口期最小值的前一个值处,会触发一个中断。

我们通过库函数看一下这些都是什么意思:

    该功能的所以库函数位于stm32f10x_wwdg.h文件,点击进入此文件,拉到最下面,可以看到如下几个函数:

这就是窗口看门狗的所有函数了。一个一个看一下。

void WWDG_DeInit(void);

这个函数是用于将窗口看门狗恢复到初始状态的函数,在重新配置窗口看门狗之前一般会调用这个函数将之前可能存在的信息初始化。

void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);

这个是用来设置预分频器的预分频系数的。

void WWDG_SetWindowValue(uint8_t WindowValue);

这个函数就是用来设置窗口值的。前面说过窗口看门狗只能在窗口期喂狗。这个函数就是设置窗口期的上限的,因为前面也说了,窗口期的最小值是固定的(0x3f),所以只需要设置最大值即可。

void WWDG_EnableIT(void);

这个函数是用来使能窗口看门狗中断的,窗口看门狗在窗口期的最后一个值的前一个值处(0x40),会触发一个中断,这个中断一般会对一些数据进行记录处理,因为下一个数单片机就复位了。有人会在这个中断里面添加喂狗函数,其实没必要,这个中断就是在单片机出现问题后,保留有用信息的,在这时候喂狗,那不就不知道什么时候单片机出错了吗。

void WWDG_SetCounter(uint8_t Counter);

这个是给窗口看门狗计数器设置初值的。

void WWDG_Enable(uint8_t Counter);

这个是用来使能窗口看门狗的,但与独立看门狗不同,这个使能函数需要传入一个参数,这个参数即为计数器的初值,所以这个函数在使能窗口看门狗时,直接就给计数器赋初值了。可以看一下源码:可以看出来上述内容

void WWDG_ClearFlag(void);

这个是清除标志位的。

    总结:在初始化窗口看门狗时,有个问题需要注意,因为窗口看门狗用的是主时钟,所以需要使用时钟使能函数使能相关的时钟,之后调用的函数除了初始化时不需要调用喂狗函数外其他流程和独立看门狗调用函数流程一样,最后还有注意一点,因为窗口看门狗有一个中断,所以还需将NVIC进行初始化,这个初始化和平常的中断一样,只需要将通道选择成窗口看门狗中断就行。喂狗的程序和独立看门狗一样,WWDG_ClearFlag函数一般在中断中调用。

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值