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