26 第 26 章看门狗定时器与休眠模式 目录 看门狗定时器与休眠模式 本章包括下面一些主要内容 : 26.1 简介... 26-2 26.2 控制寄存器... 26-3 26.3 看门狗定时器 (WDT) 的操作... 26-4 26.4 休眠省电模式... 26-7 26.5 初始化... 26-9 26.6 设计技巧... 26-10 26.7 相关应用笔记... 26-11 26.8 版本历史... 26-12 2004 Microchip Technology Inc. DS31026A_CN 第 26-1 页
PICmicro 中档单片机系列 26.1 简介 看门狗定时器 (WDT) 是一个运行在片内的 RC 振荡器, 它不需要任何的外接元件 图 26-1 为看门狗定时器的结构框图 该 RC 振荡器独立于 OSC1/CLKIN 引脚上的 RC 振荡器 这样, 即使器件的 OSC1 和 OSC2 引脚上的时钟停振 ( 例如执行了 SLEEP 指令 ),WDT 仍将正常工作 有一个器件配置位是控制看门狗定时器 (WDT) 的使能 / 关闭 如果 WDT 被使能, 就不能通过软件关闭此功能 图 26-1: 看门狗定时器的结构框图 来自 TMR0 的时钟信号 WDT 定时器 0 1 多路开关 预分频器 8 8 选 1 多路开关 PS2:PS0 WDT 使能位 PSA 至 TMR0 0 1 多路开关 PSA WDT 超时 注 :PSA 和 PS2:PS0 是 OPTION 寄存器中的位 DS31026A_CN 第 26-2 页 2004 Microchip Technology Inc.
26.2 控制寄存器 第 26 章看门狗定时器与休眠模式 OPTION_REG 寄存器是一个可读写寄存器, 它含有各种控制位, 用来设置 TMR0 预分频器 /WDT 后分频器 外部 INT 中断 TMR0 和 PORTB 弱上拉等 注 : 将预分频器分配给看门狗定时器时, TMR0 寄存器的预分频率为 1:1 寄存器 26-1: OPTION_REG 寄存器 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 RBPU (1) INTEDG T0CS T0SE PSA PS2 PS1 PS0 bit 7 bit 0 26 看门狗定时器与休眠模式 bit 7 bit 6 bit 5 bit 4 bit 3 bit 2:0 RBPU (1) : 弱上拉使能位 1 = 禁止弱上拉 0 = 弱上拉按各个端口锁存器值使能 INTEDG: 中断触发边沿选择位 1 = INT 引脚的上升沿触发中断 0 = INT 引脚的下降沿触发中断 T0CS:TMR0 时钟源选择位 1 = T0CKI 引脚上的外部时钟 0 = 内部指令周期时钟 (CLKOUT) T0SE:TMR0 计数边沿选择位 1 = T0CKI 引脚上的下降沿递增 0 = T0CKI 引脚上的上升沿递增 PSA: 预分频器分配位 1 = 预分频器分配给 WDT 0 = 预分频器分配给 Timer0 模块 PS2:PS0:TMR0 预分频器 /WDT 后分频器比率选择位 位值 TMR0 比率 WDT 比率 000 001 010 011 100 101 110 111 1 : 2 1 : 4 1 : 8 1 : 16 1 : 32 1 : 64 1 : 128 1 : 256 1 : 1 1 : 2 1 : 4 1 : 8 1 : 16 1 : 32 1 : 64 1 : 128 图注 R = 可读位 W = 可写位 U = 未用位, 读为 0 - n = 上电复位时的值 注 1: 一些器件也称此位为 GPPU 有 RBPU 位的器件在 PORTB 上有弱上拉, 有 GPPU 位的器件在 GP 端口有弱上拉 2004 Microchip Technology Inc. DS31026A_CN 第 26-3 页
PICmicro 中档单片机系列 26.3 看门狗定时器 (WDT) 的操作 在正常操作期间, 一次 WDT 超时溢出将产生一次器件复位 如果器件处于休眠状态, 一次 WDT 超时溢出将唤醒器件, 使其继续正常操作 ( 即称作 WDT 唤醒 ) 对 WDTE 设置位清零可以永久性地关闭 WDT 后分频器分配完全是由软件控制, 即它可在程序执行期间随时更改 注 : 为避免发生不可预测的器件复位, 当从 Timer0 预分频器的分配改为 WDT 后分频器的分配时, 必须执行下列指令序列 ( 如例 26-1 所示 ) 即使 WDT 被禁止, 也要执行这个指令序列 在例 26-1 中, 如果需要的预分频值不是 1:1, 就不需要对 OPTION_REG 寄存器做初始修改 如果需要的预分频值是 1:1, 那么先向 OPTION_REG 设置一个非 1:1 的临时预分频值, 在完成其它操作后, 在最后修改 OPTION_REG 时再设置 1:1 的预分频值 这样操作, 主要是因为无法知道 TMR0 预分频器的当前计数值, 而且分频器更改后, 该值将变为 WDT 后分频器的当前计数值, 所以必须遵循示例中的代码顺序 如果没有按照示例中的代码顺序改变 OPTION_REG 寄存器, 那么无法准确得知 WDT 复位前的时间 DS31026A_CN 第 26-4 页 2004 Microchip Technology Inc.
例 26-1: 第 26 章看门狗定时器与休眠模式 预分频器的更改 (Timer0 WDT) 26 BSF STATUS, RP0 ; Bank1 MOVLW B xx0x0xxx ; Select clock source and postscale value MOVWF OPTION_REG ; other than 1:1 BCF STATUS, RP0 ; Bank0 CLRF TMR0 ; Clear TMR0 & Prescaler BSF STATUS, RP0 ; Bank1 MOVLW B xxxx1xxx ; Select WDT, do not change prescale value MOVWF OPTION_REG ; CLRWDT ; Clears WDT MOVLW b'xxxx1xxx' ; Select new prescale value and WDT MOVWF OPTION_REG ; BCF STATUS, RP0 ; Bank0 看门狗定时器与休眠模式 将预分频器从 WDT 改成 Timer0 模块, 可以使用例 26-2 所示的指令序列 例 26-2: 预分频器的更改 (WDT Timer0) CLRWDT ; Clear WDT and postscaler BSF STATUS, RP0 ; Bank1 MOVLW b'xxxx0xxx' ; Select TMR0, new prescale MOVWF OPTION_REG ; value and clock source BCF STATUS, RP0 ; Bank0 2004 Microchip Technology Inc. DS31026A_CN 第 26-5 页
PICmicro 中档单片机系列 26.3.1 WDT 周期 26.3.2 WDT 编程注意事项 WDT 的超时溢出周期在不使用后分频器时的典型值为 18ms 这个周期随着温度 VDD 和制造工艺偏差而不尽相同 ( 见 DC 规范 ) 如果需要更长的超时溢出周期, 可以用软件设置 OPTION_REG 寄存器, 把后分频器分配给 WDT ; 这时最大分频率可达 1:128, 可以实现 2.3s 左右的超时溢出周期 CLRWDT 和 SLEEP 指令将对 WDT 和后分频器 ( 如果分配给 WDT) 清零, 防止其超时而引起器件复位 看门狗定时器超时溢出使 WDT 复位 ( 正常工作状态下 ) 或 WDT 唤醒 ( 休眠状态下 ), 同时状态寄存器中的 TO 位将被清零 在最恶劣的情况下 (VDD 最小 温度最高 WDT 后分频比最大 ), 要过几秒钟 WDT 才会发生超时溢出, 因此在编写程序时要考虑到这一点 注 : 表 26-1: 当后分频器分配给 WDT 时, 在改变后分频值前应务必先执行一条 CLRWDT 指令, 否则可能会发生 WDT 复位 和看门狗定时器有关的寄存器 寄存器名称 bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 配置位 MPEEN BODEN CP1 CP0 PWRTE WDTE FOSC1 FOSC0 OPTION_REG RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 图注 : 阴影部分没有被看门狗定时器使用 DS31026A_CN 第 26-6 页 2004 Microchip Technology Inc.
26.4 休眠省电模式 第 26 章看门狗定时器与休眠模式 执行一条 SLEEP 指令, 器件便进入休眠模式 在这种模式下, 电流消耗降到最低 而且, 器件的振荡器停振, 因此没有系统时钟 在执行 SLEEP 指令时, 如果看门狗定时器是使能的, 将把看门狗定时器的当前记数值清零, 使其由零重新记数运行, 同时状态寄存器 STATUS 的 PD 位将被清零, TO 位将被置 1, 振荡器停振 I/O 端口保持执行 SLEEP 指令之前的状态 ( 高电平 低电平或高阻状态 ) 在休眠模式下, 为了使电流消耗降至最低, 所有 I/O 引脚应保持为 VDD 或 VSS 电平, 不要有拉电流输出, 同时应关闭休眠模式下可能消耗电流的功能模块 为了避免悬浮输入引起的开关电流, 应拉高或拉低高阻输入的 I/O 引脚 将 T0CKI 的输入设置为 VDD 或 VSS 电平也可降低电流消耗 还要考虑到 PORTB 内部上拉的影响 MCLR 引脚必须处于逻辑高电平 (VIHMC) 利用器件配置位使能器件的某些功能部件 ( 如看门狗定时器 (WDT) 和欠压复位 (BOR) 电路模块 ) 时, 休眠模式下可能会多消耗一定量的电流, 而在配置位中关闭该部件时也就关闭了该类电流的消耗 26 看门狗定时器与休眠模式 26.4.1 唤醒 下列事件之一可唤醒器件 : 1. 器件复位 2. 看门狗定时器唤醒 ( 如果 WDT 被使能 ) 3. 可以在休眠模式下设置中断标志的外设模块, 如 : - 外部 INT 引脚 - 端口引脚上的电平变化 - 比较器 - A/D - Timer1 - LCD - SSP - 捕捉第一种事件会在唤醒器件使器件复位, 而后两种事件仅是唤醒器件, 然后让程序继续正常运行 状态寄存器 STATUS 中的 TO 和 PD 位可用来确定器件复位的原因 PD 位在上电时被置 1, 当执行 SLEEP 指令时被清零 如果发生 WDT 唤醒, 则 TO 位被清零 在执行 SLEEP 指令时, 下一个指令 (PC + 1) 被预先取出 当通过中断事件唤醒器件时, 相应的中断使能位必须置 1 ( 使能 ) 唤醒与 GIE 位的状态无关 如果 GIE 位清零 ( 禁止中断响应 ), 器件将继续执行 SLEEP 后面的指令 如果 GIE 位被置 1 ( 使能 ), 则器件在执行 SLEEP 之后的一条指令后, 将跳转到中断地址 (0004h) 如果不希望执行 SLEEP 指令之后的指令, 应该在 SLEEP 指令之后加一个 NOP 指令 2004 Microchip Technology Inc. DS31026A_CN 第 26-7 页
PICmicro 中档单片机系列 26.4.2 中断唤醒 即使全体中断都被禁止 (GIE 位清零 ), 对于任何中断源, 只要它的中断使能位和中断标志位都置 1, 就会发生下列事件之一 : 在执行 SLEEP 指令前, 发生了中断,SLEEP 指令将作为一个 NOP 指令来执行 因此,WDT 和 WDT 后分频器将不会被清零, TO 位不会被置 1, PD 位也不会被清零 在 SLEEP 指令执行时或执行后, 发生了中断, 器件将立即被唤醒 SLEEP 指令将在唤醒之前完成执行 因此, WDT 和 WDT 后分频器将被清零, TO 位将被置置 1, PD 位将被清零 即使执行 SLEEP 指令之前, 检验了标志位, 它也可能在 SLEEP 指令完成之前被置 1 要确定是否执行了 SLEEP 指令, 可以检测 PD 位 如果 PD 位为 1, 说明 SLEEP 指令被作为一个 NOP 指令来执行而并没有真正执行 在 SLEEP 指令之前, 先执行一条 CLRWDT 指令, 可以确保在进入休眠模式时 WDT 已被清零 OSC1 CLKOUT (4) 图 26-2: 中断唤醒的时序图 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 TOST(2) INT 引脚 INTF 标志 (INTCON<1>) 中断响应延迟 (2) GIE 位 (INTCON<7>) 单片机休眠 指令流 PC PC PC+1 PC+2 PC+2 PC + 2 0004h 0005h 取指令 Inst(PC) = SLEEP Inst(PC + 1) Inst(PC + 2) Inst(0004h) Inst(0005h) 执行指令 Inst(PC - 1) SLEEP Inst(PC + 1) 哑周期 哑周期 Inst(0004h) 注 1: 假设工作在 XT HS 或 LP 振荡器模式 2: TOST = 1024TOSC ( 图中未按比例画出 ); 若为 RC 振荡模式, 该延时将不在此时段 3: 假设 GIE = '1' 在这种情况下, 单片机被唤醒后, 将跳至中断程序 如果 GIE = '0', 将在这一行继续执行 4: 在这些振荡器模式下, CLKOUT 信号无效, 在这里仅作为时间基准显示出来 DS31026A_CN 第 26-8 页 2004 Microchip Technology Inc.
26.5 初始化 当前没有初始化代码 第 26 章看门狗定时器与休眠模式 26 看门狗定时器与休眠模式 2004 Microchip Technology Inc. DS31026A_CN 第 26-9 页
PICmicro 中档单片机系列 26.6 设计技巧 问 1: 器件的工作电压先是下降, 然后又回到正常电压范围内 此时器件不再正常工作, 而 WDT 并没有复位单片机而使其正常工作 为什么会这样? 答 1: WDT 的设计并没有使其在欠压后具备恢复功能 在正常工作范围内,WDT 只能从软件操作错误中恢复 如果是欠压问题, 应使能片内欠压电路或运用外部欠压电路 问 2: 为什么在程序循环体内执行了 CLRWDT 指令, 器件仍然会复位? 答 2: 带 CLRWDT 指令的循环体的执行时间应小于 WDT 的最小超时溢出时间, 而不是典型超时溢出时间 问 3: 器件不能从复位状态中跳出 答 3: 在上电期间, 必须考虑到振荡器的上电延迟时间 (Tost) 因为上电延迟时间可能有差异, 最好将 CLRWDT 指令放在程序循环体的开始处 DS31026A_CN 第 26-10 页 2004 Microchip Technology Inc.
26.7 相关应用笔记 第 26 章看门狗定时器与休眠模式 本部分列出了与本章内容相关的应用笔记 这些应用笔记并非都是专门针对中档单片机系列而写的 ( 即有些针对低档系列, 有些针对高档系列 ), 但是其概念是相近的, 通过适当修改并受到一定限制, 即可使用 目前与看门狗定时器和休眠模式相关的应用笔记有 : 标题 应用笔记 # Power-up Trouble Shooting AN607 26 看门狗定时器与休眠模式 2004 Microchip Technology Inc. DS31026A_CN 第 26-11 页
PICmicro 中档单片机系列 26.8 版本历史版本 A 这是描述看门狗定时器和休眠模式的初始发行版 DS31026A_CN 第 26-12 页 2004 Microchip Technology Inc.