打印
[牛人杂谈]

窗口看门狗是什么

[复制链接]
1135|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
窗看门狗定时器用来在一个指定的窗周期中实现系统复位,避免软件无限期进入不可控状态。
        6位向下计数值(CNTDAT) 和6位比较值(CMPDAT),使得窗口周期更加灵活。
        支持4位值(PSCSEL)选择看门狗预分频值,预分频计数器最大可达11位。

M451系列开发板:使能窗口看门狗,设计程序让窗口看门狗3次超时中断后复位芯片。

沙发
jiekou001|  楼主 | 2019-1-22 20:36 | 只看该作者
函数分析
void CLK_EnableModuleClock(uint32_t u32ModuleIdx) 位置:clk.c
功能:使能当前硬件对应的时钟模块参数:
u32ModuleIdx:使能当前哪个时钟模块,若使能定时器0,填入参数为TMR0_MODULE;若使能串口0,填入参数为 UART0_MODULE,更多的参数值参考clk.c。

——————————————————————————————————————————
void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv) 位置:clk.c
功能:设置硬件模块的时钟源参数:
u32ModuleIdx:使能当前哪个时钟模块,若使能定时器0,填入参数为TMR0_MODULE;若使能串口0,填入参数为
UART0_MODULE,更多的参数值参考clk.c。
u32ClkSrc:设置模块的时钟源。 u32ClkDiv:设置时钟源输入分频值。


使用特权

评论回复
板凳
jiekou001|  楼主 | 2019-1-22 20:37 | 只看该作者
void WWDT_Open(uint32_t u32PreScale,uint32_t u32CmpValue, uint32_t u32EnableInt) 位置:wwdt.c
功能:设置硬件模块的时钟源参数: u32PreScale:设置窗口看门狗的分频值,亦即对应窗口看门狗超时时间。 u32CmpValue:设置窗口看门狗的比较值,亦即通知我们现在该去喂狗了。 u32EnableInt:设置时钟源输入分频值。
————————————————————————————————————
WWDT_GET_RESET_FLAG() 位置:wwdt.h
功能:获取当前是否窗口看门狗导致复位。
参数:无。

—————————————————————————————————————
WWDT_CLEAR_RESET_FLAG() 位置:wwdt.h 功能:清除当前窗口狗复位标志位。参数:无。
—————————————————————————————————————
WWDT_GET_INT_FLAG() 位置:wwdt.h
功能:判断当前窗口看门狗是否产生中断。
参数:无。

——————————————————————————————————
WWDT_CLEAR_INT_FLAG() 位置:wwdt.h 功能:清除当前窗口看门狗中断标志位。参数:无。

使用特权

评论回复
地板
jiekou001|  楼主 | 2019-1-22 20:40 | 只看该作者
/************************* Copyright (c) 2014 SmartMcu Team *****************************
*项目名称:窗看门狗超时复位
                        *产生比较匹配中断时,进入喂狗10次
                        *超过10次后,就不喂狗,直接复位

*开发平台:SmartM-M4系列开发板
****************************************************************************************/
#include "SmartM_M4.h"

/*-------------------------------------------------------*/
/*                     全局变量                          */
/*-------------------------------------------------------*/
EXTERN_C  INT32 IsDebugFifoEmpty(VOID);

STATIC VOLATILE UINT8 g_unWWDTINTCounts;


/*-------------------------------------------------------*/
/*                        函数                           */
/*-------------------------------------------------------*/

/****************************************
*函数名称:main
*输    入:无
*输    出:无
*功    能:函数主体
******************************************/
INT32 main(VOID)
{
       
        PROTECT_REG
        (
                /* 系统时钟初始化 */
                SYS_Init(PLL_CLOCK);
               
                /* 使能窗口看门狗时钟 */
                CLK_EnableModuleClock(WWDT_MODULE);
               
                /* 窗口看门狗时钟源为10KHz内部低速RC振荡器 */
                CLK_SetModuleClock(WWDT_MODULE, CLK_CLKSEL1_WWDTSEL_LIRC, 0);
               
                /* 串口0波特率设置为115200bps */
                UART0_Init(115200);
        )

        printf("+------------------------------------------------+\n");
        printf("|    WWDT Compare March Interrupt Sample Code    |\n");
        printf("+------------------------------------------------+\n\n");

        /* 检查芯片复位是否窗口看门狗复位 */
        if(WWDT_GET_RESET_FLAG() == 1)
        {
                        WWDT_CLEAR_RESET_FLAG();
               
                        printf("当前复位是窗口看门狗超时复位触发\r\n");
               
        }


        /* 使能窗口看门狗嵌套向量中断控制位 */
        NVIC_EnableIRQ(WWDT_IRQn);

        g_unWWDTINTCounts = 0;


        /* 设置窗口看门狗超时时间为3.2768 s,当计数值从0x3F计数到0时,则超时时间为3.2768s,
                 当前设置比较匹配时间为超时时间的一半,则比较匹配值=0x3F/2=32,并使能窗口看门狗中断
         */
        WWDT_Open(WWDT_PRESCALER_512, 32, TRUE);

       
        while(1);
}


/*-------------------------------------------------------*/
/*                   中断服务函数                        */
/*-------------------------------------------------------*/
/****************************************
*函数名称:WWDT_IRQHandler
*输    入:无
*输    出:无
*功    能:窗口看门狗中断服务函数
******************************************/
VOID WWDT_IRQHandler(VOID)
{
        if(WWDT_GET_INT_FLAG() == 1)
        {
                /* 清除窗口看门狗比较匹配中断标志位 */
                WWDT_CLEAR_INT_FLAG();


                g_unWWDTINTCounts++;

                /* 若窗口看门狗比较匹配超过3次时,则不进行喂狗 */
                if(g_unWWDTINTCounts < 3)
                {
                                /* 重载看门狗计数值为0x3F */
                                WWDT_RELOAD_COUNTER();
                }

                printf("WWDT compare match interrupt occurred. (%d)\n", g_unWWDTINTCounts);
        }
         
}



使用特权

评论回复
5
mintspring| | 2019-1-22 23:30 | 只看该作者
多谢分享,以前只知道看门狗,没想到还有这个。

使用特权

评论回复
6
heisexingqisi| | 2019-1-23 15:46 | 只看该作者
不是太明白。同样是复位系统吗

使用特权

评论回复
7
xinpian101| | 2019-1-25 17:15 | 只看该作者
WWDG与IWDG的主要区别是有一个窗口控制,WWDG的中断不是用于日常喂狗的,如果用于日常喂狗动作,那WWDG的相对于IWDG,功能也就没什么特别了。WWDG的中断是给程序员最后一次喂狗的机会,一般进入这个中断时,表示你在其他地方安排的喂狗操不能凑效了,而发生这种现象时,肯定是系统有问题了,或者程序有Bug或者干扰,在这种情况下,这个中断时为了让你的程序在发生真正的看门狗复位前,有一个紧急处理的机会,如保存重要数据,或者系统刹车,说白了,就是让CPU写“遗嘱”;

由此看出,简单的再WWDG中断中喂狗,既没有发挥WWDG相对于IWDG的优势,又因为在中断中喂狗,而为以后的产品留下了隐患。

使用特权

评论回复
8
捉虫天师| | 2019-1-27 15:29 | 只看该作者
6位向下计数值(CNTDAT) 和6位比较值(CMPDAT),使得窗口周期更加灵活。

使用特权

评论回复
9
huahuagg| | 2019-1-28 20:06 | 只看该作者
什么机制导致复位呢

使用特权

评论回复
10
天灵灵地灵灵| | 2019-1-29 11:46 | 只看该作者
这个貌似用的人不多

使用特权

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

本版积分规则

134

主题

1358

帖子

2

粉丝