1

我有一个 PIC32 复位功能:

  void reset_cpu(void)
  {
        WDTCON=0x8000;
        EnableWDT(); // enable the WDT 
        ClearWDT(); 
        while(1){};
  }

它适用于 PIC32MX360F512L,但不适用于 PIC32MX695F512L。它只是永远旋转。谁能告诉我为什么,或者建议另一种方法来重置我的处理器?

4

2 回答 2

1

如果你使用 plib.h,你可以简单地调用这个函数:

void reset_cpu(void)
{
    SoftReset();
    while(1){};
}

这具有触发即时复位的优势。从reset.h:

工作原理:此函数执行以下步骤:

  • 第 1 步 - 执行“解锁”序列以访问 RSWRST 寄存器。
  • 第 2 步 - 将“1”写入 RSWRST.SWRST 位以启用软件复位。
  • 第 3 步 - 必须在写入之后读取 RSWRST 寄存器。此操作触发软件复位,软件复位应在下一个时钟周期发生。

请记住 plib 已过时,很快将从 MPLAB XC32 中删除。新设计值得考虑使用 Harmony:http: //www.microchip.com/mplabharmony

于 2015-03-09T23:49:56.653 回答
0

在查看这两个微控制器的数据表时,没有什么能立即让我印象深刻。不过,我确实有几个建议。

首先,在您的功能中,您正在执行以下操作:

WDTCON=0x8000;
EnableWDT();

如果你看plib.h你会发现它指的是wdt.h. wdt.h您可以看到这只是EnableWDT()一个扩展为以下内容的宏:

WDTCONSET = _WDTCON_WDTCLR_MASK

面具在哪里0x00008000。基本上,您要执行两次相同的操作。只需让宏负责启用它。

此外,由于您正在使用看门狗来重置设备,因此无需清除看门狗。 ClearWDT()只是重置看门狗并使您的while(1)循环运行时间更长。所以,我会这样写你的函数:

void reset_cpu(void)
{
    EnableWDT();
    while(1){};
}

最后,我建议您查看一下以确保您在 IDE 中选择了正确的处理器。我不确定这是否会导致您的问题,但是如果您选择了 PIC32MX360F512L 并尝试在 PIC32MX695F512L 上运行它,您最终可能会得到错误的寄存器定义(假设您使用的是#include "xc.h")。

我还将检查您如何设置设备配置位。可以在看门狗上设置很长的超时时间。

于 2014-05-30T23:55:04.247 回答