看門狗定時器(WDT)是嵌入式系統防止程式跑飛的關鍵機制。在 PIC 系列單片機上,C 語言「喂狗」的具體寫法取決於晶片系列與編譯器。本文整理各主流平台的標準做法。
| PIC 系列 | 位元架構 | 常用編譯器 | 標準喂狗宏/函式 | 頭檔位置 |
|---|---|---|---|---|
| PIC10/12/16 | 8-bit 基礎/中階 | XC8 (HTC 相容) | CLRWDT(); | <xc.h> / htc.h |
| PIC18 | 8-bit 高階 | XC8 / C18 | CLRWDT(); | <xc.h> / p18fxxxx.h |
| PIC24 / dsPIC30/33 | 16-bit | XC16 / C30 | ClrWdt(); | <xc.h> 或自行定義 |
| PIC32 | 32-bit (MIPS) | XC32 | WDTCONSET = 0x01; 或 CLRWDT() | <xc.h> |
#include // 必含,定義 CLRWDT()
void main(void) {
// 設定 WDT 相關 Configuration bits(依資料表)
while (1) {
CLRWDT(); // 標準宏,展開為 CLRWDT 指令
// 主迴圈任務...
}
}
⚠️ 舊版 HI-TECH C 使用 htc.h,新專案請改用 XC8 的 xc.h。
XC16 標頭檔可能未預定義 ClrWdt(),常見做法自行定義內嵌組語:
#define ClrWdt() __builtin_clrwdt() // XC16 內建函式(推薦)
// 或手動內嵌組語:
// #define ClrWdt() { __asm__ volatile ("clrwdt"); }
// 方式 1:使用周邊庫函式
#include
WDTClear(); // 需先啟用 WDT 並設定時脈
// 方式 2:直接操作暫存器
WDTCONSET = _WDTCON_WDTCLR_MASK; // 寫 1 清除計數器
asm("CLRWDT"); // 直接插入 CLRWDT 指令,無函式呼叫開銷
喂狗前必須在 Configuration Bits 啟用 WDT 並設定適當週期:
FWDTEN = ON(硬體啟用)或程式中 WDTCONbits.SWDTEN = 1(軟體啟用)。WDTPS:分頻比(如 1:32768 ≈ 4 秒 @ 32 kHz LPRC)。FWDTEN / WINDIS 設定)。undefined reference to CLRWDT。Stopwatch 驗證 WDT 復位週期。Windowed WDT(支援機種)限制喂狗時間窗,提升安全性。