[牛人杂谈] N79E715的看门狗

[复制链接]
 楼主| 稳稳の幸福 发表于 2017-2-15 21:38 | 显示全部楼层 |阅读模式
N79E715系列提供一组看门狗定时器,用于监测系统以提高系统可靠性。对于容易受到噪声,电源干扰
或静电放电干扰的系统,是十分有用的工具。看门狗定时器周期中断,也可以作为事件定时或在一个周
期监测制度,用于空闲模式或掉电模式下运行时长系统监控。定时器基于一组分频器,对系统时钟频率
进行分割。分频器输出可选,并决定溢出时间。当定时溢出,将会把系统从空闲模式或掉电模式下唤
醒,并产生中断。如果看门狗定时器复位使能,在一个延迟周期后没有软件响应,系统将复位。

 楼主| 稳稳の幸福 发表于 2017-2-15 21:40 | 显示全部楼层
 楼主| 稳稳の幸福 发表于 2017-2-15 21:41 | 显示全部楼层
看门狗定时器 通过设定WDCLR(WDCON.6) 从00H开始执行,保证看门狗为已知的状态。通过清除
WDTEN (WDCON.7)关闭看门狗后,该计数器同时清零。 WDCLR 用于复位看门狗定时器,该位自动
清除。 WDCLR 置 1看门狗定时器计数清零。WDTEN置1,看门狗定时器开始计数。 通过设定
WPS2、WPS1和WPS0 (WDCON[2:0]) 选择定时器溢出时间,一旦选择时间溢出,看门狗定时器中断
标志WDTF (WDCON0.5)置1。看门狗中断使能在寄存器EIE.4里设置,写1到EWRST (WDCON1.0)使
能看门狗定时器复位,如果同时设置WDCLR,设定的看门狗定时时间加上基于内部低速RC时钟的额外
512个时钟延迟后复位发生,如果没有设置WDCLR,在512个时钟周期之内发生复位。一旦看门狗定时
器复位发生,看门狗定时复位标志WDTRF (WDCON0.3)将被置1,该位只有在上电复位后才可硬件清
零,用户可以通过软件清WDTRF,看门狗定时器提供WIDPD (WDCON.4)位允许看门狗定时器在系统
进入空闲模式或掉电模式后继续运行。
 楼主| 稳稳の幸福 发表于 2017-2-15 21:42 | 显示全部楼层
WDT计数器需特别注意. 在进入和唤醒空闲模式或掉电模式 硬件会自动清 WDT 计数器,防止系统未知
的复位。
 楼主| 稳稳の幸福 发表于 2017-2-15 21:43 | 显示全部楼层
看门狗定时器复位的主要应用是系统监测, 这对于实时控制很重要,适用于电磁干扰等避免发生程序跑飞等场合,或在未知状态发生时保护用户的代码。 使用看门狗定时器 用户可选择理想的看门狗复位看门狗定时时间。设定 WCLR, 可使代码继续运行而无看门狗定时器复位。若未开启看门狗定时器复位,一旦代码运行在错误的状态下,无法清看门狗定时器,将引起芯片复位。WDCON 有时序写入保护功能,避免误改写。
 楼主| 稳稳の幸福 发表于 2017-2-15 21:44 | 显示全部楼层
看门狗定时器中断应用
看门狗定时器的另一个应用是用作简单的定时器。 看门狗定时器完成所选的时间间隔后,WDTF标志置
位. 软件让WDTF标志检测定时溢出,WDCLR允许软件重启定时器. 看门狗定时器可被用作较长的定时
器. 任何定时溢出发生时,在EWDT (EIE.4)和EA置1打开的条件下将发生中断。在一些功耗的应用中,CPU常在没有处理事件时处于空闲模式或掉电模式,需要定时唤醒察看是否需要响应,而定时器0、1和2打开后耗电量将达到mA级,无法达到系统需要保持在μA级的要求。N79E715看门狗定时器可以起到定时唤醒的功能,由于基于内部10kHz的RC时钟源,看门狗定时器功耗非常低,更是用于需要低功耗的场合。
 楼主| 稳稳の幸福 发表于 2017-2-15 21:46 | 显示全部楼层
看门狗定时器在掉电模式下应用的例程
  1. ORG 0000H
  2. LJMP START
  3. ORG 0053H
  4. LJMP WDT_ISR
  5. ORG 0100H
  6. WDT_ISR:
  7. CLR EA
  8. MOV TA,#0AAH
  9. MOV TA,#55H
  10. ORL WDCON0,#01000000B ;clear Watchdog Timer counter
  11. INC ACC
  12. MOV P0,ACC
  13. SETB EA
  14. CLR EA
  15. MOV TA,#0AAH
  16. MOV TA,#55H
  17. ANL WDCON0,#11011111B ;clear Watchdog Timer interrupt flag
  18. SETB EA
  19. RETI
  20. START:
  21. MOV TA,#0AAH
  22. MOV TA,#55H
  23. ORL WDCON0,#01000000B ;clear Watchdog Timer counter
  24. MOV TA,#0AAH
  25. MOV TA,#55H
  26. ORL WDCON0,#10000000B ;enable Watchdog Timer to run
  27. Check_clear:
  28. MOV A,WDCON0
  29. JB ACC.6,Check_clear
  30. MOV TA,#0AAH
  31. MOV TA,#55H
  32. ORL WDCON0,#00000111B ;choose interval length
  33. MOV TA,#0AAH
  34. MOV TA,#55H
  35. ANL WDCON1,#11111110B ;disable Watchdog Timer reset
  36. SETB EWDI ;enable Watchdog Timer interrupt
  37. MOV TA,#0AAH
  38. MOV TA,#55H
  39. SETB WIDPD
  40. SETB EA
  41. ;********************************************************************
  42. ;Enter into Power Down mode
  43. ;********************************************************************
  44. LOOP:
  45. ORL PCON,#02H
  46. LJMP LOOP
  47. END

 楼主| 稳稳の幸福 发表于 2017-2-15 21:48 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2015 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Nuvoton Technology Corp.
  8. //  E-mail: MicroC-8bit@nuvoton.com
  9. //***********************************************************************************************************
  10. //  Application: WDT Function
  11. //  Set watch counter and enable WDT interrupt. WDT ISR will be execute when WDT time out.
  12. //
  13. //  Output : P1.4 & P2.1 toggle by WDT interrupt
  14. //***********************************************************************************************************

  15. //========================================= How to set WDT register =========================================
  16. //
  17. //  1.WDT time-out period is 64 /(Fwck + Prescalar);
  18. //
  19. //  2.Fwck is frequency of WDT clock source
  20. //
  21. //  3.Prescalar = WDCON0 & 0x07
  22. //===========================================================================================================

  23. //------------------------- <<< Use Configuration Wizard in Context Menu >>> --------------------------------
  24. //
  25. //<o0.0..2> WDT Prescalar Select
  26. //      <0=> 1/1    <1=> 1/2    <2=> 1/8    <3=> 1/16
  27. //      <4=> 1/32   <5=> 1/64   <6=> 1/128  <7=> 1/256
  28. //     <o1.6> UART pin Select
  29. //         <0=> Select P1.0, P1.1 as UART pin            <1=> Select P2.6, P2.7 as UART pin(28 pin only)
  30. //-------------------------------- <<< end of configuration section >>> -------------------------------------

  31. #define WDT_CLK_DIV     0x01
  32. #define Uart_Port_Sel   0x00

  33. #include <stdio.h>
  34. #include "N79E715.h"
  35. #include "Typedef.h"
  36. #include "Define.h"
  37. #include "Common.h"
  38. #include "Delay.h"
  39. #include "WDT.h"
  40. #include "Version.h"
  41. bit EA_Save_bit;
  42. //-----------------------------------------------------------------------------------------------------------
  43. void main(void)
  44. {
  45.     AUXR1 |= Uart_Port_Sel;             // Select P10/P11 as UART pin(default)
  46.     InitialUART0_Timer1(9600);          // 9600 Baud Rate [url=home.php?mod=space&uid=72445]@[/url] 11.0592MHz
  47.     Show_Version_Number_To_PC();
  48.     printf ("\n*===================================================================");
  49.     printf ("\n*  Name: N79E715 Series WDT Sample Code.");
  50.     printf ("\n*===================================================================");
  51.     printf ("\nWDT Demo Start.");
  52.     printf ("\nP1.4 & P2.1 toggle by polling.\n");

  53.     EA_Save_bit = EA;
  54.     EA = 0;
  55.     TA = 0xAA;
  56.     TA = 0x55;
  57.     WDCON0 &= 0xf8;
  58.     TA = 0xAA;
  59.     TA = 0x55;
  60.     WDCON0 |= WDT_CLK_DIV;              // Select bit length of WDT counter
  61.     EA = EA_Save_bit;

  62.     set_WDCLR;                          // Clear WDT counter
  63.     clr_WDTF;
  64.     set_WDTEN;                          // Enable WDT
  65.     EWDI = 1;                           // Enable WDT interrupt
  66.     EA = 1;                             // Enable interrupt
  67.     while(1);
  68. }
  69. //-----------------------------------------------------------------------------------------------------------
  70. void WDT_ISR(void)  interrupt 10        // Vector @  0x53
  71. {
  72.     clr_WDTF;                           // Clear WDT flag
  73.     P14 = ~P14;                         // P1.4 toggle when interrupt
  74.     P21 = ~P21;                         // P2.1 toggle when interrupt
  75. }
  76. //-----------------------------------------------------------------------------------------------------------
天灵灵地灵灵 发表于 2017-2-16 19:17 | 显示全部楼层
看门狗定时器周期中断,也可以作为事件定时或在一个周期监测制度,用于空闲模式或掉电模式下运行时长系统监控。
zhuotuzi 发表于 2017-2-17 08:39 | 显示全部楼层
当定时溢出,将会把系统从空闲模式或掉电模式下唤醒,并产生中断。
598330983 发表于 2017-2-19 19:28 | 显示全部楼层
通过看门狗可以很容易的保证系统在死机后能快速复位,恢复应用。
heisexingqisi 发表于 2017-2-19 23:15 | 显示全部楼层
对于那些开机后什么不设置就可以正常运行的系统,弄这个看门狗最合适了。
gejigeji521 发表于 2017-2-20 00:04 | 显示全部楼层
定时器基于一组分频器,对系统时钟频率进行分割。分频后可以提供不同速率的时钟信号给不同的外设。
yiyigirl2014 发表于 2017-2-20 00:11 | 显示全部楼层
如果看门狗定时器复位使能,在一个延迟周期后没有软件响应,系统将复位。复位后系统哈可以重头开始运行。
天灵灵地灵灵 发表于 2017-2-20 00:20 | 显示全部楼层
定时溢出,将会把系统从空闲模式或掉电模式下唤醒,并产生中断。
 楼主| 稳稳の幸福 发表于 2017-2-20 00:20 | 显示全部楼层
看门狗定时器周期中断,也可以作为事件定时或在一个周期监测制度,用于空闲模式或掉电模式下运行时长系统监控。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

203

主题

3409

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部