本節教你如何學習單片機,如何選擇合適的開發板和開發工具。
現在我們知道單片機是要學習的,那么怎么去學習單片機?在上一課我們說不要使用老一套的方法學習,實際上是指的兩個問題。
第一:選擇什么開發板;
第二:使用什么開發工具;
我們學習單片機的目的是干嘛?目的是為后續嵌入式Linux學習服務。
在這條學習線路上:
單片機->bootloader->Linux系統/驅動->APP(QT) 可以使用同一套開發板。
我們選擇開發板的原則是:資料豐富。
開發板首推三星 (SAMSUNG)系列的,資料最開放,
* 有S3C2440、S3C6410、S5PV210、Exynos4412;
* 然后是德州儀器 (TI)的,TI開始不開放資料,現在逐漸公開了,有AM437X、AM335X;
* 然后是飛思卡爾(freescale),有iMX6;
* 還有其它國產芯片:全志、瑞芯微;
我們用百度進行搜索,看哪個資料最豐富。結果如下:
再在搜索關鍵詞中加入“教程”后,S3C2440的搜索結果比AM335X更多,因此S3C2440的資料仍是最多的,TI的營銷更好,當然,TI作為工控板,其用戶也是很多的。
所以,從教程的豐富程度來看,S3C2440為首選開發板;
我們后面會考慮使用TI的芯片重新錄制一套視頻,但需要2-3年的功夫,所以,現在還是使用S3C2440吧。
現在普遍有個錯誤觀點:S3C2440過時了,它還是ARM9內核,現在Cortex-A7、 Cortex-A8、 Cortex-A9、 Cortex-A15都出來了,它的性能太差了。
性能差沒錯,但它是否過時了呢?
那要看學到的知識是否過時。
我們首先來看看一個芯片是怎么組成的,里面有CPU、外設串口、I2C、SPI、LCD等。
我們寫程序的時候,是去操作這些模塊的寄存器,訪問這些模塊,並不是去操作CPU。
等你工作的時候,你使用不同的芯片,那么差別在於這些模塊,這些硬件的操作,差別不在CPU操作,你寫程序的時候,根本不涉及CPU的內部機制。
**不同芯片的差別:
在於外設操作,不在於CPU,寫程序幾乎不涉及CPU,只有涉及中斷時,才會跟CPU的機制有點關系,但是不同CPU的架構差異很小,並且我們后面開發Linux驅動時,內核已經幫我們做好了這些處理,根本不需要去關心。**
從上一課我們知道,驅動=軟件框架+硬件操作。這個軟件框架對於所有的芯片都是一樣的,因為都是用Linux內核。
而這個硬件操作,你在2440上掌握了串口操作,I2C操作、SPI操作,掌握了這些硬件的語言,你換一種芯片,是完全類似的。
我假設你選擇了2440開發板,那么怎么使用2440開發板來學習單片機的開發呢?又使用什么開發工具呢?
以前在Windows開發的時候,我們使用ADS、Keil、MDK等,你直接寫個main()函數,所有的細節都幫你實現了,誰來調用main()函數,有他幫你做了。這main()所生成出來的代碼,怎么放入到內存里面,這工具也幫你做了,我們基本上只需要寫main()函數,只需要寫C語言就行了。但是這里掩蓋了太多的技術細節,你看看我們官網->學習路線 的這篇文章,里面有個比較:
① Windows下的單片機學習,深度不夠
- Windows下有很好的圖形界面單片機開發軟件,比如keil、MDK等。
- 它們封裝了很多技術細節,比如:
- 你只會從main函數開始編寫代碼,卻不知道上電后第1條代碼是怎么執行的;
- 你可以編寫中斷處理函數,但是卻不知道它是怎么被調用的;
- 你不知道程序怎么從Flash上被讀入內存;
- 也不知道內存是怎么划分使用的,不知道棧在哪、堆在哪;
- 當你想裁剪程序降低對Flash、內存的使用時,你無從下手;
- 當你新建一個文件時,它被自動加入到工程里,但是其中的機理你完全不懂;
- 等等等。
② 基於ARM+Linux裸機學習,可以學得更深,並且更貼合后續的Linux學習。
- 實際上它就是Linux下的單片機學習,只是一切更加原始:所有的代碼需要你自己來編寫;哪些文件加入工程,需要你自己來管理。
- 在工作中,我們當然傾向於使用Windows下更便利的工具,但是在學習階段,我們更想學習到程序的本質。
- 一切從零編寫代碼、管理代碼,可以讓我們學習到更多知識:
- 你需要了解芯片的上電啟動過程,知道第1條代碼如何運行;
- 你需要掌握怎么把程序從Flash上讀入內存;
- 需要理解內存怎么規划使用,比如棧在哪,堆在哪;
- 需要理解代碼重定位;
- 需要知道中斷發生后,軟硬件怎么保護現場、跳到中斷入口、調用中斷程序、恢復現場;
- 你會知道,main函數不是我們編寫的第1個函數;
- 你會知道,芯片從上電開始,程序是怎么被搬運執行的;
- 你會知道,函數調用過程中,參數是如何傳遞的;
- 你會知道,中斷發生時,每一個寄存器的值都要小心對待;
- 等等等。
- 你掌握了ARM+Linux的裸機開發,再回去看Windows下的單片機開發,會驚呼:怎么那么簡單!並且你會完全明白這些工具沒有向你展示的技術細節。
如果我們基於ARM+Linux,不使用這些Windows工具,你可以學得更深,並且單片機的大全Bootloader,他就是ARM+Linux開發的,他並不使用Windows下的工具。
你基於ARM+Linux學裸板、學單片機,你可以學得更多,因為我們一切都從零開始的。我們既管理這些代碼,也可以知道芯片上電的時候做了什么事情,知道程序自己怎么把自己讀到內存,且知道怎么去規划內存,知道怎么代碼重定位……
我說的這些概念,你可能聽都沒聽過,這是因為Windows下這些好用的工具把這些統統都給屏蔽了。
我們使用ARM+Linux進行裸板開發,一旦掌握了ARM+Linux開發這套機制,再回過頭去看這些Windows工具、看STM32的話,你只需要幾分鍾就可以搞定。
並且你可以無縫進入后續的學習,因為你已經熟練掌握了Linux的操作環境,后面的Bootloader是在Linux下開發的,后面的Linux驅動也是在Linux下開發的。
所以我們怎么去學習單片機的開發呢?
使用S3C2440開發板,在Linux環境(Ubuntu)下使用arm-Linux-gcc工具來編譯程序。
你編寫代碼的時候,可以使用Windows下各種好用的工具,文本工具等,但編譯的時候,使用arm-Linux-gcc來編譯