一位15年經(jīng)驗的老司機教你學(xué)習(xí)單片機
作者:歐浩源
選于21ic論壇
編輯:付斌
緣起
2018年1月1日,意味著我有15年的單片機經(jīng)驗了,得在21ic最熱的板塊來個文章紀念一下。
從2003年學(xué)習(xí)單片機開始,從公司到研究所,從研究所到學(xué)校,還真沒有離開過它。對于經(jīng)驗豐富的工程師,以下內(nèi)容可以忽略了,然而,對于剛?cè)腴T的初學(xué)者,還是可以看一看的。
初學(xué)者的態(tài)度
在我學(xué)習(xí)單片機的年代,只有單片機而且只有一種51單片機,沒的選擇。現(xiàn)在,有51內(nèi)核的系列單片機、有MSP430單片機、有CC2530單片機、有ContexM0系列單片機、有STM8單片機、還有臺灣的合泰、華邦、義隆...甚至國內(nèi)的單片機......這還不包括ARM、ContexM3、STM32...這些32位的嵌入式產(chǎn)品。面對這么多的選擇,你怎么入門?
在我的學(xué)生中,不少人覺得8位機太簡單了,稍微入門就準備要學(xué)嵌入式,搞ARM,玩Linux。在他們看來,會單片機并不等于嵌入式。實際上這是兩個概念,而且你會用單片機就等于你能用單片機了嗎?不,還差很遠。不管是8位機還是32位機,它只是你解決問題的一個工具而已。很多人都會用C語言,但是有幾個人能用C語言寫出Linux和uCOS來呢?
所以,初學(xué)者的態(tài)度很重要。哪一款單片機不重要,只要你精通擅長一款,日后再用其他公司的那都是小菜一碟,進而學(xué)習(xí)32位的處理器也是游刃有余,輕松自如,否則,每個單片機對你來說,都永遠處于入門狀態(tài)。
一頁紙講清單片機
也許有人問:有沒有那么簡單呀?
當然不會那么簡單啦,首先你要把書讀薄,然后再把書讀后,最后把書放進自己腦子里,形成自己的一套思路。
理解任何一個事物,最好把握它的本質(zhì)。對于各個各樣的嵌入式微處理器產(chǎn)品,實際上用一頁紙就可以把本質(zhì)的脈絡(luò)說清楚。有這么神奇,嗯...我也是自己總結(jié)的,大家可以看看,加以斧正。
8位和32位機都可以看成是“內(nèi)核+外設(shè)”的結(jié)構(gòu),外設(shè)多,單片機就復(fù)雜些,總線位數(shù)高,運行就快一些。本質(zhì)上還逃不出這個架構(gòu)。對于設(shè)計人員編程來說,操作外設(shè)實際上就是讀寫各種特殊功能寄存器,傳輸數(shù)據(jù)就是讀寫總線,相應(yīng)外設(shè)就是處理中斷。除了這三大操作,好像沒有其他了。當然對于不同的外設(shè),其特殊功能寄存器的定義不同,中斷向量不同,操作流程不同,但本質(zhì)上還是在操作寄存器、總線和中斷。
有人不服說,不會吧,一定還有別的。當然有了,但對于初學(xué)者來說,不要鉆牛角尖,把常見的、大多數(shù)的東西把握了,慢慢再去研究小眾技能吧。上面講了這么多,實際上就想告訴初學(xué)者:嵌入式或者單片機的入門真的不難,但也不容易,需要你拿出態(tài)度來。我經(jīng)常對我的學(xué)生說:“單片機或者嵌入式這東西是入門難,到經(jīng)驗積累到一定程度就比較容易了?!?br>
一些不是建議的經(jīng)驗
1、從8位單片機入門比較好一點,選好一個型號,認真學(xué)習(xí),直到精通。
2、多練習(xí),多寫代碼,多上網(wǎng)看看博客,當然自己要有一塊學(xué)習(xí)板了。
3、掌握簡單常用的模擬電路和數(shù)字電路,比如:電阻限流、電容濾波、運放放大等等,將來你在設(shè)計電路和調(diào)試程序的時候都會用到。
4、精通C語言,特別是指針和數(shù)組,最好把預(yù)處理和編譯過程了解一下。
5、掌握一個電路設(shè)計軟件,對于單片機,其實會Protell99都可以了。
6、會使用萬用表,最好有示波器啦,而且要掌握一些常用的測試手段。
7、在自己學(xué)習(xí)過程中,整理并形成自己的元器件庫和常用程序庫,這是你進階下一階段成為高手的關(guān)鍵。
8、多看看各種單片機案例,掌握各種常用芯片的使用,嵌入式就是一個逐漸積累的過程。你的嵌入式技術(shù)有多高,就看你心里的案例與資源有多少?,F(xiàn)在各種功能都有模塊或?qū)S眯酒€都提供UR、SPI、IIC等接口。
表面上你用單片機在實現(xiàn)藍牙,實際上你只是在使用單片機的串口讀寫數(shù)據(jù)。如果說元器件電路模塊是硬件資源的積累,那么,常用接口模塊驅(qū)動程序則是軟件資源的積累。 將來在你的產(chǎn)品設(shè)計中,可能用到很多新的模塊和元件,只要它的接口是SPI接口、IIC接口、UR串口等你熟悉的接口,那么對于你來說,它就是一個舊模塊和元件。因為單片機實際上面對的不是模塊和元件,而是你熟悉的常用接口。
9、最好有做筆記的習(xí)慣,你也可以寫寫博客,這個到后面會有意想不到的作用。
經(jīng)典51內(nèi)核資源全覽濃縮圖
你不要當51單片機是高科技產(chǎn)品,請把它看作一款玩具。你不是在學(xué)習(xí)開發(fā),你是在玩“極品飛車”。學(xué)習(xí)會讓懶人痛苦,而玩耍會給懶人快樂,沒有愉悅的心情,還談什么學(xué)好學(xué)精?
經(jīng)典款51單片機都有什么東西?一張圖就可以告訴你...
<1> 四組8位并行I/O端口:
P0端口:PC門,集電極開路輸出,必須接上拉電阻才能輸出高電平。
P1端口:無特殊之處。
P2端口:訪問外部存儲器時,作高8位地址用。
P3端口:功能復(fù)用端口,詳情看表。
<2> 三大外設(shè):外部中斷、定時/計數(shù)、串行通信
<3> 五個中斷源:2個外部中斷、2個定時/計數(shù)中斷、1個串行通信中斷
注意:要記住中斷號與中斷源的對應(yīng)關(guān)系...編程時會用到!
<4> 三大特殊功能寄存器:TCON、SCON、TMOD
經(jīng)典型51單片機的重要外設(shè)歸納
不管簡單還是復(fù)雜的微處理器,其基本架構(gòu)都是“內(nèi)核+外設(shè)”,而控制外設(shè)的重要途徑就是特殊功能寄存器。作為一個嵌入式設(shè)計師,如果做底層的程序開發(fā),絕大部分的工作都在跟各種特殊功能寄存器打交道。
51單片機的外設(shè)不多,可以分成三大塊:中斷系統(tǒng)、定時/計數(shù)器和串行接口。
要想把這些外設(shè)應(yīng)用好,首先得把控制這些外設(shè)的特殊功能寄存器弄明白,其實也不多,就下面幾個:
IE寄存器:中斷控制寄存器。
IP寄存器:中斷優(yōu)先級寄存器。
TCON寄存器:中斷狀態(tài)標志寄存器。
TMOD寄存器:定時/技術(shù)模式控制寄存器。
THx和TLx寄存器:定時/計數(shù)器的技術(shù)初值寄存器。
SCON寄存器:串口控制寄存器。
SBUF寄存器:串行接口收據(jù)發(fā)送和接收緩沖器。
<1> IE寄存器與IP寄存器(IP用的不多)
<2> TCON寄存器
<3> TMOD寄存器
<4> SCON寄存器
程序設(shè)計要點
<1> 引入頭文件
在單片機的程序設(shè)計中,很多時候需要操作特殊功能寄存器,而這些寄存器實際上就是芯片中的一個內(nèi)存地址。我們要記住這些地址很難,而且代碼編寫也比較復(fù)雜。為了方便記憶和使用,我們給每一個特殊功能寄存器都起了一個名字。如果在程序設(shè)計中你想直接使用這些名字,那么你就需要引入對應(yīng)當芯片頭文件,例如51單片機,你需要引入“reg52.h”文件。
特殊功能寄存器P0的地址為80H,引入這個頭文件之后,你就可以使用P0這個名字了
P0 = 0x02;
<2> 中斷服務(wù)函數(shù)的格式
在51單片機中有5個中斷源,每個中斷源都有固定的入口地址(也就是中斷向量)和中斷號。我們在程序設(shè)計的過程中,不需要記住中斷向量地址,但需要知道每個中斷源對應(yīng)的中斷號(參考【經(jīng)典51懶人5步速成法-01】)
一般情況下,中斷的處理函數(shù)有兩個,其一為中斷初始化函數(shù),其二為中斷服務(wù)函數(shù)。初始化函數(shù)就是一個普通的函數(shù),而中斷服務(wù)函數(shù)卻有特殊的格式要求:
A. 中斷函數(shù)沒有返回值,也不能帶參數(shù)。
B. 函數(shù)名后面要跟一個關(guān)鍵字interrupt,說明這是一個中斷服務(wù)函數(shù)。
C. 在關(guān)鍵字interrupt后面要跟上中斷號,說明這個中斷服務(wù)函數(shù)是為那個中斷服務(wù)的。
中斷服務(wù)函數(shù)的格式為:
void 函數(shù)名() interrupt 中斷號
{ ----函數(shù)體---- }
例如,定時器0的中斷服務(wù)函數(shù),我們C語言可以這樣寫:
三大外設(shè)的開發(fā)與可重用代碼
在51內(nèi)核的單片機中,主要有外部中斷、定時計數(shù)和串行通信三大外設(shè)。在其他的嵌入式芯片中,這三個外設(shè)也是必不可少的。三大外設(shè)的程序設(shè)計實際上就成了51單片機最基礎(chǔ)核心,掌握著三個部分的設(shè)計思路是學(xué)習(xí)單片機開發(fā)的必經(jīng)之路。
編寫三大外設(shè)的程序?qū)嶋H上有很多類似的地方。它們都需要進行初始的寄存器配置,也就是初始化,它們都和中斷有關(guān),都需要編寫中斷服務(wù)函數(shù)。因此,對于每一個外設(shè),我們都需要編寫一個初始化函數(shù)和中斷服務(wù)函數(shù)。這些函數(shù)在不同的應(yīng)用工程中實際上都差不多,也就是說代碼的重用性很高。
1、外部中斷模塊
在51單片機中有INT0和INT1兩個中斷模塊,外部的觸發(fā)信號可以是電平,也可以是邊沿,由寄存器TCON的IT0和IT1位來決定。
2、定時/計數(shù)模塊
在51單片機中有T0和T1兩個定時器,對內(nèi)部可以定時,對外部可以計數(shù)。在初始化的時候,需要確定該模塊是定時功能還是技術(shù)功能,工作模式是什么,最大計數(shù)值是多少。
3、串行接口模塊
在51單片機的串行接口中,產(chǎn)生波特率需要占用定時器T1,發(fā)送數(shù)據(jù)時,將內(nèi)容放到SBUF中,數(shù)據(jù)發(fā)送完畢,TI會置1。當完整接收到一個數(shù)據(jù)后,RI會置1,這時從SBUF中將內(nèi)容讀出即可。不管是TI還是RI標志位,都需要人工清0。
一般情況下,發(fā)送數(shù)據(jù)采用查詢方式,接收數(shù)據(jù)采用中斷方式。
結(jié)束語
嵌入式應(yīng)用開發(fā)涉及的知識點很多,初次接觸往往感到無從下手。沒錯,與一些高級編程語言“易懂難精”的情況相比,嵌入式應(yīng)用開發(fā)的入門是比較難的,但是,隨著知識的積累和經(jīng)驗的豐富,后面的路會越走越寬,越走越順。廣大的嵌入式應(yīng)用開發(fā)入門者應(yīng)該充滿信心。我一直都認為嵌入式應(yīng)用開發(fā)就像一場馬拉松,必須一步一個腳印,積蓄能量,逐步進階,才能越走越遠的。