首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

PIC 單片機 C 語言喂狗完全指南:各系列編譯器對照表與嵌入組語寫法

     編輯:關於C語言
 

看門狗定時器(WDT)是嵌入式系統防止程式跑飛的關鍵機制。在 PIC 系列單片機上,C 語言「喂狗」的具體寫法取決於晶片系列與編譯器。本文整理各主流平台的標準做法。

快速對照表

PIC 系列位元架構常用編譯器標準喂狗宏/函式頭檔位置
PIC10/12/168-bit 基礎/中階XC8 (HTC 相容)CLRWDT();<xc.h> / htc.h
PIC188-bit 高階XC8 / C18CLRWDT();<xc.h> / p18fxxxx.h
PIC24 / dsPIC30/3316-bitXC16 / C30ClrWdt();<xc.h> 或自行定義
PIC3232-bit (MIPS)XC32WDTCONSET = 0x01; 或 CLRWDT()<xc.h>

各平台詳細寫法

1. PIC10/12/16/18 系列(XC8 編譯器)

#include    // 必含,定義 CLRWDT()

void main(void) {
    // 設定 WDT 相關 Configuration bits(依資料表)
    while (1) {
        CLRWDT();          // 標準宏,展開為 CLRWDT 指令
        // 主迴圈任務...
    }
}

⚠️ 舊版 HI-TECH C 使用 htc.h,新專案請改用 XC8 的 xc.h。

2. PIC24 / dsPIC(XC16 編譯器)

XC16 標頭檔可能未預定義 ClrWdt(),常見做法自行定義內嵌組語:

#define ClrWdt()  __builtin_clrwdt()   // XC16 內建函式(推薦)
// 或手動內嵌組語:
// #define ClrWdt() { __asm__ volatile ("clrwdt"); }

3. PIC32(XC32 編譯器)

// 方式 1:使用周邊庫函式
#include 
WDTClear();   // 需先啟用 WDT 並設定時脈

// 方式 2:直接操作暫存器
WDTCONSET = _WDTCON_WDTCLR_MASK;  // 寫 1 清除計數器

4. 通用嵌入組語寫法(所有 8-bit PIC)

asm("CLRWDT");   // 直接插入 CLRWDT 指令,無函式呼叫開銷

關鍵配置位元

喂狗前必須在 Configuration Bits 啟用 WDT 並設定適當週期:

  • FWDTEN = ON(硬體啟用)或程式中 WDTCONbits.SWDTEN = 1(軟體啟用)。
  • WDTPS:分頻比(如 1:32768 ≈ 4 秒 @ 32 kHz LPRC)。
  • 睡眠模式下 WDT 是否繼續運作(FWDTEN / WINDIS 設定)。

常見錯誤與除錯技巧

  • ❌ 忘記包含正確頭檔 → 編譯錯誤 undefined reference to CLRWDT。
  • ❌ 中斷服務常式 (ISR) 過長導致主迴圈無法及時喂狗 → 將喂狗移入高優先級定時器中斷或獨立任務。
  • ✅ 使用 MPLAB X 模擬器的 Stopwatch 驗證 WDT 復位週期。
  • ✅ 開啟 Windowed WDT(支援機種)限制喂狗時間窗,提升安全性。
 
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved