7 Replies Latest reply on Mar 3, 2020 12:29 AM by ShipingW_81

    关于看门狗定时器级联增加看么狗复位时间的问题请教

    JeHa_3912621

      我参考了例程代码CE220060和CE220061。 想让看门狗定时器的复位时间变得长一些。 但是我现在的问题是,我发现CE220060的例子部分,根本就没有在原理图组件里面添加MCWDT,而CE220061虽然介绍了级联的配置项,但是我不知道如何把两个例程结合到一起实现我的要求。

        • 1. Re: 关于看门狗定时器级联增加看么狗复位时间的问题请教
          LinglingG_46

          1: 你是想让看门狗复位? 还是需要看门狗产生中断唤醒系统?

                 如果你的系统进入的是hibernate状态的话,那确实需要等到看门狗reset才能唤醒系统。

          2: 如果你的系统是进入了DeepSleep 状态,那么看门狗所产生的任何一次中断都可以唤醒深度睡眠的系统的。 如果你说的是这个状态下的系统,那么,你的系统需要看门狗多长时间产生中断?

          3: CE220060 里面描述的是Free-running WDT, 这个看门狗在creator里面没有对应的组件,它的运行机制也比较简单,就是一直计数,计到match 值,产生中断, 如果不清中断的话,三次之后系统就会重新启动。不想让device reset的话,进入中断之后要手动清counter。历程当中的ISR处理函数里面有。

          4:你能描述一下,你把两个例程融合在一起的理由吗? 按照你的描述,你不需要用到free-running WDT, 用MCWDT就可以实现了。

          • 2. Re: 关于看门狗定时器级联增加看么狗复位时间的问题请教
            JeHa_3912621

            您好,我不是想用看门狗唤醒低功耗模式。 我是想用看门狗来保护我的主循环的程序代码死循环或者异常的情况下复位MCU。 我用到Free-running WDT,可以实现复位功能,但是我没办法设置更长的看门狗时间,比如10s。 

            我想实现10s看门狗复位 ,在10s内如果没有发生喂狗,就让系统复位。

            如果能灵活一些,比如我可以在系统运行的时候可以更改看门狗时间那样就更好。

            比如我在系统正常运行时,看门狗复位时间是1s,  当系统进入deepsleep前,我把看门狗复位时间重新配置成12s, 我利用rtc10s唤醒1次mcu,喂狗,然后继续睡眠。 

             

             

            • 3. Re: 关于看门狗定时器级联增加看么狗复位时间的问题请教
              LinglingG_46

              Note:

              MCWDT的counter0/1具有产生device reset的能力,counter2不具备,因此可以选择c0/c1级联,c0按需配置match value,mode为no action, clear on match,c1同样按需配置为match value, mode为watchdog reset或three interrupts then watchdog reset.

               

              你注意看一下代码里面:

              line 138;

              /* Set interrupt mask for MCWDT_0 */

              Cy_MCWDT_SetInterruptMask(MCWDT_0_HW, (CY_MCWDT_CTR0|CY_MCWDT_CTR1));

              但是我在深度睡眠之前改成了:

              /* Set interrupt mask for MCWDT_0 */

              Cy_MCWDT_SetInterruptMask(MCWDT_0_HW, CY_MCWDT_CTR1);

              这样做的目的是平时你是需要2s 中断一次的,但是deepsleep之后是12s,你测试一下。 如果有什么问题的话,我们再联系。附件代码是测试用代码,仅供参考。

              • 4. Re: 关于看门狗定时器级联增加看么狗复位时间的问题请教
                JeHa_3912621

                您好。 我看了提供的例子。 有一些明白了。 我想问一下。 我的想法是如果我的程序一直正常,那我最开始设定的MCWDT中断就永远不产生中断。 就是说有没有类似喂狗的函数,在主循环可以自动清零MCWDT的计数器。 让它在起点重新开始计数。

                    if (0u != (CY_MCWDT_CTR0 & mcwdtIsrMask))

                    {

                        Cy_MCWDT_ClearInterrupt(MCWDT_0_HW, CY_MCWDT_CTR0);

                        Cy_GPIO_Inv(Counter00_Out_0_PORT, Counter00_Out_0_NUM); 

                    }

                Cy_MCWDT_ClearInterrupt(MCWDT_0_HW, CY_MCWDT_CTR0);这个函数如果我在主循环里面一直调用。 是不是相当于喂狗程序了? 

                 

                还有就是级联以后。 我们把counter0和counter1都配置成watchdog reset模式吗?   这样我就可以分别控制2个不同长度的定时器。来确定用哪个时段复位MCU。

                • 5. Re: 关于看门狗定时器级联增加看么狗复位时间的问题请教
                  LinglingG_46

                  1:喂狗:

                  方法一: 可以清counter。

                  用下面的函数: __STATIC_INLINE void MCWDT_0_ResetCounters(uint32_t counters, uint16_t waitUs)

                   

                  用下面的函数去测试,是否是得到你想要的结果:__STATIC_INLINE uint32_t MCWDT_0_GetCount(cy_en_mcwdtctr_t counter)

                   

                  具体的你在creator中看函数的解释。

                   

                  方法二:清中断也是可以的。

                   

                  2:你把counter0和counter1 都配置成watchdog reset 的话,可以控制两个长度。

                  • 6. Re: 关于看门狗定时器级联增加看么狗复位时间的问题请教
                    JeHa_3912621

                    我尝试了一下。 在主循环通过MCWDT_0_ResetCounters( CY_MCWDT_CTR0, 10 )喂狗

                    然后我的中断函数里面是空函数。 确实可以实现复位功能。

                     

                    但是我试了counter0和chounter1同时配置成watchdog  reset的情况。  我发现调用了MCWDT_0_ResetCounters()后,永远无法触发conter1的看门狗复位条件。 我分析了一下,我感觉是因为counter0计数器一直不溢出,所以counter1永远加不上去。

                     

                    那我们能否换个思路。 我试过单独配置counter1做看么狗的情况,chouter0配置为No action。 这样counter1看门狗复位可以实现。

                    我现在的想法是,能否在程序运行的过程中更改Counter1的  Match值, 来达到不同的看门狗复位间隔的功能?

                    期待您的答复! 感谢!

                    • 7. Re: 关于看门狗定时器级联增加看么狗复位时间的问题请教
                      ShipingW_81

                      运行中修改counter match值需要先disable counter,再进行de-init / init,与之对应的每个操作都有具体的API,不是很方便,具体效果你可以试下。

                       

                      另外通过清中断的方式喂狗也是可行的,counter0/1配置为three interrupt then reset,通过在深度睡眠之前/后掩位配置改变每次中断的间隔。

                      Cy_MCWDT_SetInterruptMask()

                      中断isr中不喂狗,for loop喂狗。