Microchip 的 MPLAB 程式碼配置器(MCC)是一款文檔齊全的圖形介面,目的在於簡化微控制器的配置。無需花費數小時查閱規格書並手動配置,即可輕鬆完成配置。
本文將會指出函數註冊( function registration)是連接 MCC 產生的程式碼和程式設計師所編寫的 main.c 程式的關鍵橋樑。這是一個巧妙的解決方案,但同時也是一個容易讓新手程式設計師犯錯的陷阱。正確登記函數後,你的程式碼將不再被 MCC 工具覆蓋。
我們將以 PIC16F13145 Curiosity 評估板為例(圖1)。種子程式可在此處下載。
Digital.X.zip (957.8 KB)
使用 MCC
圖 2 顯示了一個典型的 MCC 項目。在本例中,專案中新增了配置邏輯區塊(CBL)和定時器零(TMR0)。此外,還包含一些系統級設置,例如中斷服務例程以及時脈和引腳配置等。
為了保持本文簡潔,我們將重點放在按下高亮顯示的「生成」按鈕後發生的情況。更多資訊請參閱此頁面。
圖 2:使用 MPLAB 的 MCC 建構的 PIC16 專案配置,其中「生成」按鈕已高亮顯示。
MCC 代碼產生器將資料放在哪裡?
圖 3 顯示了專案文件結構。MCC 產生的程式碼位於已明確標記的 mcc_generated_files 分支中。
關於 MCC 的必須知事項
-
每次按下「生成」按鈕(圖 2)時,MCC 都會覆蓋 mcc_generated_files 中的內容。
-
您將丟失這些文件中已有的所有程式碼,這將非常令人沮喪。
-
此結構之外的文件將不會被修改。例如,main.c 檔案不會被 MCC 修改。
Digital.X.zip (957.8 KB)
圖 3:MPLAB 專案的檔案結構,重點展示 mcc_generated_files 檔案。
如何將 MCC 產生的檔案與 main.c 連結?
這是本文的核心內容。我們不修改 MCC 文件,而是利用 C 語言內建的函數註冊機制。
函數註冊範例。
假設我們有一個函數 Bob(),它在 main() 函數中被呼叫。在機器層面,我們知道函數 Bob 被分配了一個記憶體位址,該位址由程式計數器控制。我們可以使用函數指標將 Bob 重定向到 Alice() 函數。現在,當我們呼叫 Bob 時,實際上是 Alice 函數在執行操作。
以下程式碼範例展示了建議的 MPLAB 程式碼範本:
- 超級循環不執行任何操作。
- TMR0 中斷服務例程封裝在函數 My_1ms_Callback 中。
- TMR0 產生一個 1 ms 的中斷。
- 連接到連接埠 B 的引腳 5 的 LED 每秒閃爍一次。
#include "mcc_generated_files/system/system.h"
volatile uint16_t msTicks = 0;
static void My_1ms_Callback(void){
if (++msTicks >= 500) {
msTicks = 0;
LATBbits.LATB5 ^= 1;
}
}
int main(void){
SYSTEM_Initialize();
/*
* Register the custom 1ms callback with MCC’s timer module.
*/
TMR0_OverflowCallbackRegister(My_1ms_Callback);
INTERRUPT_GlobalInterruptEnable();
INTERRUPT_PeripheralInterruptEnable();
while(1){
;
}
}
範例 1:演示函數註冊過程的極簡程式碼。
函數註冊操作
我們的目標是在不修改 MCC 檔案(否則會覆蓋 MCC 檔案)的情況下,利用 mcc_generated_files 檔案(圖 3)中包含的程式碼。解決方案是將 My_1ms_Callback 註冊到 MCC 產生的程式碼中。這與我們先前的範例類似,我們呼叫 Bob() 函數,但實際執行操作的是 Alice() 函數。
函數註冊透過以下簡單的程式碼行完成:
TMR0_OverflowCallbackRegister(My_1ms_Callback);
就是這樣,這就是讓 main() 函數與 MC 生成的程式碼無縫連結的關鍵。函數註冊過程是通往成功的橋樑。
技術提示:MCC 對於經驗豐富的程式設計師來說是一個不錯的工具。然而,對於新手來說,手動配置暫存器會更有幫助。花幾週時間研讀規格書可以提升他們的技能。在我看來,這就像學習騎自行車一樣。我們會逐漸形成對規格書的肌肉記憶,這在遇到問題時會非常有用。此外,研究一款微控制器,例如本文介紹的 PIC16,是學習其他設備(包括 32-bit 微控制器)的入門途徑。
可惜我們現在沒有紙本版的規格書了。以前那些手冊總是會把錯誤標記出來,並用雙下劃線標出。例如,我把資料寫入了 TRIS 暫存器而不是連接埠 —— 這個小錯誤就讓我花了幾個小時來故障排除。
完結前感想
我必須承認,和你們中的許多人一樣,我當初並沒有仔細閱讀 Microchip 的說明書。有一段時間,我對這些工具感到非常沮喪。希望這個小技巧能幫你們省下一些時間。
最後,讓我們向 Kernighan 和 Ritchie 致敬,感謝他們提供的函數指標。
相關文章
如果您喜歡這篇文章,您可能也會覺得以下相關文章很有幫助:
- Microchip 可設定邏輯單元 (CLC) 入門指南:將您的 PIC16 變成 555 定時器
- PIC 微控制器應該使用哪種編程器,包括 PIC16 和 PIC18
- Discover the functions of open drain and open collector circuits


