在恶劣环境中使用的高速微控制器应用的设计人员将使用看门狗定时器来防止软件失控。DS80C320高速微控制器集成了看门狗定时器,无需外部系统控制监控器。本应用笔记概述了DS80C320看门狗定时器的使用。软件示例说明了看门狗定时器作为系统监控器的使用,利用适当的复位间隔和长间隔定时器。
介绍
如今,微控制器被用于电噪声和电磁干扰(EMI)丰富的恶劣环境中。在这样的环境中,如果系统包含有助于确保正常运行的资源,则非常有益。在许多系统中,验证正确操作的常用技术是集成看门狗定时器。
看门狗定时器基本上是一种时间测量设备,它与微处理器结合使用或作为微处理器的一部分,能够使微处理器复位。在设计合理的系统中,当微处理器未正常工作时,看门狗将导致复位,从而消除故障情况。在典型应用中,看门狗定时器配置为在预定时间间隔后复位处理器。如果处理器运行正常,它将在间隔结束前重新启动监视器。重新启动后,看门狗将开始计时另一个预定间隔。如果处理器在间隔结束之前未重新启动监视器,则会发生监视器超时。这会导致处理器被重置。如果系统软件设计正确,并且没有硬件故障,则重置将导致系统再次正常运行。当然,复位条件必须是安全状态。例如,让磁盘驱动器控制器的重置状态启用写入磁头是不明智的。
许多系统都是使用外部看门狗定时器设计的。然而,DS80C320无需额外的外部元件。DS80C320内置非常强大的内部看门狗定时器。该看门狗定时器的特性和使用是本应用笔记的主题。
看门狗定时器的一般用途
看门狗定时器的主要应用是作为系统监视器(详见下一节)。使用看门狗定时器,系统可以设计成非常擅长检测和纠正失控的微处理器。使用看门狗定时器的系统特别适合检测位错误。瞬时位错误可能是由软内存故障和电磁放电到存储设备及其接口等原因引起的。这些可能导致数据临时位极性翻转进出处理器。当在获取程序信息时发生这种情况时,微处理器将开始执行错误的代码。潜在地,处理器可以开始执行操作数而不是操作码。当处理器开始执行此错误代码时,它将无法正确执行重新启动看门狗的代码。超时间隔后,看门狗将导致处理器重置。在正确设计的系统中,复位将纠正错误。
无论看门狗定时器的功能如何,它都无法解决所有的可靠性问题。有些故障无法通过重置来纠正。例如,看门狗定时器无法防止数据损坏。在其基本形式中,看门狗重新启动取决于正确的程序执行,并且通常不依赖于数据存储器中的值。除非数据损坏影响程序流或采取一些额外措施,否则数据损坏不会导致监视器超时。当然,自诊断软件可以编写成这样一种方式,即重新启动看门狗取决于数据存储器的验证。虽然这种方法可能非常有效并且很常见,但详细讨论超出了本文档的范围。
另请注意,看门狗定时器无法立即检测到故障。根据定义,看门狗定时器必须达到预定时间间隔的终点,然后才能重置处理器。这一事实解释了为什么应该选择可能的最小超时间隔。这样,在纠正失控条件之前,将有最短时间到期。
作为系统主管的看门狗
高速微型看门狗定时器最常见的用途是作为系统监控器。虽然它可以以多种不同的方式使用(其中一些将在本文档中讨论),但系统管理程序是最常见的应用程序。在系统管理引擎模式下,如上所述,处理器会定期重新启动计时器。如果处理器失控,看门狗将不会重新启动;它将超时,随后将导致处理器重置。
在高速微型中,看门狗定时器由提供给一系列分频器的主系统时钟驱动。分频器输出是可选的,并确定超时之间的间隔。当达到超时时,将设置中断标志,如果启用,将在 512 个时钟后发生复位。如果设置了中断的单个使能位并设置了全局中断使能,则中断标志将导致发生中断。复位和中断是完全离散的功能,可以确认或 忽略,一起或单独用于各种应用程序。
将看门狗定时器用作系统监视器时,应使用看门狗的复位功能。如果使用中断功能,则看门狗的目的将落空。为了解释,假设系统在看门狗中断之前执行错误的代码。中断将通过向量将 CPU 矢量化到中断服务例程来暂时强制系统重新控制。重新启动看门狗并通过 RETI 或 RET 退出会使处理器返回到中断前丢失的位置。通过使用看门狗复位功能,处理器从程序的开头重新启动,从而进入已知状态。
这并不是说DS80C320看门狗的中断功能对系统监视应用没有用处。由于复位发生在中断后512个时钟,因此可以使用短中断服务例程在复位发生之前存储关键变量。这可能允许系统在与故障前条件更相似的状态下恢复正常运行。当然,如果数据是错误的根源,则存储数据而不进行更正将没有任何好处。对于任何特定系统,所采用的方法取决于系统和所需的可靠性水平。
如上所述,DS80C320中的看门狗定时器由通过一系列分频器的主系统时钟驱动。分频器输出可由用户选择,允许超时为 217, 220, 223或 226时钟。如果启用,处理器的重置将在 512 个时钟之后发生。表1显示了与不同晶体频率相关的复位时间间隔。
时钟 | @1.832兆赫 | @11.059兆赫 | @12兆赫 | @25兆赫 |
217+ 512 | 71.83 毫秒 | 11.90 毫秒 | 10.97 毫秒 | 5.26 毫秒 |
220+ 512 | 572.6 毫秒 | 94.86 毫秒 | 87.42 毫秒 | 41.96 毫秒 |
223+ 512 | 4.58 秒 | 758.6 毫秒 | 699.1 毫秒 | 335.6 毫秒 |
226+ 512 | 36.63 秒 | 6.07 秒 | 5.59 秒 | 2.68 秒 |
可以看出,有一系列可用的超时间隔。选择的间隔应基于几个问题。第一个目标是选择一个间隔,该间隔表示允许处理器失控的最长时间。例如,理想情况下,每 500 毫秒向机械臂发出位置命令的系统不会使用大于此间隔的超时间隔。缩短超时间隔可确保最多向手臂发出一个错误命令。
设置监视器超时间隔的另一个主要问题是能够在系统软件中找到重新启动命令。这可能是一个非常复杂的问题,具体取决于系统软件的性质。最理想的方法是在重新启动看门狗定时器的系统软件的单个主循环中有一个位置。通过主程序循环所需的时间将决定所需的超时间隔。
上述方法假定系统软件流是线性的,足以允许它。有些程序过于复杂,它们的流程过于非线性,无法允许这种方法。使用这样的程序结构,很难找到看门狗重新启动的正确点。这个问题的一个可能解决方案是使用DS80C320的看门狗定时器本身来帮助确定适当的重启位置。此方法使用看门狗的中断功能,将在下面的部分中详细介绍。
在某些系统中,软件太复杂或程序流程变化太大,无法进行完整彻底的分析。可能无法确定监视器重新启动是否覆盖了所有程序路径。在这种情况下,可以使用不同的方法。在这种情况下,可以开发诊断软件来测试系统。该诊断软件将定期调用,可能使用看门狗定时器的中断功能。如果诊断通过,则重新启动监视器。否则,监视器超时并重置处理器。当然,在这种情况下,测试必须足够彻底才能有效。给定系统中使用的确切方法可以是上述任何一种,也可以是每种方法的某种组合,视应用而定。
看门狗复位示例
下面显示了一个简短的程序,说明了大多数基本的看门狗定时器功能。该程序说明了如何初始化看门狗定时器,以便在超时时导致重置。
该程序说明了DS80C320看门狗定时器的独特功能之一。更改看门狗操作的软件必须执行定时访问操作。定时访问操作是必须按顺序一起执行的一系列步骤;否则,访问将失败。示例程序显示了用于重新启动监视器并启用其重置的定时访问。可以看出,值 0AAh 首先写入定时访问寄存器 (TA)。接下来,将值 055h 写入 TA 寄存器。最后,修改受保护位。这些指令必须按照所示的顺序执行,不得中断才能访问受保护位。有关定时访问操作的更多详细信息,请参阅高速微型用户指南。受定时访问过程保护的监视器计时器位是启用监视器计时器重置 (EWT = WDCON.1) 位、监视器中断标志 (WDIF = WDCON.3) 位和重新启动监视器计时器 (RWT = WDCON.0) 位。
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; WD_RST.ASM Program ; ; This program demonstrates the use of the watchdog timer in ; the DS80C320. It uses the timer's reset capability. When ; running, the program sets port 1's pins low to indicate ; the processor is idle waiting for the watchdog to timeout. When ; the watchdog times out, the processor is reset causing the port ; pins to return high. A delay is written into the program so that ; the port pins will be high long enough to be seen if attached to ; LEDs. ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; Reset Vector ; ORG 00h SJMP START ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; Main program body ; ORG 080h ; START: ORL CKCON, #080h ; Set Watchdog timeout period 2**23 ; (approximately 758 mS @ 11.059 MHz) ; ; In a real application, the next three lines would be placed ; at various locations in the program to restart the watchdog ; before it times out. ; MOV TA, #0AAh ; Restart Watchdog timer MOV TA, #055h ; using timed SETB RWT ; access. ; ; MOV TA, #0AAh ; Enable Watchdog timer reset MOV TA, #055h ; using timed SETB EWT ; access. ; ; MOV R1, #0FFh ; Create a delay loop so the port LOOP: MOV R2, #0FFh ; pins are high long enough after DJNZ R2, $ ; a reset to be seen. DJNZ R1, LOOP ; MOV P1, #00 ; P1 = 0, Reset causes P1 = 1 ; MOV PCON, #01h ; Go to idle mode waiting for reset SJMP $ ; ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; END
看门狗定时器作为长间隔定时器
高速微型看门狗定时器的一个略有不同的应用是作为长间隔定时器。在此应用中,使用启用看门狗定时器中断 (EWDI=EIE.4) 位使能中断,复位保持禁用状态。发生超时时,监视器计时器将设置 WDIF 位 (WDCON.3),如果设置了全局中断启用位 (EA=IE.7),则会发生中断。看门狗中断标志将指示中断的来源,必须由软件清除。如上表所示,5 MHz晶体的间隔从26.2 ms到68.25秒不等。此间隔明显长于使用标准 16 位定时器的任何间隔。
另一个说明看门狗定时器功能的简短程序如下所示。该程序演示了必须如何初始化看门狗计时器和中断,以便超时导致 中断。包括一个简短的中断服务例程。
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; ;WD_INT.ASM Program ; ; This program demonstrates the use of the watchdog timer of ; the 80C320. It uses the timer's interrupt generating capability. ; For purposes of demonstration, the program toggles Port 1's pins ; each time the watchdog's Interrupt Service Routine is entered. ; ; $MODS320 ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; Reset Vector ; ORG 00h SJMP START ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; Watchdog Interrupt Vector ; ORG 063h ; MOV TA, #0AAh ; Restart watchdog timer MOV TA, #055h ; using timed SETB RWT ; access. ; MOV TA, #0AAh ; Clear watchdog interrupt flag MOV TA, #055h ; using timed CLR WDIF ; access. ; CPL A ; Complement port 1 to show the MOV P1, A ; interrupt routine was entered. ; RETI ; Return from interrupt. ; ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ; Main program body ; ORG 080h ; START: ORL CKCON, #040h ; Set Watchdog timeout period 2**20 ; (approximately 94.8 mS @ 11.059 MHz) ; MOV TA, #0AAh ; Restart Watchdog timer MOV TA, #055h ; using timed SETB RWT ; access. ; SETB EWDI ; Enable Watchdog Interrupt and SETB EA ; set global interrupt enable ; Here: MOV PCON, #01 ; Go to Idle mode and wait SJMP Here ; After interrupt, go back to idle ; ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; END
看门狗定时器作为定位重启指令的辅助手段
如上所述,在系统软件中找到看门狗重新启动指令有时可能很困难。系统软件的结构及其流程的复杂性决定了任务的难度级别。在DS80C320中,看门狗定时器本身可用于辅助此活动。对此的一般方法是允许监视器引起中断,并从服务例程中确定中断在代码中发生的位置。通过将监视器重新启动说明放在此点之前,可以确保监视器将在超时之前重新启动(当软件流遵循此特定分支时)。重复此过程,直到不再发生监视器中断。如果程序流是线性的并且不依赖于数据,则系统将按预期运行。
前面的软件示例提供了执行此功能所需的大多数软件。但是,作为第一步,应确定所需的最大超时间隔,并为此值修改代码。与往常一样,选择的超时是系统以及允许微失控多长时间的函数。修改软件以初始化所需的看门狗超时间隔后,应将以下指令添加到中断服务例程中。它们将使处理器显示如果未发生中断将执行的指令的地址。如果这种显示机制不方便系统实现,可以将地址转换为ASCII并在其中一个串行端口上输出。
MOV R0, SP ; Get SP contents MOV P3, @R0 ; Display high address byte DEC R0 ; Point to low address byte MOV P1, @R0 ; Display low address byte SJMP $ ; Stop here
上述说明将堆栈指针的内容移动到 R0,然后用于指向确认中断时推送到堆栈的数据。此地址反映在中断未发生的情况下将执行的下一条指令。地址的高字节显示在端口 3 引脚上,地址的低字节显示在端口 1 引脚上。如果重新启动看门狗计时器的指令放在此地址之前,则看门狗将永远不会超时。
总结
在使用看门狗作为监视器设计系统时,有效的设计必须考虑许多因素。首先,处理器可能失控的最长时间将决定最大看门狗超时期限。确定超时期限后,必须分析系统软件以确定看门狗重新启动指令的位置。为了进行有效的设计,应将监视程序重新启动的次数保持在最低限度,并应考虑错误执行重新启动的可能性。如前所述,某些系统软件过于复杂或依赖于数据,无法确保看门狗重新启动涵盖所有软件流路径。这可能要求可能需要自诊断软件方法。如果存在预期的故障机制,例如周期性EMI突发或电源毛刺,则看门狗超时应考虑此时间段。
要使看门狗复位成为有效的纠错机制,处理器的复位状态必须是安全的。在某些应用中,看门狗的中断功能可用于在复位之前操作数据或堆栈,以确保处理器在复位后正常运行。
通过仔细考虑上述方面,可以使用在非常恶劣的环境中运行的看门狗定时器设计系统。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !