為什麼沒前途也要學習單片機,會給你後半生享福
///插播一條:我自己在今年年初錄製了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以哦~點我頭像黑色字體加我地球呺也能領取哦。最近比較閒,帶做畢設,帶學生參加省級或以上比賽///
為什麼沒前途也要學習單片機?
因為它是個很好的入口。
學習單片機可以讓我們拋開複雜的軟體結構,先掌握硬體操作,如:看原理圖、晶片手冊、寫程序操作寄存器等。在上一節視頻里,我剛把單片機貶得一無是處,說單片機沒前途了,這節視頻,我又要告訴你們,沒有前途,也要學習單片機。為什麼?
首先,我說不用學習單片機,是指不要使用老一套得學習方法學習單片機。什麼叫老一套的方法?
·硬體上:不要使用C51、STM32這些專用的單片機開發板。如果以後,你不打算從事單片機開發,你用這些晶片幹嘛,研究了兩三個月,把這些寄存器都用清楚了,你又用不上,沒必要啊。
·軟體上:不要使用Keil、MDK等集成度太高的軟體。你用這些軟體,你寫個main()就可以了,然後調用各種庫,進行傻瓜式操作。這些好用的工具,封裝了很多技術細節,使得我們沒法了解裸機、單片機的本質。
以後我們會使用新一套的方法來進行單片機的開發。新一套的方法,我們後面再介紹。
我們之所以還要學習單片機,是因為它裡面的知識,對我們後續學習Linux還是有用的。我們首先來看看,一個Linux系統是怎麼一回事。一個嵌入式Linux系統的軟體組成:單片機大全Bootloader–>Linux驅動–>Linux APP–>Linux GUI(Android/QT)。我們PC機一上電的時候,黑色螢幕上會顯示BIOS,這個BIOS目的是去啟動Windows內核。Windows內核再掛載C盤(系統盤)、D盤(應用盤),最後再去啟動應用程式,像QQ、網遊等。同樣的道理,我們的Android手機或者工控設備,也有BIOS,但嵌入式Linux系統裡面不叫BIOS,叫Bootloader,他的目的是去啟動Linux內核。它首先也是識別應用程式所在的存儲設備,掛載根文件系統(在Windows系統裡面的C盤、D盤,在Linux裡面稱為根文件系統)。最後去啟動應用程式。
仔細的分析下Bootloader,它去啟動內核,它去哪裡啟動內核呢?顯然是去某個地方讀出內核,就比如說BIOS是去C盤上讀出Windows內核,我們的Bootloader是去Flash或者SD卡讀取內核。因此Bootloader要擁有讀取Flash或者SD卡的能力。有些Bootloader還要顯示logo,因此還要具有操作LCD的能力。Bootloader還要設置開發板的環境,比如,初始化時鐘、初始化內存、還要設置網卡等。這麼多事情,都是在Bootloader裡面實現的,太複雜了,如果你一來就分析整個Bootloader是非常困難的。
那我們怎麼學習呢?把他拆開,寫出單獨的程序,比如:LED點燈、時鐘、網卡、Flash都單獨寫個程序來練習,這些不就是單片機程序嗎?所以說,Bootloader是單片機程序的大全。我們為了更好的學習Bootloader,我們應該事先一個一個練習硬體,當我們熟悉每個硬體後,再組合起來,就是一個Bootloader。
我們再來看看Bootloader啟動內核之後,內核再去掛載根文件系統,意味著內核也要有操作硬體的能力,這就是驅動程序。我們首先來看看一個簡單的驅動程序是什麼樣子。首先我們的應用程式是調用open()、read()、write()這些標準的接口去訪問硬體。那麼就進入驅動程序裡面,驅動程序裡面有對應的drive_open()、drive_read()、drive_write()。最後在驅動程序裡面,去配置硬體。比如一個LED點燈驅動,那麼drive_open()要把GPIO設置為輸出引腳,drive_read(),返回GPIO狀態,driver_write()則寫GPIO,讓引腳輸出高電平或者低電平。
對於我們的LED驅動程序,你需要提供drive_open()、drive_read()、drive_write()這些接口,這就是它的框架。具體的怎麼操作硬體,就是硬體操作。所以說,我們事先在單片機裡面,熟悉熟練的掌握硬體操作。即驅動程序的組成:
驅動程序=軟體框架+硬體操作
你需要學會看原理圖、看硬體怎麼連接、看晶片手冊、知道怎麼讀寫寄存器。這一切都可以先在單片機裡面學習,去掌握。以後學習Linux驅動時,把重點放在軟體框架就行了。
我們可以事先學習單片機,單片機的學習可以讓我們先拋開複雜的軟體結構,先掌握硬體的操作,如:看原理圖、晶片手冊、寫程序操作寄存器等。這就是為什麼單片機沒有前途,我們也要學習。是因為他裡面涉及的硬體操作,對我們後續的學習,非常有用處。