assembly - 软件看门狗定时器复位 MPC875 CPU 过快

标签 assembly embedded hardware powerpc watchdog

我在 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

启用预分频(SYPCR 中的 SWP 位)后,它会在最后一次计数器重置(最新的 SR SWSR 命令)后大约半秒内发出 HRESET 信号。如果我禁用预分频器,甚至在第一次修改 SWSR 寄存器之前(非常短的时间),HRESET 信号就会断言。因此,似乎计时器以某种方式响应设置更改,但时间有问题。

系统时钟和锁相环应该配置正确,因为我们在已经建立和运行的应用程序(在 VxWorks 之上)上获得相同的配置,但看门狗定时器关闭。

我还尝试清除 SYPCR 寄存器中的 SWF 位,以防止在 JTAG 停止 cpu 时定时器计数(通过断言 FRZ 信号):然后它仅在我退出中断/步进模式之前有效,当我运行应用程序时重置发生在很短的时间内。

根据引用手册,定时器按以下方式工作:

MPC885 Software Watchdog Timer diargram

有一个递减计数器,当它达到零时,电路会发出 HRESET 信号或引发系统复位中断。计数器有两个字节长,可选择按 2048 倍进行预分频。它以系统时钟除以 2048 的速率递减。因此启用预分频器和最大计数器值的预期超时为 1/(80MHz/2048) * (65535 * 2048) 大约是 3435 秒。在禁用预分频器的情况下,它应该约为 1.7 秒。实际值要小得多:预分频计数器大约 0.5 秒,预分频器关闭时更小(甚至无法测量)。

根据图表,SWT 仅依赖于 Core Clock 和 SYPCR 寄存器,这里是寄存器描述:

MPC885 System Protection Control Register - diagram MPC885 System Protection Control Register - fields descriptions

我设置的值为 0xFFFFFF87(实际上尝试了不同的选项),这意味着:

  • SWTC:0xFFFF(定时器计数,在将魔术序列写入 SWSR 寄存器时将最大值加载到内部递减计数器(见图))。
  • BMT:0XFF(Bus Monitor Timer Count,最大值)
  • BME:1(启用总线监视器,没有必要关闭该位,因为无论配置值如何,它始终通过 JTAG 启用)。
  • SWF:0(即使 JTAG 断言 FRZ 信号,定时器仍会计数)。
  • SWE:1(看门狗已启用)。
  • SWRI:1(配置为断言 HRESET,切换到 NMI 没有帮助)。
  • SWP:1(SWTC 按 2048 倍预缩放)。

有什么建议吗?

最佳答案

你确定你的公式吗?看起来很奇怪。我希望 1/(80MHz/2048/65536)=1.5 秒是看门狗最大周期的正确值。

关于assembly - 软件看门狗定时器复位 MPC875 CPU 过快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14273159/

相关文章:

使用 PIC 18 PWM 控制直流电机

c++ - OpenGL ES 2.0 在 C++ 中共享 esContext

visual-c++ - 为什么WD Velociraptor不能大大加快我的VC++编译速度?

c# - 通过代码,我怎样才能让硬盘驱动器进入休眠状态

assembly - 汇编语言的汇编和链接步骤

c - 为什么我的 char[30] 堆栈增加到 0x38

assembly - 是否为函数保留的堆栈空间少于四个参数?

c++ - 在 winavr 中需要帮助

C 结构体,其中元素跨越字节边界并放置在下一个字节中

css - 防止烧屏