當我們談單片機的時候,我們在談些什麽?
單片機是什麽?你可以理解為它是一臺微型的電腦,沒有IO設備的電腦。為什麽這樣說,我們可以來對比一下。
個人電腦的主要硬件如下:CPU 內存 硬盤 鍵盤 顯示器
單片機主要硬件:CPU RAM ROM
其中ROM用來存程序代碼,CPU用來進行數據的處理,程序執行時程序先裝入RAM中,產生的中間數據也在RAM中。這裏一對比,RAM與內存,ROM與硬盤,CPU之於CPU,一目了然。兩者相同的地方是這裏,不同的僅僅是單片機沒有鍵盤與顯示器。
如果你給單片機配上矩陣鍵盤,配上LCD顯示器,加上適當的程序,一個單片機就能實現你按下鍵盤,然後顯示器上顯示一些字符的操作。
就這麽一個小小的單片機就能實現鍵盤輸入然後顯示操作,很奇妙吧?
那這個東西既然是微型電腦,那它能不能有操作系統呢?答案是可以有,一般像STM32這種比較強大的單片機可以有RTOS系統,更有厲害的人,可以在這個STM32上跑Linux系統。 你看,單片機配上了鍵盤,顯示器,操作系統。是不是就和電腦差不多了?
這是從一個大眾角度去看單片機。那麽對於工程技術人員來說,單片機是一個怎麽樣的存在呢?
一般在工程中,單片機用來接收數據,加以處理,然後輸出一些控制信號並且可以顯示數據處理的結果。這整個過程抽象為 數據輸入->數據處理->數據輸出。深刻理解這個過程,單片機怎麽用就比較清晰了。
數據輸入,從哪輸入呢? 傳感器啊,很多種類的傳感器,溫度,濕度,煙霧濃度,光強,超聲波,酒精濃度,這些傳感器測出了某個指標的模擬量,然後轉化為電信號通過單片機的引腳輸入進單片機。然後單片機對這些數據進行一些處理,這就是一個數據處理的過程。接著這這些數據轉化為我們人容易看的數據加以顯示,這就是一個數據輸出的過程。這就是用單片機搭建了一個測量系統。
在這個過程中我們需要做什麽呢?
首先傳感器部分,你需要編寫代碼來驅動這個傳感器,讓它知道該怎麽測量,測量以後數據如何回傳,這個就是傳感器的驅動代碼。
接著數據傳入以後,你要處理啊,怎麽個處理方法?所以這個時候你要編寫數據處理的代碼,即數據處理模塊。
然後是處理好的數據要顯示吧?可能還要上傳到某些設備上去,這時候你就需要編寫的數據輸出代碼。
最後,單片機還要根據數據處理的結果來產生相應的控制信號,比如說某個測量指標超標以後,單片機某個引腳電平發生變化,然後硬件會產生相應的動作來執行某些動作,這個根據處理結果來決定是否產生控制信號的代碼,也是工程技術人員的任務。
綜上所述,一個單片機的測控系統,要做的事情就是這些,要做好這些,也並不是很容易。
你看,你傳感器回傳數據給單片機這涉及到通信吧?那通信協議也要了解,UART,SPI,I2C這些常用的通信協議你要很熟悉。
給傳感器寫驅動程序,那這個傳感器的數據手冊你要拿來看吧?那時序圖和真值表你要會看,很多手冊是英文的,你英語也要過關。
然後數據處理模塊,這又涉及到算法,怎麽處理?這個是需要你認真思考的,處理數據的這個算法應該是精華所在。
你如果要顯示,你還要會寫顯示設備的驅動程序,這也需要你看數據手冊了。
如果你想要將處理好的數據給通過網絡發出去,你這時候又要懂TCP/IP協議吧?再提一些,CAN總線協議,藍牙協議,你都要清楚吧?
這整個的過程都依托於C語言上面,所以你C語言要比較熟練吧。
所以這整個過程不是很容易的,要求你會不少方面的技能。這些你都做好了,可以算是一個比較可以的“電子碼農”。為什麽這樣說呢?因為這些東西很多人都可以來做,電子系的學生基本都可以來做這些。那麽怎麽樣才能擺脫“電子碼農”這個群體呢?
這個時候就需要一些真本領了,這些真本領包括:數字電路,模擬電路,電路理論,PCB板的繪制,對單片機的深度理解。
數字電路的一些東西你要很清楚,組合邏輯電路,時序邏輯電路,數據選擇器,邏輯門更不必說,為什麽需要了解這些? 你單片機和外部設備通信,外部設備不少都是數字IC芯片,都是數字電路的範疇,前面提到的時序圖,真值表,也是數字電路的範疇。時序邏輯電路的基本元件,鎖存器,觸發器工作原理你要明白,你要會觸類旁通。啥意思?單片機裏面不有RAM嗎? RAM能存儲運算的一些中間數據,那它就是存儲電路啊! 這不是就是鎖存器,觸發器的作用嗎?你不懂數字電路,只知道RAM能存儲數據,卻不知道為什麽能存儲數據。那這就是匠人和大師的區別之一。
模擬電路就更重要了,與非門這些邏輯電路的實現就是依托於模擬電路,那隨便說一些典型的單片機的一些模擬電路結構你要知道原理並且會運用,比如說開漏輸出,比如說推挽輸出。 再比如說,單片機端口很多都加了上拉電阻,那為啥要加上拉電阻,你能解釋原因嗎? 那還有下拉電阻,啥時候要加下拉電阻你知道嗎?為什麽要加下拉電阻你又明白嗎? 晶振旁邊要加倆電容,為啥加電容,電容加多大你會算嗎? 某一天你自己設計電路的時候這些都需要你來決定。
PCB板子的繪制,工作以後,自己做產品你當然需要自己繪制PCB板子了,那麽繪板軟件你要會使用吧?
那麽啥是對單片機的深度理解呢? 這就涉及到底層了,你要對單片機內部的資源非常了解,才能叫深度理解。
我這裏以STM32單片機來說明一下這個問題。
很多人學STM32就只會按照歷程改一改代碼,學一下庫函數,然後跑一下代碼,這樣學出來就不算精通單片機。很多人連模塊的寄存器都不清楚,也不會用,模塊原理也不清楚。
比如GPIO模塊,這裏常用的寄存器有CRL CRH ODR IDR BSRR BRR,GPIO的內部電路是怎麽樣的?為什麽會有推挽輸出,開漏輸入,模擬輸入,上下拉輸入,這些電路是什麽樣的,怎麽起作用的? 我提到的一個是寄存器,一個是內部電路。很多人都不太了解,只會用庫函數操作一下。 那這就很沒意思了,如果我需要高效率的代碼,我需要更小的代碼,不能用庫函數的時候,那這些只會操作庫函數的人就懵了。 你也可以對比一下用庫函數點一個LED和直接寄存器點一個LED生成的代碼的大小有多大的差別。
對單片機的深度理解就是對單片機內部模塊,GPIO,中斷,定時器,ADC,PWM等等這些模塊的寄存器的熟悉,對這些模塊電路的了解。如果能做到這些,那才算對單片機有一個比較深度的理解。
總結一下,對數電,模電,PCB板繪制,以及單片機本身的深度理解,做到這些以後,算是有了一個進階。從電子碼農進化到了一個單片機老手的水平,接著就是要多在項目中進行一些鍛煉,逐漸的非常熟悉各種外設的使用,達到信手拈來的水平就很厲害了。
接下來的要再怎麽進階呢?
這時候要上操作系統啦。學一下RTOS,這時候要開始補操作系統的知識啦,然後看源碼,估計算法和數據結構的知識也要補一補啦。
接著學一下Linux系統,這個時候內核的裁剪,移植,uboot的移植,文件系統的創建,等等這些又是一個新起點去學習。
這時候需要高級點的板子啦,帶MMU的芯片才行(高手可以在Cortex-m3上跑Linux,Cortex-m3是沒有MMU的)。我記得ARM9以及以上的芯片才帶MMU。
這個階段應該算是嵌入式的入門了,後面的我也不太清楚了,慢慢學習,再慢慢更新。
我還只是一個在校的大三學生,文中有不對的地方,還請技術大牛批評指正,感激不盡。
當我們談單片機的時候,我們在談些什麽?