我有一个PIC32复位功能:
void reset_cpu(void)
{
WDTCON=0x8000;
EnableWDT(); // enable the WDT
ClearWDT();
while(1){};
}
它适用于PIC32MX360F512L,但不适用于PIC32MX695F512L。它只会永远旋转。任何人都可以告诉我为什么,或建议另一种方法来重置我的处理器?
答案 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"
)。
我还会检查您如何设置设备配置位。可以在看门狗上设置非常长的超时。