我有一个 PIC32 复位功能:
void reset_cpu(void)
{
WDTCON=0x8000;
EnableWDT(); // enable the WDT
ClearWDT();
while(1){};
}
它适用于 PIC32MX360F512L,但不适用于 PIC32MX695F512L。它只是永远旋转。谁能告诉我为什么,或者建议另一种方法来重置我的处理器?
如果你使用 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
在查看这两个微控制器的数据表时,没有什么能立即让我印象深刻。不过,我确实有几个建议。
首先,在您的功能中,您正在执行以下操作:
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"
)。
我还将检查您如何设置设备配置位。可以在看门狗上设置很长的超时时间。