RP2040 内置看门狗的工作机制:树莓派 Pico WDT 时钟、计数器与寄存器详解
树莓派 Pico 的板载 RP2040 芯片内置了一个硬件看门狗定时器(WDT)外设:

树莓派 Pico 的内置看门狗外设挂载到了 APB 总线上
RP2040 的看门狗定时器有一个 24 位的计数器,计数器的最大值为 0xFFFFFF(即 16,777,215)。
1.看门狗时钟输入
在 RP2040 微控制器中,看门狗定时器(WDT)使用的参考时钟 clk_tick 由 clk_ref 驱动:
- 理想情况下,
clk_ref会配置为使用晶体振荡器 clk_ref在内部被分频,以生成一个看门狗时钟clk_tick,这个时钟用于驱动看门狗定时器的计时功能

clk_tick 的周期通常为 1 微秒(μs),这意味着看门狗定时器以 1 微秒的时间间隔进行计时,从而能够精确地监测系统的运行状态。
我们可以通过配置 TICK 寄存器来设置时钟分频比和调整看门狗计时器的时间间隔:

2.看门狗定时器的复位
看门狗定时器通过 rst_n_run 信号复位,当数字核心电源(DVDD)被供电且稳定,并且 RUN 引脚为高电平时,rst_n_run 信号被激活,看门狗定时器进行复位。
rst_n_run 是一个复位信号,与芯片的电源管理和复位控制逻辑密切相关,前面在介绍树莓派 Pico 时我们提到了上电状态机的基本概念:RP2040 的上电状态机负责按特定的顺序去除芯片内部各个硬件模块的复位状态,这个过程确保每个模块在启动时按照正确的顺序初始化,避免在复位期间出现冲突或错误。

上电状态机重启顺序表
每个模块的复位由内部 rst_n 信号控制,并且每个模块在完成复位后会产生一个 rst_done 高电平有效的复位完成信号。上电状态机会等待每个模块的 rst_done 信号,确保所有模块都正确复位后,才会继续到下一个模块。上电状态机完成对所有模块的复位操作后,rst_n_run 信号被用来退出特定的复位状态。这个信号通常用于需要在启动时初始化但在上电状态机复位期间不需要重置的模块,例如环形振荡器、晶体振荡器中的逻辑电路,以及需要持续运行的时钟分频器和看门狗定时器。
3.看门狗计数器
在 RP2040 微控制器的看门狗定时器中,计数器的操作涉及 LOAD 寄存器和 CTRL 寄存器中的 TIME 数据位:
LOAD寄存器用于设置看门狗计数器的初始值:

CTRL.TIME数据位用于显示当前看门狗计数器的值:

这里,需要注意的是由于逻辑错误(如 RP2040-E1 错误说明中所提到的),看门狗计数器在每个 clk_tick 周期中被递减了两次,这意味着实际的倒计时周期是预期的一半,因此,当设置 LOAD 寄存器的值为 0xffffff 时(即 16,777,215),实际上看门狗定时器将在 0xffffff / 2 个 clk_tick 周期后触发复位。
由于一个 clk_tick 的周期通常为 1 微秒(μs),那么计数器最大值对应时间为:
16,777,215/(2*1,000,000)s = 8.388 s = 8388 ms
这意味着看门狗定时器的定时范围为 1us 到 500ms 左右。
同时我们可以控制 CTRL 寄存器的 PAUSE_DBG1、PAUSE_DBG0 和 PAUSE_JTAG 数据位,来在处理器 0 与处理器 1 进入调试模式或是使用 JTAG 调试接口访问总线时暂停看门狗定时器,避免看门狗定时器对调试过程的干扰。
我们也可以访问 REASON 寄存器来获取上一次复位的原因:

来判断上一次复位是由于看门狗定时器触发的强制复位,还是由于看门狗定时器超时或硬件复位引起的:
- 当寄存器中的两个位(
FORCE和TIMER)均为 0 时,表示上一次复位是由硬件复位触发的 - 如果
FORC位为 1,表示看门狗定时器通过控制CTRL寄存器的TRIGGER位发出了强制复位信号 - 如果
TIMER位为 1,表示复位是由于看门狗定时器超时引起的
4.Scratch 寄存器与魔术数
RP2040 微控制器的看门狗定时器包括八个 32 位的 scratch 寄存器,这些寄存器可以在芯片软重置间存储信息:


当 rst_n_run 信号被触发(例如通过切换 RUN 引脚或重新上电数字核心电源 DVDD)时,这些寄存器会被重置为初始状态。
在非电源复位(Non-POR)或非引导复位(Non-BOR)情况下,用户可以使用这些寄存器来指定特定的引导代码。Bootrom 会在启动时检查这些寄存器中的特定“魔数”(magic number),从而决定是否执行用户自定义的启动代码。
这里,“魔数”(magic number)是一种用于验证数据完整性、标识数据格式或确认文件结构的特殊值:
- 看门狗定时器的 Scratch 寄存器中使用了魔数来决定是否执行特定的引导代码
- 这使得用户能够安装自己的启动处理程序,并在非电源复位时跳过主启动序列
其中:
- Scratch 4:存储魔数
0xb007c0d3 - Scratch 5:存储入口点(Entry Point)与魔数
0xb007c0d3异或后的值,具体为0x4ff83f2d - Scratch 6:存储栈指针(Stack Pointer)
- Scratch 7:存储入口点(Entry Point)
Bootrom 会检查 Scratch 4 和 Scratch 5 中的魔数值:如果这些值匹配,Bootrom 会将 Scratch 4 清零,并将控制权转移到指定的代码段;如果魔数值不匹配,Bootrom 不会执行用户自定义的引导代码,系统将按照默认的引导顺序进行启动。通过这种机制,用户可以在系统启动时控制执行特定的代码或进行系统调试,这对于系统的测试和调试非常有用。

当 `rst_n_run` 信号被触发(例如通过切换 RUN 引脚或重新上电数字核心电源 DVDD)时,这些寄存器会被重置为初始状态。
浙公网安备 33010602011771号