1. 概述
STM32有两个看门狗,一个是独立看门狗,另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬。
一般情况下,使用频次较高是独立看门狗,也即是通常意义的看门狗。
2. 独立看门狗(IWDG)
一个12位的递减计数器,最大值为0XFFF,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即IWDG_RESET。如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作.
看门狗时钟
独立看门狗的时钟由独立的RC振荡器LSI提供,即使主时钟发生故障它仍然有效,非常独立。LSI的频率一般在30~60KHZ之间,根据温度和工作场合会有一定的漂移,我们一般取40KHZ,所以独立看门狗的定时时间并一定非常精确,只适用于对时间精度 要求比较低的场合。
计数器时钟
递减计数器的时钟由LSI经过一个8位的预分频器得到,我们可以操作预分频器寄存器IWDG_PR来设置分频因子,分频因子可以是:[4,8,16,32,64,128,256,256],计数器时钟CK_CNT= 40/ 4*2^PRV,一个计数器时钟计数器就减一。
键寄存器
一旦独立看门狗启动,它就关不掉,只有复位才能关掉
应用场景
独立看门狗一般用来检测和解决由程序引起的故障。
PS: 可以在系统上电开始的时候检查是否因看门狗引起的复位【RCC_GetFlagStatus(RCC_FLAG_IWDGRST)】
代码实例
/*
* 设置 IWDG 的超时时间
* Tout = prv/40 * rlv (s)
* prv可以是[4,8,16,32,64,128,256]
* prv:预分频器值,取值如下:
* @arg IWDG_Prescaler_4: IWDG prescaler set to 4
* @arg IWDG_Prescaler_8: IWDG prescaler set to 8
* @arg IWDG_Prescaler_16: IWDG prescaler set to 16
* @arg IWDG_Prescaler_32: IWDG prescaler set to 32
* @arg IWDG_Prescaler_64: IWDG prescaler set to 64
* @arg IWDG_Prescaler_128: IWDG prescaler set to 128
* @arg IWDG_Prescaler_256: IWDG prescaler set to 256
*
* 独立看门狗使用LSI作为时钟。
* LSI 的频率一般在 30~60KHZ 之间,根据温度和工作场合会有一定的漂移,我
* 们一般取 40KHZ,所以独立看门狗的定时时间并一定非常精确,只适用于对时间精度
* 要求比较低的场合。
*
* rlv:预分频器值,取值范围为:0-0XFFF
* 函数调用举例:
* IWDG_Config(IWDG_Prescaler_64 ,625); // IWDG 1s 超时溢出
* (64/40)*625 = 1s
*/
void bsp_IWDG_Config(uint8_t prv ,uint16_t rlv)
{
// 使能 预分频寄存器PR和重装载寄存器RLR可写
IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );
// 设置预分频器值
IWDG_SetPrescaler( prv );
// 设置重装载寄存器值
IWDG_SetReload( rlv );
// 把重装载寄存器的值放到计数器中
IWDG_ReloadCounter();
// 使能 IWDG
IWDG_Enable();
}
// 喂狗
void bsp_IWDG_Feed(void)
{
// 把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位
// 当计数器的值减到0的时候会产生系统复位
IWDG_ReloadCounter();
}
3. 窗口看门狗(WWDG)
窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下递减计数,当减到一个固定值0X40时还不喂狗的话,产生复位,这个值叫窗口的下限,是固定的值,不能改变。这个是跟独立看门狗类似的地方,不同的地方是窗口看门狗的计数器的值在减到某一个数之前喂狗的话也会产生复位,这个值叫窗口的上限,上限值由用户独立设置。窗口看门狗计数器的值必须在上窗口和下窗口之间才可以喂狗,这就是窗口看门狗中窗口两个字的含义.
窗口看门狗时钟
窗口看门狗时钟来自PCLK1,PCLK1最大是45M,由RCC时钟控制器开启。
计数器时钟和计数器
计数器时钟由CK计时器时钟经过预分频器分频得到,分频系数由配置寄存器CFR的位8:7 WDGTB[1:0]配置,可以是[0,1,2,3],其中CK计时器时钟=PCLK1/4096,计数器的时钟CNT_CK=PCLK1/4096/(2^WDGTB)。
计数器是一个递减计数器,共有7位,其值存在控制寄存器CR的位6:0,即T[6:0],当7个位全部为1时是0X7F,这个是最大值,当递减到T6位变成0时,即从0X40变为0X3F时候,会产生看门狗复位。计数器的值只能是:0X40~0X7F之间,实际上用来计数的是T[5:0]。当递减计数器递减到0X40的时候,还不会马上产生复位,如果使能了提前唤醒中断:CFR位9 EWI 置1,则产生提前唤醒中断,如果真进入了这个中断的话,就说明程序肯定是出问题了, 那么在中断服务程序里面我们就需要做最重要的工作,比如保存重要数据,或者报警等,这个中断我们也叫它死前中断。
应用场景
WWDG一般被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
PS: 可以在系统上电开始的时候检查是否因看门狗引起的复位【RCC_GetFlagStatus(RCC_FLAG_WWDGRST)】
代码实例
//用于记录看门狗 递减计数器的值,方便喂狗函数直接使用
static uint8_t m_bsp_wwdg_cnt ;
// WWDG 中断优先级初始化
static void bsp_WWDG_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/* WWDG 配置函数
* tr :递减计时器的值, 取值范围为:0x7f~0x40,超出范围会直接复位
* wr :窗口值,取值范围为:0x7f~0x40
* prv:预分频器值,取值可以是
* @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1(45MHz)/4096)/1 约10968Hz 91us
* @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1(45MHz)/4096)/2 约5484Hz 182us
* @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1(45MHz)/4096)/4 约2742Hz 364us
* @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1(45MHz)/4096)/8 约1371Hz 728us
*
* 例:tr = 127(0x7f,tr的最大值) wr = 80(0x50, 0x40为最小wr最小值) prv = WWDG_Prescaler_8
* ~728 * (127-80) = 34.2ms < 刷新窗口 < ~728 * 64 = 46.6ms
* 也就是说调用WWDG_Config进行这样的配置,若在之后的34.2ms前喂狗,系统会复位,在46.6ms后没有喂狗,系统也会复位。
* 需要在刷新窗口的时间内喂狗,系统才不会复位。
*/
void bsp_WWDG_Config(uint8_t tr, uint8_t wr, uint32_t prv)
{
m_bsp_wwdg_cnt = tr;//保存CNT配置,用在喂狗函数
// 开启 WWDG 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
// 设置预分频器的值
WWDG_SetPrescaler( prv );
// 设置上窗口值
WWDG_SetWindowValue( wr );
// 设置计数器的值,使能WWDG
WWDG_Enable(tr);
// 清除提前唤醒中断标志位
WWDG_ClearFlag();
// 配置WWDG中断优先级
bsp_WWDG_NVIC_Config();
// 开WWDG 中断
WWDG_EnableIT();
}
// 喂狗
void bsp_WWDG_Feed(void)
{
// 喂狗,刷新递减计数器的值,设置成最大WDG_CNT=0X7F
WWDG_SetCounter( m_bsp_wwdg_cnt );
}
上一篇:秉火429笔记之十五 DMA--直接存储区访问
下一篇:秉火429笔记之十一 Systick--滴答定时器
推荐阅读
史海拾趣
随着云计算、大数据等技术的兴起,传统EDA行业面临着前所未有的挑战。为了应对这些挑战,EDAL公司积极转型升级,将云计算、大数据等技术与EDA工具相结合,推出了更加高效、智能的云端EDA服务。这一创新的服务模式不仅提升了客户的设计效率,还降低了成本,赢得了市场的广泛认可。
义隆电子股份有限公司于1994年5月在台湾创立,以亚太区著名的IC设计公司为目标。公司初始阶段就明确了以研发和销售集成电路(IC)产品为核心业务的战略方向。在创立初期,义隆电子积极引进高素质的研发人才,建立了强大的研发团队,并投入大量资金用于新产品的研发。凭借卓越的技术实力和敏锐的市场洞察力,义隆电子在消费性芯片、通讯类芯片等领域迅速取得了突破。
随着全球环保意识的提高,对于环保型电子材料的需求也日益增长。DuPont公司积极响应这一趋势,致力于环保型电子材料的研发和生产。公司采用先进的环保技术和生产工艺,开发出了一系列低污染、低能耗的电子材料。这些材料不仅具有良好的性能,而且对环境友好,符合可持续发展的要求。DuPont公司的这一举措,不仅提升了公司的竞争力,也为电子行业的可持续发展做出了积极贡献。
随着电子技术的不断发展,DDC也积极投入研发,寻求技术突破。在数据接口技术方面,DDC不断推陈出新,研发出了一系列高性能、高可靠性的产品。同时,DDC还拓展了业务领域,将产品应用于更广泛的领域,如地面保障、高速串行通信等。这些举措使得DDC的产品线更加丰富,市场竞争力也得到了进一步提升。
进入90年代后期,Corsair再次调整其产品策略,由生产标准内存转变为生产高于规格的内存,即超频内存。这一决策迎合了当时市场对高性能内存的需求,Corsair的超频内存迅速在市场上获得了认可。其产品的超级性能专为极大需求的应用软件而设,也一直被应用关键的服务器及极高性能的工作站(包括游戏系统)上。
在电子产品行业日益关注环保和可持续发展的背景下,ElectronicsCorp采取了一系列积极措施。公司开始使用环保材料制造产品,并优化生产流程以减少能源消耗和废物排放。此外,ElectronicsCorp还推出了一系列回收计划,鼓励消费者将旧电子产品回收再利用。这些措施不仅提高了公司的环保形象,还增强了消费者对公司品牌的忠诚度。
CA3130 高输入阻抗运算放大器 Intersil[DATA] CA3140 高输入阻抗运算放大器 CD4573 四可编程运算放大器 MC14573 ICL7650 斩波稳零放大器 LF347(NS[DATA]) 带宽四运算放大器 KA347 LF351 BI-FET单运算放大器 NS[DATA] LF353 BI-FET双运 ...… 查看全部问答∨ |
|
s3c44b0x 对于中断的一点疑惑,并且自己写的中断不进服务程序求助 首先我有一些疑问,如果产生EXT0的中断,cpu处理的过程是不是应该首先跳转到0x18执行IRQ中断服务程序,执行完以后在跳转到0x20执行EXT0的服务程序?这个跳转到0x20是cpu自动完成的么?还是要把代码写到0x18的IRQ中断服务程序实现的?执行0x18和执行 ...… 查看全部问答∨ |
|
今天调了一天的mc34063,输入电压为9V,本来打算反向输出-8V电压,但是输出有问题,就换成了降压输出接法,如图,现在的Rsc为1欧, L为100uH, 1N5819用的ISS14, CT为470pF,通过改变R1和R2的电阻来查了几组数据, 我感觉数据不对,请各位帮忙看看 ...… 查看全部问答∨ |
|
以下是是MCS-51单片机的数字时钟程序,求助各位大侠!帮忙看看题目 #include "reg51.h" unsigned char code disptab[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; unsigned char code ...… 查看全部问答∨ |
求助,把h.264移植到dsp上并进行算法上的优化,请问用哪个软件进行仿真,555·· 我的论文题目是基于3g的视频监控,终端打算用arm+dsp双处理器,视频压缩用H.264标准,需要在dsp上移植,并打算在算法上做一些改进,请问实验怎么做,需要用哪个软件进行仿真,matlab还是ccs 还是有更好的,谢谢大家了,好着急啊 ,马上中期 ...… 查看全部问答∨ |