Community生產力與協作github.com

PIC 與 dsPIC 韌體開發 (MPLAB X + XC + MCC; PICkit / Snap / ICD)

Microchip PIC 與 dsPIC 韌體開發,涵蓋 MPLAB X IDE、XC8/XC16/XC-DSC/XC32 編譯器及 MPLAB Code Configurator (MCC Melody/Classic),支援 PIC16、PIC18、PIC24、dsPIC33 (F/EP/EV/CK/CH 雙核心/A) 與 PIC32 — 包含組態位元、振盪器/PLL、TRIS/LAT/PORT/ANSEL、PPS、中斷、8/16 位元原子操作與硬體堆疊限制、dsPIC DSP 引擎與 Q15 定點數、高速 PWM/ADC 控制迴路、馬達控制與數位電源、XC8 記憶體與最佳化、無頭建置、使用 PICkit 4/5、MPLAB Snap 與 ICD (ipecmd) 進行燒錄與除錯、重設原因與陷阱中斷。每當使用者提及任何 PIC 或 dsPIC 元件 (PIC16F、PIC18F、PIC24F、dsPIC33EP/CK/CH、PIC32MX/MZ)、MPLAB X、MCC、XC8/XC16/XC-DSC/XC32、PICkit、Snap、ICD、`#pragma config`、motorBench 或 .X 專案資料夾時,都應使用此技能。

Snap / ICD) 是什麼?

這是一套專為 Microchip PIC 與 dsPIC 系列微控制器設計的完整韌體開發技能,整合 MPLAB X IDE、XC 系列編譯器 (XC8/XC16/XC-DSC/XC32) 與 MPLAB Code Configurator (MCC Melody/Classic)。它適用於所有常見 PIC 與 dsPIC 系列 (PIC16、PIC18、PIC24、dsPIC33 與 PIC32),並提供詳細的規則來避免常見的開發陷阱:例如數位輸入因 ANSEL 位元讀取為 0、正確使用 LAT 與 PORT 暫存器、周邊引腳選擇 (PPS) 的配置、組態位元設定、8 位元原子操作以及硬體堆疊限制等。 對於 dsPIC33 系列,此技能更深入涵蓋 DSP 引擎、Q15 定點數運算、控制迴路設計 (PWM 觸發 ADC 中斷)、故障輸入保護與雙核心架構 (dsPIC33CH) 等進階主題。技能也提供無頭建置、使用 ipecmd 命令列燒錄與除錯的完整指引,並針對常見問題 (如無法啟動、時脈錯誤、隨機重設) 提供系統性的故障排除步驟。最後,它引用一系列參考檔案 (`references/families.md`、`references/dspic33.md`、`references/mcc-and-project.md`、`references/build-program-debug.md`) 以提供更詳盡的家族特定語法、專案結構與工具鏈資訊。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/budenga/firmware-skills/tree/HEAD/skills/pic-firmware

Installed? Explore more 生產力與協作 skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

PIC & dsPIC 韌體 (MPLAB X + XC + MCC;PICkit / Snap / ICD)

也請載入 embedded-c-cpp 以取得編碼標準、架構、單元測試與一般除錯的支援。此技能包含 Microchip 特有部分。PIC 韌體使用 C 語言撰寫 (XC8 不支援 C++)。

首先,識別專案

尋找項目位置為何重要
確切元件 (PIC16F18877、PIC18F47Q10、PIC24FJ128GA010、dsPIC33CK256MP508、PIC32MX795F512L...)nbproject/configurations.xml (<targetDevice>)、MCC .mc3、使用者暫存器、周邊、PPS、中斷模型、記憶體皆因元件而異——在 dsPIC33 上,F、E、C 與 A 系列具有不同的 PWM/ADC/PLL 模組
編譯器 + 版本configurations.xml (<languageToolchain>、<languageToolchainVersion>)XC8 對比 XC16 對比 XC-DSC (dsPIC) 對比 XC32;最佳化層級與語法有所不同
MCC 版本mcc_generated_files/ 佈局、.mc3 檔案;Melody (較新:system/、timer/ 子資料夾、*_Initialize) 對比 Classic組態位元與驅動程式的存放位置、API 名稱
時脈MCC 時脈設定 / #pragma config (FEXTOSC、RSTOSC / FNOSC / POSCMOD)、_XTAL_FREQ 或 FCY 定義延遲、鮑率、計時器週期
燒錄器/除錯器PICkit 4/5、MPLAB Snap、ICD 4/5電源與高壓燒錄能力

當不確定某個暫存器或位元名稱時,請說明應查閱哪個資料表章節 (或讀取編譯器包含目錄中的裝置標頭檔 pic16f18877.h 等),而不是猜測——PIC 暫存器名稱因子系列而異。

防止經典 PIC 故障的規則

  1. 數位輸入讀取為 0 → ANSEL。 在大多數現代 PIC 上,引腳預設上電為 類比。清除每個數位輸入的 ANSELx 位元 (MCC:取消勾選「Analog」)。
  2. 寫入 LATx,讀取 PORTx。 寫入 PORTx 位元會對引腳電平進行讀取-修改-寫入,可能翻轉其他輸出 (大負載、快速切換)。沒有 LAT 暫存器的元件需要影子變數。
  3. TRIS:1 = 輸入,0 = 輸出。 容易搞反。
  4. 周邊引腳選擇 (PPS) 必須將 UART/SPI/PWM 訊號映射到 PPS 裝置的引腳上;若 PPS1WAY = ON,則重設後只能解鎖一次——讓 MCC 產生此設定。
  5. 組態位元 決定振盪器、看門狗、MCLR、LVP、欠壓偵測、程式碼保護。在 MCC (或 Configuration Bits 視窗 → Generate Source Code) 中設定它們,切勿保留未經檢查的預設值。錯誤的振盪器 = 無法運作或所有時序皆偏離。
  6. _XTAL_FREQ (XC8) / FCY (XC16) 必須等於實際時脈——__delay_ms() 與許多計算依賴於此。
  7. 8 位元原子操作:在 PIC16/18 上,任何與 ISR 共用的 uint16_t/uint32_t 都是在數個指令中讀取的——請在讀取前停用該中斷 (或 GIE)。在 PIC24/dsPIC 上,同樣適用於 32 位元數值。
  8. 硬體呼叫堆疊非常小:8 位元 PIC 上 (舊 PIC16 有 8 層,增強型 PIC16F1 有 16 層,PIC18 有 31 層),且 ISR 也會使用層級。禁止遞迴;注意 XC8 警告 (1393) possible hardware stack overflow 以及建置輸出中的估計深度。
  9. 中斷旗標:在 ISR 中,同時檢查致能位元與旗標位元 (if (PIEx.xIE && PIRx.xIF)),清除旗標,保持簡短。致能周邊中斷 + 全域中斷 (MCC:INTERRUPT_GlobalInterruptEnable())。
  10. MCC 重新產生會覆寫 mcc_generated_files/。 將應用程式程式碼放在您自己的 .c/.h 檔案中;保持 main.c 精簡;審閱 MCC 合併對話方塊,而非盲目接受。
  11. 不可逆轉 / 有風險的設定:程式碼保護 (CP)、寫入保護、同時關閉 MCLR 與 LVP、可能停止晶片的振盪器設定。未經明確確認,請勿在用戶的裝置上啟用程式碼保護或更改這些設定;Snap 無法復原需要高壓燒錄的元件。

家族特定語法 (中斷、延遲、組態、記憶體):references/families.md。

dsPIC33 (控制、DSP、馬達控制、數位電源)

dsPIC33 使用 PIC24 核心語法加上 DSP 引擎。額外規則:

  • FCY = FOSC/2;PLL 設定與時脈切換因家族而異 (EP 對比 CK/CH)——使用 MCC 產生並驗證報告的頻率,包括驅動 PWM/ADC 的輔助時脈。
  • 在快速迴圈中使用 Q15 定點數 (DSP 函式庫 dsp.h、libq.h、內建函式) 而非 float;記錄每個變數的縮放比例。
  • 在 C 中明確限制積分器與輸出——標準 C 算術會繞回;CORCON 飽和僅保護 DSP 引擎操作。
  • 控制迴路 = 高優先級的 PWM 觸發 ADC 中斷;在示波器上測量其執行時間。
  • 在啟用任何功率級輸出之前,先配置 PWM 故障/電流限制輸入,並先在低電壓下測試死區時間——錯誤的 PWM 程式碼會破壞硬體。
  • 啟用災難性累加器溢位陷阱 (COVTE);對於一般 MAC 程式碼保持 OVATE/OVBTE 關閉 (保護位元預期會被使用)。
  • dsPIC33CK/CH 交替暫存器組使用 __attribute__((interrupt, context)) 並搭配匹配的 ISR 優先級——而非 shadow。
  • dsPIC33CH 為雙核心:兩個專案、引腳所有權、MSI 信箱。

詳細資訊:references/dspic33.md。

建置、燒錄、除錯

動作方法
在 IDE 中建置MPLAB X → Clean and Build (錘子+掃帚)。檢查輸出中的 Memory Summary 與警告
無頭建置prjMakefilesGenerator.sh <proj>.X@default 然後 make -C <proj>.X CONF=default → dist/default/production/<proj>.X.production.hex
燒錄MPLAB X「Make and Program Device」、MPLAB IPE,或從命令列使用 ipecmd
除錯MPLAB X Debug Main Project 搭配 PICkit/Snap/ICD (除錯建置),或 MPLAB X Simulator 用於純邏輯/計時器 (無需硬體)

燒錄會變更裝置:在執行 ipecmd 之前,請先與用戶確認元件與燒錄器,並且未經確認絕不進行清除或保護。完整命令、燒錄器差異與連接故障排除:references/build-program-debug.md。

當它不工作時

  • 無法運作:組態位元 (振盪器來源、WDT、MCLR)、電源、MCLR 上拉電阻 (10 kΩ)、燒錄器已從重設狀態釋放裝置 (IPE「Release from Reset」/ -OL)。
  • 以錯誤速度執行 / 錯誤鮑率:RSTOSC/FNOSC、PLL、時脈分頻器 (CDIV)、_XTAL_FREQ 不匹配。
  • 隨機重設:在開機時讀取重設原因位元 (PCON/PCON0/RCON——references/families.md)、看門狗未清除、堆疊溢位 (STKOVF)、欠壓。
  • PIC24/dsPIC 突然重設或當機:安裝陷阱處理程式 (_AddressError、_StackError、_MathError、_OscillatorFail)——位址錯誤通常表示未對齊的 16 位元存取。

參考檔案

檔案何時閱讀
references/families.md針對特定家族撰寫/審閱程式碼時:中斷語法、延遲、組態位元、記憶體模型、原子操作、重設原因、陷阱、PIC32 快取/DMA、XC8 最佳化與記憶體提示
references/dspic33.md任何 dsPIC33 工作:家族、XC-DSC、PLL/時脈切換、DSP 引擎與 Q15 數學、ISR context/shadow 暫存器、數學陷阱、DMA、高速 PWM/ADC 控制迴路、雙核心 CH、motorBench/電源工具、審查清單
references/mcc-and-project.md專案結構、MCC Melody 對比 Classic、重新產生規則、放置程式碼的位置、周邊驅動程式 (UART、I2C、ADC、計時器、PWM、NVM/EEPROM)、低功耗
references/build-program-debug.md安裝工具、無頭建置、ipecmd 燒錄、PICkit/Snap/ICD 差異、除錯限制、「無法連接 / 裝置 ID 不匹配」故障排除、在 PC 上對 PIC 程式碼進行單元測試

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

esp32-firmware

ESP32 firmware with PlatformIO — Arduino framework (primary) and ESP-IDF (also inside PlatformIO, or Arduino as an IDF component) — for ESP32, S2, S3, C3, C6. Covers platformio.ini setup, Arduino core 2.x vs 3.x API differences, safe pin selection (strapping/flash/PSRAM/ADC2 pins), FreeRTOS tasks and ISRs, memory/PSRAM, Wi-Fi/BLE, NVS/Preferences, OTA, deep sleep, partitions, flashing over USB/serial, decoding Guru Meditation panics and boot loops. Use this skill whenever the user works on any ESP32 / ESP32-S3 / C3 / C6 board, platformio.ini with espressif32, Arduino sketches for ESP32, idf.py/sdkconfig, or pastes ESP32 serial output (rst:, Guru Meditation, Brownout, watchdog) — even if they only say "a placa reinicia" or "o upload falha". Use together with embedded-c-cpp for general C/C++ quality, testing and architecture.

stm32-firmware

STM32 firmware development with STM32CubeMX / STM32CubeIDE + HAL/LL and with PlatformIO — project structure and USER CODE rules, peripherals (UART/I2C/SPI/ADC/timers/DMA), clocks, low power, flash/option bytes, building from the command line, flashing and debugging with ST-Link (STM32CubeProgrammer CLI, OpenOCD, GDB, SWV), and HardFault analysis. Use this skill whenever the user works on any STM32 / Nucleo / Discovery / Blue Pill board, a `.ioc` file, CubeMX/CubeIDE, HAL_ functions, ST-Link, or sees a HardFault — even if they just say "o meu STM32 não arranca" or paste a HAL call. Use together with embedded-c-cpp for general C/C++ quality, testing and architecture.

相關技能