李寧,庫少平,付國江
(武漢理工大學 計算機科學與技術學院,武漢430070)
自從2006年ARM公司推出第一款基于ARMv7體系結構的32位微控制器內核Cortex-M3以來,各半導體廠商陸續采用該內核設計生產自己的MCU。之后,ARM公司2009年又推出了Cortex-M0和Cortex-M4內核,2012年則推出了Cortex-M0+內核。至2012年,基于Cortex-M的芯片出貨量就已經達到22億片。經過8年的發展,32位的Cortex-M處理器已經開始主導嵌入式領域中的微控制器市場[1]。
為適應技術和市場的需求,國內各高校在近幾年也開始逐漸將Cortex-M微控制器引入到本科生教學中。本文將介紹筆者所在教學團隊進行Cortex-M微控制器教學的一些實際經驗。
8位的單片機8051由Intel公司開發設計,后來各大半導體廠商都生產了各式各樣的51內核單片機,使得8051一度成為MCU領域中的王者,至今仍占有著重要的地位。國內高校的MCU教學曾經絕大多數以8051為對象進行講解。由于Cortex-M微控制器是32位的,其硬件和軟件的復雜程度都高于8051單片機,因此在教學重點上也有所差異。
由于8051單片機出現于1980年,那時候相當多的51內核單片機采用雙列直插封裝形式,至今市場上仍有大量雙列直插封裝的51內核單片機。通過面包板和PCB萬能板,擴展上拉電阻、電容、LED燈、按鍵等幾個簡單器件,每個學生都可非常方便地搭建起8051的最小系統,并作為教學實驗平臺,如圖1(a)所示。目前,各半導體廠商生產的Cortex-M微控制器多數采用QFN、LQFP、BGA等封裝形式,幾乎見不到雙列直插封裝形式,Cortex-M微控制器的用戶也不會考慮使用雙列直插封裝形式。因此,讓學生自己動手做出一個Cortex-M微控制器的最小系統非常困難,對于很多專業的學生而言,甚至幾乎不可能。
由于Cortex-M內核計算能力強大,很多廠商開發的Cortex-M微控制器又提供了豐富的外圍接口,使得有大量的外設可以被輕松接入。因此,筆者在教學中采用集成了仿真器,并帶有Arduino接口的Cortex-M微控制器學習板,學生可以自由地擴展各種外設板,如圖1(b)所示。
由于Cortex-M微控制器的計算能力、存儲空間都遠大于8051單片機,因此在軟件上有了更大的擴展空間,在軟件的教學上應當也有所調整。

圖1 8051教學平臺與Cortex-M微控制器教學平臺
(1)弱化匯編語言,強化C語言
無論是8051還是Cortex-M微控制器的匯編語言指令集都不是太復雜,尤其是Cortex-M0內核僅有56條Thumb指令,學習和掌握其匯編語言指令集的難度并不大。
在早期的8051教學中,匯編語言是其中的重要內容,甚至整個教學過程均采用匯編語言來講解,也有很多工程師一直采用匯編語言來對8051進行編程。其理由是C語言編譯后的代碼密度比匯編語言的低,執行效率也低。早期的8051單片機的計算能力和存儲空間都非常有限,導致某些工程師甚至在編程時對每個字節都“斤斤計較”,這是匯編語言曾在MCU領域被廣泛使用的重要原因。
Cortex-M微控制器的計算能力已經非常強大,其存儲空間也足夠大,價格也很便宜;同時編譯系統的能力也有顯著提高,即使是采用GCC編譯器也可以獲得很好的代碼密度和執行效率。此外,使用C語言進行開發,開發速度更快,更適合開發復雜的軟件,例如帶有RTOS的系統,相比匯編語言,軟件越復雜,C語言的開發效率越高。因此,當前絕大多數工程師已經開始使用C語言作為MCU的開發語言,而基本不再使用匯編語言。
基于以上情況,在教學實踐中可適當弱化匯編語言編程的要求,不要求學生用匯編語言完成較為復雜的程序。
(2)弱化寄存器操作,強化使用API
對MCU的各種外設接口的控制,都是通過對寄存器的操作來實現的。因此,過去在以8051為對象的單片機課程教學和以8086 CPU為對象的微機原理課程教學中,都花費了大量時間介紹各外設接口的數據寄存器、控制寄存器和狀態寄存器含義,以及相應的操作方法。Cortex-M微控制器中所帶有的外設越來越多,越來越復雜,如果逐一介紹各外設接口的寄存器組,其內容將非常多,而且枯燥乏味。
目前,各個MCU廠商為了幫助使用其產品的工程師能進行快速開發,均提供了完善的外設驅動庫。在每個外設驅動庫中,均定義了相應外設的數據結構和一組API函數,這一組API函數覆蓋了該外設的所有功能。而且,這些外設驅動庫的文件結構、數據結構、函數名和參數名都進行了標準化。
基于以上情況,在教學實踐中通常可以僅介紹1~2個簡單外設的寄存器組,例如GPIO的寄存器組,讓學生了解如何通過操作寄存器來實現對外設接口的控制即可。同時,應增加對外設驅動庫的介紹,包括外設驅動庫的文件結構、數據結構、函數名和參數名定義的規范。讓學生掌握查閱處理器數據手冊和API函數手冊進行編程的能力。
(3)引入RTOS,中斷與OS任務調度并重
8051的計算能力有限,存儲空間很小,因此在實際應用中基本不會使用RTOS,通常是直接進行裸機編程。對于多任務的處理,通常是用中斷來實現,因此中斷處理是MCU教學的重點。
Cortex-M微控制器的計算能力和存儲空間的大幅提高,使得MCU能適用于更加復雜的應用。對于功能復雜的應用,如果使用裸機編程的方法進行開發,則必然會遇到編程復雜、調試困難、代碼耦合性高、移植困難等諸多問題,因此,越來越多的Cortex-M微控制器應用開始引入RTOS。基于RTOS的應用程序開發,會大大降低應用程序的復雜性和代碼的耦合度,應用的移植也變得簡單。當然,仍有大量的Cortex-M微控制器應用本身就比較簡單,無需引入RTOS。
基于以上情況,在教學實踐中可引入RTOS的知識,同時也仍保持對中斷的重點介紹。對于計算機專業的學生而言,RTOS的知識是易于理解和掌握的,但是對于自動化和電子專業的學生而言,則會存在著一些困難。基于這種情況,可將RTOS介紹的重點放在任務調度的概念上,讓學生理解RTOS可以幫助編程者實現多任務的切換和調度即可。
由于常見Cortex-M微控制器的封裝形式不方便讓學生自己搭建起最小系統,因此筆者在教學中采用集成了仿真器、并帶有Arduino接口的Cortex-M學習板,使用Cortex-M0處理器,如圖1(b)所示。同時還提供多種Arduino接口擴展板,例如三色LED燈、矩陣鍵盤、步進電機、溫度傳感器、光敏傳感器、重力加速度傳感器、ZigBee模塊等,便于搭建各種應用系統。這樣既方便完成單一功能的驗證實驗,又適于進行較為復雜的課程設計,還能用于學生自主創新項目。這樣的教學平臺體積小、靈活性高、方便攜帶,學生甚至不必在實驗室就可以進行實驗或者自主創新開發。
筆者使用Coocox工具作為教學實踐的軟件平臺。Coocox工具包含一套完整的ARM MCU工具鏈,包含集成開發環境CoIDE、燒寫工具CoFlash、實時操作系統CoOS以及快速代碼生成工具CoSmart,而且完全免費[2]。更重要的是,其基于組件化的編程思想和分享功能非常便于實踐教學的開展。
(1)組件化編程

圖2 CoIDE工程組件樹
在集成開發環境CoIDE中,外設驅動、算法、通信協議棧、RTOS等均被包裝為組件(Component)。開發者只要通過鼠標選擇相應的組件,即可將組件添加到自己的應用程序中。在組件樹窗口中可以清楚地顯示應用程序所使用的外設、通信協議、RTOS等,如圖2所示。相比于文件樹而言,組件樹的結構更清晰明確,而且還可以和文件樹相互參照。這種模塊化的編程方式,讓編程者非常易于理解應用程序的結構,也大大加快了編程的進度,減少了添加驅動函數庫、RTOS等過程中可能出現的錯誤。同時,每個組件均有基本例程可以參考,只需選擇相應例程即可自動將相關代碼加入到自己的應用程序中去。學生無需編程,就可完成第一個入門實驗,實踐教學的難度明顯降低,大大減少了學生對于MCU實踐教學的畏難心理。
(2)分享功能
CoIDE還具有基于Internet的分享功能,開發者可以將自己開發的組件、例程上傳到服務器上與其他開發者分享,這個功能也方便了教師對學生實踐教學的檢查和評分。學生可將自己的實驗程序作為例子上傳,教師則可以非常方便地下載、查看并運行學生的實驗代碼,從而進行評分,而不必當場逐一檢查實驗結果。這樣,老師和學生在實驗場地和實驗時間的安排上都變得非常靈活,學生甚至可以在寢室完成實驗,老師也可以根據自己的時間來進行實驗成績評分。
同時,CoIDE也具有其他商用集成開發環境的各項功能,可以用于各種復雜的ARM MCU應用的開發。近年來,Coocox工具鏈也逐漸成為一些歐美大學的MCU教學的軟件教學平臺。
隨著物聯網的快速發展,許多高校都開設了物聯網專業,計算機、電子、自動化等專業也開設了物聯網的相關課程。物聯網感知層中的各種傳感器節點,其實就是MCU加上相關傳感器,如果能將MCU的教學與物聯網教學進行結合,會有助于學生建立完整的物聯網系統概念。
在實踐教學中,在Arduino學習板上擴展ZigBee模塊和傳感器模塊,可實現一個傳感器節點;或者擴展ZigBee模塊和一個步進電機模塊,實現一個控制節點。一組學生即可構建一個小的物聯網,例如實現簡單的智能家居系統原型。
移動終端、可穿戴設備的迅速普及,使得Android應用開發成為了計算機專業學生的熱門選修課程。在Android應用開發實踐教學中,也可以與MCU教學相結合。將MCU實踐教學與其他相關課程的實踐教學進行有機的結合,不僅可以幫助學生建立各知識領域之間的聯系,還可以提高學生的興趣,也有利于鼓勵學生進行自主創新開發。
在筆者的MCU教學實踐中也遇到如下一些問題和困難:
①缺乏合適教材。很多關于Cortex-M微控制器的書籍都是為MCU廠商做市場推廣而寫作的,更適合作為編程參考手冊,而不適合作為教材。由于ARM MCU比8051復雜,涉及的軟硬件內容更豐富,已有的一些Cortex-M微控制器教材很難兼顧。各個專業的MCU教學需求也有所偏重,市面也缺乏根據專業特點來編寫合適的教材。
②學時少,內容多,尤其實踐學時太少。對于這一問題,通過鼓勵學生將學習板帶回寢室學習,得以適當緩解。
③軟硬件知識如何平衡。對于不同專業的學生,需求是不同的。計算機專業的學生,偏向于軟件方面;電子專業的學生,偏向硬件方面;自動化專業的學生,則更偏向于接口控制與通信方面。
④如何與其他相關課程的實踐課相互有機結合,在有限的學時中做到相互促進、相互兼顧,并能完成相關知識點全覆蓋。
[1]ARM Limited.Cortex-M 系列[EB/OL].[2014-06].http://www.arm.com/zh/markets/embedded/mcu.php.
[2]Free/Open Cortex-M微控制器 Development Tools[EB/OL].[2014-06].http://www.coocox.org.