前言
MSP430單片機是美國德州儀器(TexasInstruments,TI)于1996年開始推向市場的一種16位超低功耗單片機,它具有極低功耗、高性能、豐富的片上外設和通信接口等特點。由于將多個不同功能的模擬電路、數字電路模塊和微處理器集成在一個芯片上,所以又稱之為混合信號處理器。
MSP430單片機不但具有傳統單片機的特征,還具有一些片上系統的特點。因此,國內外很多高等院校已將MSP430系列單片機作為單片機相關課程的講授對象。
利用該單片機進行嵌入式系統教學具有以下特點。
1.結構簡單、資源豐富、使用方便
MSP430單片機使用的是16位RISCCPU,存儲結構上采用馮·諾依曼結構。各個片上外設均掛接在內部總線上,但外設與外設之間、外設與CPU之間都是獨立工作的,外設與CPU通過中斷機制聯系在一起。MSP430單片機內嵌有JTAG邏輯部件,便于下載和在線仿真。
MSP430單片機組織結構簡潔、便于理解,其核心部件主要包括時鐘系統、RISCCPU、Flash、RAM和相關I/O端口,其他片上外設都是對該類單片機自身的擴展和增強。
MSP430系列單片機種類豐富多樣。目前,MSP430單片機涵蓋F1xx、F2xx、G2xx、F4xx、F5xx、F6xx共6大系列,還有集成有無線收發功能的CC430系列等合計約有600種,能夠滿足大多數工程應用場合的需求。
2.有利于減少外圍電路設計
MSP430單片機中集成大量的片上外圍設備,例如看門狗、模擬比較器、定時器、串行通信接口、硬件乘法器、液晶驅動器、10位/12位ADC、16位ΣΔADC、DMA、I/O端口、基本定時器、實時時鐘和USB控制器等。充分利用這些片上外設,可以減少嵌入式系統外圍電路設計、簡化設計流程、節約成本、提高系統可靠性、縮小PCB和產品體積。
3.有利于開展更高層次的學習
MSP430單片機的內核是16位RISCCPU。在整個單片機系列中,屬于中端單片機。在高端32位單片機中,一般是采用RISC核,如CortexM系列單片機。在掌握了MSP430單片機原理及其開發技術后,再學習32位的高端單片機難度將大為降低。當然,在熟悉MSP430單片機的基礎上學習其他類型的單片機(如51單片機)會更加容易。
4.MSP430單片機的市場逐漸擴大
在美國德州儀器公司多年來不懈的努力下,MSP430單片機的市場份額在不斷增加,在16位單片機市場中獨占鰲頭。即便是在8位單片機市場中,也已對傳統的51單片機形成了強烈沖擊。
5.符合目前及未來節能降耗的要求
隨著世界能源危機日趨嚴重,迫切需要節能環保的產品。MSP430單片機與其他單片機相比在低功耗方面有著不可比擬的優勢,推廣使用MSP430單片機符合“節能降耗”的時代主題。
盡管MSP430單片機具有眾多的技術優勢,也是目前嵌入式系統應用開發所必需的,但是目前能夠用于MSP430單片機教學的圖書較少。盡管這些圖書在編寫上各有所長,但就課堂教學來說,仍存在一些不足:①有些圖書內容大多直接翻譯TI提供的用戶指南和數據手冊,并未做進一步加工或整合;②有些圖書完全工程化的講解方式對工程師或具有一定單片機基礎的人有參考價值,不適合初學者。因為這些圖書直接講述單片機的工程應用,對工作原理講解較少,讀者從這些書中獲取的信息,只是知其然,而不知其所以然,難以激發創新思維。
為此,我們在編寫過程中盡量彌補這些不足,同時融合了我們多年在嵌入式系統方面的科研積累與教學改革經驗,使得本書具有以下鮮明特色。
(1)在內容組織上打破了傳統的參考書式的講解方式,對各個知識點的內容重新劃分整合。然后再按照由淺入深、循序漸進的思路進行重新組織,使之容易被學生接受。
(2)在實例選擇上盡量做到先易后難、先部分后整體,考慮到初學者的特點,力求使實例做到簡單易懂。首先讓學生通過學習簡單的例子激發和培養學生的學習興趣和探索欲望,然后再逐步提高難度、提升水平。先是單個功能、單個模塊的學習,逐步轉換成對整個系統的分析和設計。
(3)秉承“理論學習是認識單片機的起點,設計單片機系統是最終落腳點”的理念。在理論講解的基礎上,通過實例讓學生對單片機的認識形象化,配合豐富有趣的習題練習使學生對于單片機的理解硬件化或產品化。
本書以MSP430F261x單片機為例,全面而翔實地介紹了MSP430單片機的結構組成、工作原理以及常用模塊的使用方法。內容組織上不貪大求全,而是盡量做到把最常用、最能反映單片機精髓的知識講細、講精、講透,以達到讓讀者觸類旁通的目的。在組織結構上,全書共分為12章,第1章介紹了與嵌入式系統相關的基本知識;第2章介紹了MSP430單片機的內部結構和外部組成,并簡要介紹了MSP430單片機尋址方式、指令系統;第3章主要回顧了MSP430單片機C程序設計的相關知識;第4~11章分別講述了MSP430單片機的輸入輸出端口及常用接口設計、時鐘系統、定時器、模數轉換器、數模轉換器、通用串行通信接口、存儲器、DMA等常用片上模塊的工作原理及使用方法;第12章介紹了MSP430單片機應用系統設計基礎。
書中各章節的知識點都提供了簡單易懂的例程,本書所有例程均在IAREmbeddedWorkbenchForMSP430v5和TICCSv5中調試通過。每章附有大量習題供學生課下鞏固本章內容,部分習題可以訓練學生的創新思維能力。
總之,全書結構緊湊、布局合理,具有一定的通用性、系統性和實用性。內容敘述力求簡潔、凝練。力求做到深入淺出的理論講解、簡單易懂的實例設計、豐富有趣的習題練習、獨具匠心的知識體系。為了便于學習和閱讀TI公司提供的相關原始數據資料,本書使用的邏輯電路符號與公司官方資料中使用的符號保持一致。
在本書的編寫和出版過程中得到了蘭州大學信息科學與工程學院電路與系統研究所田毅、張燕、孫曉光、李劍、郭麗杰、楊澤坤、陳麗娜、張垚、趙繼鵬等研究生,以及蘭州大學信息科學與工程學院電子信息科學與技術專業和通信工程專業部分本科生的協助。感謝他們在資料搜集、書稿整理、程序調試、后期校稿等方面所做的工作。此外,書中例題參考了TI官方網站提供的大量例程,個別例題及部分內容也參考了互聯網上的有關資料,在此向這些資料的作者一并表示誠摯的感謝。
需要特別指出的是,本教材的出版得到了蘭州大學教材建設基金資助和蘭州大學信息科學與工程學院教材建設基金資助。感謝美國德州儀器公司大學計劃給予蘭州大學MSP430&CortexM單片機聯合實驗室的持續支持。
由于作者水平所限,書中難免存在部分疏漏和不妥之處,懇請廣大讀者批評指正!
編者2017年3月于蘭州大學
第3章
CHAPTER3
MSP430單片機C語言
程序設計基礎
3.1單片機程序設計基礎
3.1.1程序流程圖
在程序設計中,最重要的不是編寫代碼而是算法設計,這與建筑和機械制造很相似。例如,當要建設一棟高樓時,首先要做的是繪制高樓的結構圖以及施工圖,然后是現場施工。程序設計也是如此,當面對一個程序設計任務時,首先想要做的是先畫出整個任務實現的流程圖,然后再使用具體的程序設計語言進行代碼實現?梢姡绦蛄鞒虉D的繪制在整個程序設計中起著重要作用。實際上,繪制流程圖的過程就是思考和形成算法的過程。由于其直觀性,繪制過程本身又促進了思考。因此,程序流程圖是人們對解決問題的方法、思路或算法的一種描述方法。當人們看到一個優秀的程序流程圖時,就能很快地把握住程序結構和處理思路,有利于程序糾錯和維護。
程序流程圖具有符號規范、畫法簡單、結構清晰、邏輯性強、便于描述、容易理解等優點。繪制流程圖所需要的基本符號如圖3.1所示,它們分別是起始框、終止框、執行框和判別框。其中,起始框和終止框是程序流程圖必備的;執行框中注有必要文字說明以指示具體執行了何種操作,該框所指的操作可大可小。在概要設計階段執行框所描述的是一個大的功能模塊。在詳細設計階段則是指在實現某一特定功能時需要執行的具體指令或語句。
圖3.1流程圖中基本符號
繪制程序框圖的規則:使用標準的框圖符號;框圖一般按從上到下、從左到右的方向畫;除判別框外,大多數程序框圖的符號只有一個進入點和一個退出點,而判別框是具有超過一個退出點的唯一符號。在繪制流程圖時要注意結構化程序設計中三種基本結構的流程圖標準畫法。盡量將復合條件轉為多個單一條件。流程線不要忘記畫箭頭,因為它是反映流程執行的先后順序。如果不畫箭頭,就難以判斷執行次序。
3.1.2單片機程序設計語言
目前主要的單片機程序設計語言是匯編語言和C語言。匯編語言是面向CPU的程序設計語言。由于匯編語言程序直接利用單片機指令集中的指令實現具體的算法功能,因此匯編語言與機器語言具有較好的一致性,可以訪問所有能夠被訪問的軟、硬件資源。匯編語言程序的目標代碼簡短,占用內存少,執行速度快,是高效的程序設計語言。它經常與高級語言配合使用,以改善程序的執行速度和效率,彌補高級語言在硬件控制方面的不足。匯編語言的缺點是不同處理器具有不同的匯編語言語法和編譯器,編譯好的程序無法在不同的處理器上執行,缺乏可移植性。匯編語言程序的可讀性差、不易維護。總之,匯編語言程序編寫煩瑣、工作量大、開發效率很低,周期長且單調。目前處理器性能不斷提升、存儲資源越來越豐富,使得匯編語言目標代碼少、效率高的優勢正在逐漸喪失。使用匯編語言從事嵌入式系統開發的人數總體呈下降趨勢。
C語言是一種既具有高級語言的特點,又具有部分匯編語言特點的程序設計語言。C語言也是一種結構化的程序設計語言,因為它提供了三種基本結構語句,而且提供了定義“函數”的功能。函數可以完成子程序的所有功能,是完成程序功能的基本構件。由于函數允許將一個程序中的多個任務被分別定義、編碼和單獨編譯,所以函數可以使程序模塊化。作為一種高級語言,C語言功能齊全、應用范圍大,已是目前最為流行的高級語言之一。但是C語言代碼的執行效率比匯編語言要低。
在程序設計歷史上匯編語言曾是非常流行的語言之一。一方面,隨著硬件技術的進步,CPU性能不斷提高、儲存資源日益增大、成本逐漸降低;另一方面,隨著軟件規模的增長以及對開發進度和效率的苛刻要求,高級語言逐漸取代了匯編語言。但即便如此,高級語言也不可能完全替代匯編語言的作用。以Linux內核為例,盡管絕大部分內核代碼是用C語言編寫的,但在某些關鍵地方仍然使用了匯編代碼。因為這部分代碼與硬件的關系非常密切,即使是C語言也會顯得力不從心,而匯編語言則能夠很好地揚長避短,最大限度地發揮硬件的性能。
一般對于小程序來說,若是對硬件進行簡單的控制可以用匯編語言,若更多涉及邏輯設計方面的內容,則需要使用C語言。對于稍大一些的程序來說,C語言的優勢就十分明顯了。就現代單片機程序設計來說,大多是以C語言為主,匯編語言為輔。即只有在那些對代碼大小和效率要求較高的場合才使用匯編語言。
3.1.3單片機程序設計的一般步驟
圖3.2單片機程序設計流程圖
人們在嵌入式系統產品開發過程中摸索出了程序設計的一般步驟,具體如圖3.2所示。該步驟對于基于單片機的產品設計與程序開發具有很好的借鑒作用。按此步驟進行產品開發可使設計者少走彎路,縮短開發周期,提高產品可靠性。
1.需求分析、明確任務
該階段要盡可能搞清楚用戶的全部需求信息,即對要完成的任務進行詳細的了解與分析。然后將具體的實際問題抽象轉化成計算機可以處理的問題。
2.算法設計
在明確任務之后,就需要將其轉化成計算機算法。算法就是在計算機上解決問題的方法與步驟。對于復雜的大型程序,算法設計又可分為概要設計和詳細設計兩個階段。對于比較小的軟件兩個可以同時做。詳細設計完成后算法設計也就基本完成了,接下來將設計好的算法轉化成使用具體程序設計語言編寫出的程序,進而實現在計算機上的求解。在設計算法時一般會采用或借鑒現有的一些計算方法和日常生活中解決問題的邏輯思維推理方法等。
繪制程序流程圖是在算法設計之初就開始的工作,在算法設計好之后,程序流程圖也就確定了。所以說算法設計的過程,也是繪制程序流程的過程。通過畫流程圖可以首先從圖上檢驗算法的正確性,減少出錯的可能,使得動手編寫程序時的思路更加清晰。
3.芯片選擇及合理分配單片機資源
等完成算法設計之后,就需要決定在何種硬件平臺上實現上述算法。在確定好主要芯片之后,就需要完成單片機系統的資源配置及分配,主要是單片機存儲空間和工作單元的合理分配和外圍設備的配置。在這個過程中,應充分利用不同型號單片機的特殊優點以方便資源配置和系統設計。例如,合理、正確地對存儲空間進行分段和數據定義。由于MSP430單片機對16位數據處理效率最高,因此要充分利用這一特點。
4.代碼編寫
該步驟在單片機程序設計中是最為重要的一步。經過1~3步的準備,已完成了程序代碼編寫前的所有工作。編寫程序時要選擇好編寫語言,對于同一種算法,不同的程序設計語言會有不同的實現方法。編程能力的提高是一個循序漸進的過程。對于初學者來說,一方面,要多讀現有的程序,以學習別人的編程經驗;另一方面,還必須多動手,親自編寫程序,不要怕失敗,只有通過無數次失敗,才能從中積累自己的編程經驗。
5.程序調試
在源代碼編寫完畢之后,就要進行調試。通過調試的程序只能說明沒有語法錯誤,但不能排除沒有邏輯錯誤。所以能不能達到預期效果還必須用實際數據測試才可以。一般來說,這是一個反復測試的過程。對此,程序編寫人員,尤其是初學者一定要有充分的心理準備。只要有足夠的耐心,加上認真、細致的工作態度,就一定能找出其中的邏輯錯誤。事實上,即使是一個非常有經驗的程序員,也沒有百分之百的把握一次就成功。
6.性能評估
在程序調試完后,就需要將程序應用到產品上進行實際環境檢驗,其中包括功能檢驗、可靠性檢驗、極端環境下檢驗。凡經過檢驗符合要求了,整個程序設計工作就算結束了,接下來就是文檔整理與使用說明書的編寫工作了。若不符合要求,則需要重新開始,這是最壞的情況。一般而言,只要將任務需求分析做得足夠細,一般不會出現這種極端情況。
7.文檔整理與編寫
程序運行無誤,實際試運行正常,且經過了各種環境測試,但這并不意味著產品開發任務的結束。程序文檔的編寫也是程序設計的一個重要任務。其目的是為了便于修改和維護程序。程序文檔一般包括含有功能要求和指標程序的設計任務書、程序流程圖、存儲單元分配清單、源程序清單、應用系統資源分配、參量計算和設計、錯誤信息的定義、實際功能及指標測試結果說明、程序使用和維護說明書等。需要注意的是,部分程序文檔的編寫是與上述1~6步同時進行的。
3.2MSP430單片機C語言程序設計
目前支持MSP430單片機的C語言編譯器很多,國內主要使用的是IAR公司的IAREmbeddedWorkbenchforMSP430(EW430)和TI公司開發的CodeComposerStudio(CCS)。MSPGCC作為一種開源編譯器也具有一定的使用者。這些C編譯器功能比較強大,可以編譯出高效、緊湊的機器代碼。
MSP430單片機的C語言程序(以后簡稱C430)設計方法與標準C語言的基本上相同。但單片機的資源與PC相比,十分匱乏。為了更好地適應MSP430單片機的程序設計,C430對標準C語言進行了擴展。主要表現在數據類型及數據長度、關鍵字擴展以及由此引起的函數擴展等。需要說明的是,不同的C430編譯器對C語言的擴展不完全相同,例如,IAR公司的C編譯器與TI公司的C編譯器都對C語言的支持程度略有不同,大多數情況下,MSP430單片機的源程序可以在各個版本的C430編譯器上使用。
3.2.1數據類型與運算符
1.標識符與關鍵字
標識符是指常量、變量、語句標號、數組、文件名以及用戶自定義函數的名稱。C語言規定標識符只能由字母、數字、下畫線組成,并且只能由字母、下畫線開頭,所用字母區分大小寫。C語言中一些已被賦予特定含義的標識符被稱為關鍵字或保留字,關鍵字不能用作標識符,在C語言中的關鍵詞見表3.1。這些關鍵字將在后續章節中陸續介紹。
表3.1C語言中的32個關鍵詞
與數據類型相關的關鍵字(12個)
short聲明短整型變量或函數struct聲明結構體變量或函數
int聲明整型變量或函數union聲明共用數據類型
long聲明長整型變量或函數enum聲明枚舉類型
float聲明浮點型變量或函數void聲明函數無返回值或無參數,聲明無類型指針
double聲明雙精度變量或函數unsigned聲明無符號類型變量或函數
char聲明字符型變量或函數signed聲明有符號類型變量或函數
續表
與變量有關的關鍵字(6個)
auto聲明自動變量extern聲明變量是在其他文件正聲明
const聲明只讀變量register聲明寄存器變量
static聲明靜態變量volatile說明變量在程序執行中可被隱含地改變
與程序控制有關的關鍵字(12個)
if條件語句for一種循環語句
else條件語句否定分支(與if連用)do循環語句的循環體
switch用于開關語句while循環語句的循環條件
case開關語句分支continue結束當前循環,開始下一輪循環
default開關語句中的“其他”分支break跳出當前循環
goto無條件跳轉語句return子程序返回語句(可以帶參數,也可不帶參數)
其他關鍵字(2個)
sizeof計算數據類型長度typedef用以給數據類型取別名