PIC32 WDT复位在某些PIC32上无效

时间:2014-05-30 20:26:14

标签: c pic pic32

我有一个PIC32复位功能:

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

它适用于PIC32MX360F512L,但不适用于PIC32MX695F512L。它只会永远旋转。任何人都可以告诉我为什么,或建议另一种方法来重置我的处理器?

2 个答案:

答案 0 :(得分:1)

如果您使用的是plib.h,则只需调用此函数:

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

这有利于触发即时重置。来自reset.h:

  

工作原理:此功能执行以下步骤:

     
      
  • 第1步 - 执行"解锁"序列访问RSWRST寄存器。
  •   
  • 第2步 - 写一个' 1'到RSWRST.SWRST位以设置软件复位。
  •   
  • 步骤3 - 读取RSWRST寄存器必须遵循写入。此操作会触发软件重置,应在下一次重置   时钟周期。
  •   

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

答案 1 :(得分: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")。

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