我在 MPC875 cpu 上使用软件看门狗定时器时遇到问题:
定时器触发复位信号非常快:在打开定时器和接收复位信号之间,我得到的时间不到半秒,尽管我在启用预分频的情况下将倒计时值 (SWTC) 设置为最大值。
这是我的做法(JTAG 脚本):
CF TAR 875
CF GRP 400F
INN
SR PLPRCRK 0x55CCAA33
SR PLPRCR 0x1A4D5000 ; Configure Phase-Lock Loop
SR SCCRK 0x55CCAA33
SR SCCR 0xF47F0002 ; Configure System Clock
SR SYPCR 0xFFFFFF87 ; Enable the Software Watchdog Timer
SR SWSR 0x556c ; Reset the timer
SR SWSR 0xaa39
SR SWSR 0x556c
SR SWSR 0xaa39
SR SWSR 0x556c
SR SWSR 0xaa39
SR SWSR 0x556c
SR SWSR 0xaa39
SR SWSR 0x556c
SR SWSR 0xaa39
SR SWSR 0x556c
SR SWSR 0xaa39
SR SWSR 0x556c
SR SWSR 0xaa39 ; The HRESET issued after few moments from this point
SR SWSR
启用预分频(SYPCR 中的 SWP 位)后,它会在最后一次计数器复位(最新命令)后大约半秒内断言 HRESET 信号。如果我禁用预分频器,HRESET 信号甚至在第一次修改 SWSR 寄存器之前就断言(非常短的时间)。因此,Timer 似乎以某种方式响应了设置更改,但它的计时有问题。
系统时钟和锁相环应该配置正确,因为我们在已经建立和运行的应用程序(在 VxWorks 之上)上获得了相同的配置,但看门狗定时器关闭。
我还尝试清除 SYPCR 寄存器中的 SWF 位,以防止在 JTAG 停止 cpu 时计时器计数(通过断言 FRZ 信号):然后它仅在我退出中断/步进模式之前工作,当我运行应用程序时,重置发生在很短的时间。
根据参考手册,定时器的工作方式如下:
有一个递减计数器,当它达到零时,电路断言 HRESET 信号或引发系统复位中断。计数器有两个字节长,可选择预分频因子 2048。它以系统时钟除以 2048 的速率递减。因此,启用预分频器和最大计数器值的预期超时1 / (80MHz / 2048) * (65535 * 2048)
约为 3435 秒。在禁用预分频器的情况下,它应该是大约 1.7 秒。实际值要小得多:预分频计数器约为 0.5 秒,而预分频器关闭时则小得多(甚至无法测量)。
根据图表,SWT 仅依赖于 Core Clock 和 SYPCR 寄存器,这里是寄存器描述:
我将值设置为 0xFFFFFF87 (实际上尝试了不同的选项),这意味着:
- SWTC:0xFFFF(定时器计数,最大值在将魔术序列写入 SWSR 寄存器时加载到内部递减计数器(见图))。
- BMT:0XFF(总线监控定时器计数,最大值)
- BME:1(总线监视器已启用,并且没有必要关闭该位,因为无论配置的值如何,它始终使用 JTAG 启用)。
- SWF:0(即使在 JTAG 断言 FRZ 信号时,定时器也会计数)。
- SWE:1(看门狗已启用)。
- SWRI:1(配置为断言 HRESET,切换到 NMI 没有帮助)。
- SWP:1(SWTC 预标定系数为 2048)。
有什么建议么?