本文介紹了對稱應用筆記PIC1000和AVR1000b,展示了它們如何應用于非凡的MPLAB?代碼配置器(MCC)生成的代碼。本文將介紹如何使用這些應用筆記來查看MCC的幕后情況,作為生成的裸機代碼的參考。或者,如果您從裸機應用筆記開始,學習如何從頭開始編寫裸機代碼,本文將向您展示如何更自信、更靈活地將這些知識應用于 MCC 設計。這是您的選擇!應用筆記詳細描述了每種架構的命名約定和寄存器訪問方法的原因,以幫助您理解低級PIC?和AVR? MCU代碼之間的差異。無論您如何進行設計,您都能夠快速編寫裸機 C 代碼并了解 MCC 生成的驅動程序。
為您的應用選擇 MCU(基于差異化外設,而不是特定 MCU 系列的經驗)
Microchip結合了令人印象深刻的PIC和AVR微控制器(MCU)系列,擁有市場領先的8位MCU系列。作為嵌入式工程師,理想情況下,為給定項目選擇MCU取決于哪種器件(外設)最能實現應用中難以實現的功能。通常,這是由該MCU上差異化外圍設備的組合決定的。例如,您可能有嚴格的模擬測量應用要求,需要仔細檢查MCU的模數轉換器(ADC)。在一個應用中,PIC MCU的10位模數轉換器(ADCC)外設(視頻)可能具有優勢,因為支持各種類型的內核獨立后采樣計算。對于另一個應用,AVR MCU 的 12 位差分 ADC 可能因其分辨率或與 AVR MCU 的事件系統配合使用而具有優勢。兩種ADC均提供相對專業化的功能,根據應用要求提供某些優勢。
通常,熟悉的生態系統的支持會對MCU的選擇產生重大影響。為了專注于為其設計選擇最佳的MCU和外設,在過去幾年中,我們付出了巨大的努力來調整PIC和AVR MCU產品系列的工具支持。Microchip仍然致力于支持Atmel Studio 7和Atmel START生態系統中的新AVR設備。除此之外,AVR MCU還被添加到MPLAB X集成開發環境(IDE)和MPLAB代碼配置器(MCC)中,統一了這些MCU系列之間的開發體驗。通用工具生態系統的支持旨在讓您快速使用新的MCU系列,從而大大降低探索的障礙。然而,對于嵌入式開發人員來說,使用MCU進行舒適的開發比工具生態系統更深入,一直到寄存器級或裸機編碼。
了解項目中的所有代碼
MPLAB 代碼配置器 (MCC) 或 Atmel START 等代碼生成工具是節省大量設計時間的絕佳方法。但是,如果您不了解這些工具生成的代碼,您可能永遠不會完全適應它們。具有諷刺意味的是,您可能只有在不再需要該工具時才信任它。作為嵌入式開發人員,您也知道,如果不至少自己修改一些寄存器級代碼,就不太可能進入生產環境。
裸機編碼:使用器件數據表和頭文件作為主要編程參考
MCU由多個構建模塊或模塊組成:CPU、SRAM、閃存、EEPROM和外設(例如ADC)。這些都在器件數據手冊中定義,可通過寄存器進行配置。“裸機編碼”中對“金屬”的引用是指器件寄存器,因此它是指編寫配置 MCU 模塊所需的寄存器級代碼的做法。此寄存器級代碼的形式受器件頭文件的影響,而器件頭文件又受MCU外設模塊結構的影響(數據手冊)。因此,高效編寫裸機代碼需要具備數據表模塊結構以及頭文件定義的工作知識。因此,除了代碼示例外,在此級別進行開發的主要編程參考通常是MCU數據手冊和器件頭文件。
裸機編碼是一種嵌入式開發技能,往往在同一MCU系列的多個項目過程中掌握。對于特定的MCU,工程師熟悉MCU系列的數據表模塊和頭文件的隱式模式。了解這些模式有助于該MCU系列的快速開發,但也會產生選擇不同MCU的阻力,即使它可能更適合新項目。隨著時間的推移,能夠快速處理與頭文件定義相關的命名約定,使工程師能夠利用現代 IDE 的代碼完成功能,例如 MPLAB X IDE(或 Atmel Studio)。
雖然本文中使用的示例引用了 MCC 中的代碼,但這些課程同樣適用于從頭開始編寫代碼。MCC 生成的項目的編碼樣式和項目結構可能與您自己實現的項目不同。但是,在寄存器級別,MCC 生成的代碼與手動編碼的代碼非常相似。因此,MCC生成的代碼被用作示例上下文,通過我們從PIC1000和AVR1000b應用筆記中了解到的內容,探索PIC和AVR MCU寄存器級代碼之間的差異。在此過程中,我們還將指出一些您可能不知道的有趣的 MPLAB X IDE 編輯器功能。
MCC ADC 驅動器,用于 PIC MCU(帶計算功能的 ADC)和 AVR MCU(12 位差分 ADC)
MCC 中的外設驅動程序完全支持模塊的功能,包括可能促使您選擇 MCU 的所有差異化功能。因此,無論您是否決定在生產中使用此生成的代碼,MCC 都是快速評估這些外圍設備性能的好方法。下圖列出了PIC和AVR MCU的ADC外設驅動器的所有API功能。如您所見,由于外圍功能不同,因此 API 自然也不同。但是,在基本級別上,它們仍然是ADC驅動程序,因此具有通用功能,因此具有許多通用API。例如,如果您只是對獲得ADC結果感興趣,則在這兩種情況下,您只需調用:ADCx_GetConversionResult()。
圖1: 為帶計算的ADC提供API(PIC18F47Q10)和帶窗口的ADC(AVR128DA48);在此處查看圖 1 的高分辨率版本。
注意:圖 1 中顯示的導航器默認位于項目儀表板旁邊。它也可以從MPLAB X IDE的右上角搜索欄中打開。
圖 2 中 MCC 生成的 ADCx_GetConversionResult() 代碼清單顯示了此函數在 PIC18F47Q10 和 AVR128DA48 上的各自實現。MCC 驅動程序往往相對平坦。函數很少調用其他函數,但如果它們調用其他函數,它們往往緊鄰。請注意函數中的代碼如何使用寄存器級代碼直接實現所需的功能,類似于您可能手動編寫的代碼。
在大多數情況下,MCC 生成的代碼是根據為相應 MCU 系列編寫代碼的標準最佳實踐方式量身定制的。因此,編碼風格與Microchip應用工程師手寫的應用筆記或技術簡報中的代碼非常相似。但是,您還會注意到PIC MCU的代碼與AVR MCU的代碼之間存在顯著差異。
圖 2:MCC 生成的 ADC 驅動器功能代碼,在給定通道(PIC 和 AVR MCU)上返回轉換結果;在此處查看圖 2 的高分辨率版本。
PIC1000和AVR1000b應用筆記的背景和動機
在Microchip,精通為PIC或AVR MCU編寫裸機代碼的應用工程師最初依賴于MCC或Atmel START等工具,他們不會自然地無縫過渡到另一個。就我自己而言,在Microchip位于挪威的特隆赫姆辦事處(AVR MCU的故鄉)工作,我更有信心將MCC用于AVR MCU,而不是PIC MCU。正如我上面描述的,只有當您可以編寫它們自己生成的代碼時,人們才能 100% 適應這些工具。由于我發現為 PIC MCU 編寫基本的裸機代碼非常具有挑戰性,因此這是意料之中的。此外,代碼完成只有在您知道模式后才有效,因此在嘗試編寫寄存器級 PIC MCU 代碼時,我得到的幫助非常少,令人沮喪。
圖3:啟動ADC轉換的代碼完成幫助(適用于PIC和AVR MCU);在此處查看圖 3 的高分辨率版本。
涵蓋該主題的經典應用筆記是AVR1000:為XMEGA編寫C代碼入門。這是在2008年發布的,當時對當時新的AVR MCU系列XMEGA的(外設)模塊結構和頭文件進行了擴展和改進。這些相同的約定在內部應用于此后發布的所有新AVR MCU設備。在描述所有新AVR MCU器件的C代碼編寫模式方面,本應用筆記可能并不明顯。此外,還需要某種形式的文檔來幫助理解寄存器級PIC和AVR MCU代碼之間的差異。
為了利用AVR或PIC MCU的現有經驗,我們創建了兩個應用筆記。它們被設計為并排讀取,以便熟悉其中一種架構的客戶(或Microchip應用工程師)可以輕松發現兩者之間的差異,并更快地啟動和運行另一種架構。
讓我們探討這些對稱應用筆記,它們旨在幫助理解低級PIC和AVR MCU代碼之間的差異:
● AVR1000b:AVR C 代碼入門
● PIC1000:開始編寫 PIC16 和 PIC18 的 C 代碼
以下各節給出了PIC1000和AVR1000b應用筆記各章節中涵蓋的內容示例:
● 第 1 章:數據表模塊結構和命名約定
● 第 2 章:頭文件中的模塊表示
第3章:為PIC和AVR MCU編寫C代碼(PIC1000和AVR1000b)
● 第 4 章:展示代碼編寫替代方法的應用示例
第1章:數據表模塊結構和命名約定(PIC1000和AVR1000b)
裸機編碼熟練程度不容易從一個MCU產品系列轉換為另一個MCU產品系列的至少部分原因是數據表模塊的組織模式往往是隱式的,并且通常需要推斷命名約定。
每個章節的第一章都試圖通過對模塊組織和命名約定提供明確的指導來解決這個問題。
圖 4:PIC 和 AVR MCU 的寄存器命名約定(摘自 PIC1000、AVR1000b);在此處查看圖 4 的高分辨率版本。
例如,讓我們考慮AVR和PIC MCU相對于ADC控制寄存器的寄存器命名約定。
圖 5:AVR 和 PIC MCU 的 ADC 寄存器摘要摘錄;在此處查看圖 5 的高分辨率版本。
在 MPLAB X IDE(或 Atmel Studio 7)上工作時,可以使用 IO 視圖找到寄存器、位和位字段的有用工作視圖。如果啟動調試會話,您將能夠直接操作寄存器位,例如打開/關閉電路板上的LED。
圖 6:使用 IO 視圖查看模塊寄存器、位和位字段。在調試模式下,此狀態將為實時和交互式;在此處查看圖 6 的高分辨率版本。
注意:您還可以使用 IO View 作為使用數據表的更有效方式,方法是選擇寄存器,然后單擊 pdf 圖標。這將在該寄存器的上下文中打開數據表的 HTML 版本。最新的 PIC 和 AVR 設備支持此上下文幫助。
此外,對于AVR MCU,您還可以使用編輯器瀏覽HTML數據表。這是通過選擇外圍設備來完成的。注冊,然后單擊 PDF 數據表圖標,請參見圖 7。另請參閱 MPLAB? X - 上下文數據表幫助和 AVR? 中斷(2 分 38 秒)。
圖 7:來自 IO 視圖(以及來自 AVR 編輯器)的數據表上下文幫助;在此處查看圖 7 的高分辨率版本。
第2章:頭文件中的模塊表示(PIC1000和AVR1000b)
在本章中,您將找到PIC和AVR MCU的各種器件頭文件定義的摘要,例如結構、聯合和位字段掩碼。這些定義將確定在為設備編寫代碼時將獲得哪些代碼完成幫助。使用這些定義,您的代碼將比簡單地將十六進制值分配給寄存器更具可讀性。即使您注釋了代碼,如果注釋已過時,也可能具有很難調試的代碼。
讓我們再次考慮圖 1 中使用的代碼完成示例。
對于PIC MCU,ADCON0寄存器中位的原因碼完成選項是由于ADCON0bits_t的類型定義,由器件頭文件中的結構和聯合位字段定義組成。
對于AVR MCU,代碼完成之所以建議ADC模塊的ADC0實例中的寄存器列表,是因為定義了ADC_t結構,該結構由ADC模塊中的所有寄存器組成。
圖 8:由于位域定義 (PIC MCU) 和ADC_t結構 (AVR MCU) 以及 AVR/PIC MCU 頭文件中的代碼完成;在此處查看圖 8 的高分辨率版本。
注意:AVR MCU模塊的寄存器名稱不是唯一的,即MCU中可能有多個ADC模塊實例,此外可能有多個類型的模塊具有CTRLA寄存器。因此,對于AVR MCU,寄存器僅在特定模塊實例的上下文中完全定義。但是,PIC MCU在寄存器名稱中內置了模塊和實例,即ADCON1。
注意:對于 AVR MCU,可以選擇模塊實例寄存器定義。
圖 9:AVR MCU 的模塊實例寄存器定義;在此處查看圖 9 的高分辨率版本。
第3章:為PIC或AVR MCU編寫C代碼(PIC1000和AVR1000b)
相關應用筆記的本章介紹了與器件寄存器寫入相關的一些關鍵用例。使用第 2 章中討論的設備頭文件中的各種構造,給出了以下用例的最佳實踐建議:
● 設置和清除寄存器位
● 配置寄存器位字段
● 更新/更改寄存器位字段
請注意,更新寄存器與設備重置后處于已知狀態時該寄存器的初始配置不同。為了僅更新預期的位或位字段,需要考慮讀取-修改-寫入注意事項。
在本文使用的示例中,MCC 生成的代碼編寫如下,但是,有幾種替代方法。
第 4 章:展示代碼編寫替代方法的應用示例
在本章中,為編寫寄存器級代碼的每種替代樣式提供了代碼清單。使用一個簡單的應用程序,配置引腳,然后在按下按鈕時打開LED。然后針對應用筆記的PIC MCU和AVR MCU版本支持的每種不同編碼樣式提供代碼清單。這些代碼清單可能是促進公司代碼樣式討論的有用參考。例如,如果您正在規劃同時使用 PIC 和 AVR MCU 的項目,那么位掩碼或位位置樣式可能允許 AVR 和 PIC MCU 之間的代碼非常相似。
總結
這些對稱應用筆記《為PIC/AVR編寫C代碼》(PIC1000和AVR1000b)旨在幫助工程師更輕松地編寫可讀寄存器級C代碼,具體做法是:
在器件數據表中顯式定義模塊模式和命名約定
描述每個MCU模塊的器件頭文件結構和定義
提供訪問和操作寄存器的最佳實踐編碼樣式示例
無論您是從頭開始編碼,還是試圖更好地理解 MCC 或 Atmel START 生成的代碼,或者希望通過權衡選項做出明智的編碼風格決策,它們都應該很有用。此外,這些應用筆記并排使用,有助于理解低級PIC和AVR MCU代碼之間的差異。
具體來說,已經嘗試理解MCC生成的代碼,并充分利用MPLAB X IDE功能,如代碼完成和IO視圖,以便編寫易于閱讀的最佳實踐C代碼。視頻中演示了其中許多MPLAB X IDE功能:MPLAB? X - 上下文數據表幫助和AVR中斷,在編寫按下按鈕時打開LED所需的裸機AVR?代碼的過程中。
因此,如果您習慣于為 PIC 或 AVR MCU 編寫裸機代碼,為什么不嘗試在另一個上獲取基礎知識呢?
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7557瀏覽量
151447 -
mcu
+關注
關注
146文章
17152瀏覽量
351263 -
PIC
+關注
關注
8文章
507瀏覽量
87581
發布評論請先 登錄
相關推薦
評論