嵌入式是工科,工科講究實踐。說的再多、懂得再多,不能做出實際的東西,是沒有意義的。學習嵌入式的核心原則之一就是多動手寫代碼。另外還有一個原則就是:從淺到深學習。接下來的內容將貫徹這兩個原則。最后強調一點,各個方面的技術是齊頭并進的學習,而不是某一個方面學的非常好才去學習下一個方面。實際開發中,用到的技術會很多,我們只需要做好其中一部分就行了。
1 C語言
C語言是嵌入式開發必備的基本技能之一,對它的學習沒有盡頭,需要大家認真學習C語言。熟練使用C語言開發,這是嵌入式工程師的基本要求。
1.1 開發環境
學習C語言本身,可以使用各種工具鏈,這里博主比較推薦微軟的VS開發工具,在win下學習C語言。作為小白而言,簡單、好用的工具更重要,VS提供了開發C語言需要用到的各種工具。對于個人學習而言,社區版本完全夠用,可以在微軟官網下載到VS軟件。我使用的是VS 2019版本,也可以用其他的版本。
1.2 C語言入門
C語言的視頻B站很多,大體上沒有太大的差距吧(指內容),我自己也只是看過一些郝斌的C語言視頻,這個可以看看,我學習的時候更喜歡看書,主要是看書信息接受效率高。這里推薦一本C語言入門級別書籍:《C程序設計語言》,作者是布萊恩·克尼漢,丹尼斯·里奇。C語言創始人寫的一本書,非常經典,在世界上都享有盛名。大名鼎鼎的Hello world程序就是這本書提出來的。
這本書的經典程度網上一搜就有,這里就不在多贅述了,用它作為C語言入門書籍完全沒問題。書里面的代碼風格也是值得借鑒學習的,非常建議讀一讀該書。
1.3 C語言提高
對C語言基本的語法使用有一定理解之后,就需要對C語言進行提高了。提高階段,我推薦如下三本書:《C與指針》、《C專家編程》、《C陷阱與缺陷》。
這三本書應該讀哪個?
這三本書,我都研究過。三本書的內容有不少重復的地方,看完一本之后,另外兩本看的也挺快的。如果有時間的話,建議三本都看看,時間不夠的話,就只看《C與指針》這一本也行,這本書內容詳實,有入門有提高,從淺到深,也可以拿來入門C語言。至于其他的書籍,因為沒有過多研究,就不推薦了。
以上C語言的資料學習完成之后,基本上對于C語言有了較深入的理解了,應付平常開發應該沒有太大的問題。
2 stm32
stm32是目前市面上資料較多的ARM芯片(指Cortex-M系列芯片,這里不在贅述)了,用的人非常多,資料很全,遇到的各種問題在網上都可以找到解決辦法。有些問題真找不到的話,那就涉及到比較深入的領域了,也不是初學者該遇到的和能解決的。因此,建議以stm32為切入點,學習ARM 32位處理器的使用。stm32芯片有非常多的系列,每個系列又有很多芯片,這里推薦stm32f407的芯片(大部分人也是用這個芯片學習的),兼顧成本、性能、學到的知識,性價比高。下面談談該如何學習這款芯片(其他的芯片類似)。
2.1 stm32基礎
stm32芯片里面的內容其實非常多,但作為初學者,并不需要關心特別高深的內容。我們只需要掌握stm32常用的開發以及基本的知識點。根據自身的開發經驗和經歷,總結了如下常用的外設:GPIO、UART(串口)、中斷、TIMER(定時器)、AD、DA、SPI、I2C、PWM、DMA。這些外設都是非常常見的,基本上所有的ARM芯片都會有。上述外設的學習可以不分先后,但還是推薦按照上面的順序進行。
除此之外,還要學會使用一款開發工具鏈(推薦Keil,畢竟是ARM公司的)。能夠掌握基本的Keil使用方法就行了。比如多文件編譯、調試仿真、常見配置等。
學習完基本的外設之后,就可以動手寫一些簡單的項目,鞏固所學知識。后面我也會出一些文章,講解項目的思路,供大家學習。
2.2 stm32進階
以目前的招聘需求而言,學完基本的stm32內容已經無法滿足了(太卷了)。因此,需要開始往較深入的內容學習。這里我將進階路線分為如下兩條主線:軟件主線、硬件主線。
2.2.1 軟件主線
1. C語言:繼續往精通方向學習C語言,比如,C語言的高級用法,C語言是如何實現面向對象思想的,C語言代碼是如何控制硬件的,C語言代碼是如何使用內存的、代碼是如何在內存中布局的,C語言代碼是如何在芯片中執行的,這些問題都是需要深入研究的。除此之外,也應該學習下常見的數據結構,如鏈表、樹等。至于圖這種數據結構,太復雜的,別為難自己。
2. RTOS:除此之外,還要學習RTOS(推薦FreeRTOS,背靠亞馬遜,用的人多,資料也多,市場廣闊),并且應該往深入的地方學習RTOS,而不應該僅僅浮于表面。知道使用FreeRTOS怎么創建任務、信號量、互斥量、隊列等,這些只是表面,內部實現的原理和機制才是面試要考察的(畢竟所有的RTOS都類似,掌握了原理才能很快上手其他的RTOS)。而且這些原理性的知識是通用的,也是一個嵌入式工程師的內功,面試考察的就是內功。我們還可以借鑒一下FreeRTOS源碼中優秀的設計思想,用到我們的代碼中,一舉多得。
3. 中間件:有精力的話,可以學習一些常見中間件的使用,如emwin(寫GUI界面用到,或者LVGL也可)、Fatfs(文件系統,管理數據用的到)、Lwip(網絡協議棧,以太網通信用的到),這些中間件以會用為學習目的和標準,不需要深入研究,除非以后做這方面的工作。
2.2.2 硬件主線
stm32芯片的基本外設學完之后,我們還需要學習復雜的外設和芯片內部的一些內容。下面的圖,建議大家背下來,這是在學習的過程中畫的stm32芯片內部功能邏輯圖,具有普遍意義(針對Cortex-M系列芯片)
添加圖片注釋,不超過 140 字(可選)
我們學習的常見外設,只是掛載到總線(AHB、APB總線)上的一個個獨立的功能單元,CPU(圖中Cortex-M3就是芯片內部的CPU)如何與外設進行交互、芯片的調試系統、中斷系統、總線系統等等,還有非常多的內容需要我們學習。
在學習stm32的時候,我們會遇到一些比較復雜的外設,這里面時鐘系統(RCC)還是要學習的,RCC就相當于芯片的動力系統,連接著芯片內部的各個功能部件。除此之外,RTC(實時時鐘)、CRC(循環冗余校驗)、CRYP(加密處理器)、RNG(隨機數發生器)、HASH(散列處理器)等外設看心情學習。但比較復雜的,如USB、以太網、FSMC(靈活的靜態存儲控制器)、SDIO(安全數字輸入/輸出接口)、DCMI(數字攝像頭接口)這些復雜的外設,就不太建議學習了,可以了解下,不需要進行深入研究(學習成本高,真正用到了,學的那點也不夠,導致性價比太低)。如果以后想專精某一個方面,可以去學習。CAN總線用于汽車領域,如果不打算從事汽車領域工作的話,可以不用學習。stm32f407芯片的外設就這么多,都在上面講述了,各位同學根據自己的需求進行學習。
除了外設之外,M4內核還支持DSP指令集,這個用于對數學運算、控制運算、信號處理、數據處理等方面,也可以學習下如何使用。對DSP指令集的學習,只需要學習該如何使用DSP庫即可,庫里面的算法都是使用DSP指令集進行加速過的,我們只需要會用就行。
學習完上面的內容之后,也可以研究下CPU部分,如常見的堆、棧、流水線、寄存器、CPU現場等相關內容,這些在學習FreeRTOS時用得到,也是面試中常問的內容。
在軟件主線、硬件主線之間,還有一個就是工具鏈,主要是編譯器在鏈接期間的部分知識。這部分內容,也是我們經常用到的一些技能,如進行IAP開發、OTA開發等,還有一些特殊用途,也需要對鏈接階段進行改動,以滿足應用需求。
這里推薦幾本書:《Cortex-M3權威指南》、《STM32F4xx參考手冊》配合起來一起學習。
2.3 學習順序(重要,小白跟著做即可)
-
入門:首先要有C語言的基礎(能用基本的語法編寫程序即可),接著開始學習stm32的基本外設(常見的外設,上文中有提到)。這個時候可以做一些簡單的項目,鞏固下學習效果,學習stm32的核心原則之一就是多動手寫代碼。這里推薦江科大的視頻(B站有),市面上少有的精品、免費視頻了。收費的基礎課,我覺得都很難與其進行比較,看得出來,江科大的視頻是用心做的,強烈安利~。
-
提高:這個時候需要提高C語言(推薦的書都去看看,研讀一遍),先把C語言水平提上來,否則后續學習會因為缺少C語言基礎而非常痛苦。之后,再去學習FreeRTOS,或者也可以先去學習stm內核部分,這兩個先后順序其實無所謂的(反正對新手來說都是新知識,都不簡單^^),二者有些東西也是相輔相成的。
-
這個時候應該做一些有難度的項目,將自己學習的內容、技術體現在項目中,用于找工作。
學習到這里的話,基本上找工作已經沒啥太大問題了。
2.4 stm32深入
這部分內容屬于較深入的技術了,適合對技術(工資)有追求的同學,需要靜下心來,慢慢研究的技術。這些技術都是較深入的,如果連上面的內容(指入門、提高部分)都學不會的話,這些內容還是算了,別為難自己,即學不懂,學了也沒啥用(水平不夠,用不到)。這里只放一下學習大綱,有興趣的自己學習。
C語言
添加圖片注釋,不超過 140 字(可選)
芯片內核
添加圖片注釋,不超過 140 字(可選)
Keil提高
添加圖片注釋,不超過 140 字(可選)
FreeRTOS
添加圖片注釋,不超過 140 字(可選)
2.5學習路線思維導圖
在最后,放一個學習路線思維導圖,拿著這個,按照上面的知識點,一點點學習,肯定可以成為大佬(30K+)。
添加圖片注釋,不超過 140 字(可選)
03 淺談學習方法
學習stm32已經7、8年了,對stm32的學習也有一點心得,這里淺談下學習方法,僅供參考。
3.1. 挑選一個合適的開發板
作為一個初學者而言,開發板并不是越高端越好,能夠有基本的功能、滿足自身學習即可(土豪當我沒說)。我在第一次學習stm32時,就只買了一個核心板、一個TFT屏幕、一個J-Link下載器就開始學習了(大學的時候真是一個窮學生)。后續的學習過程中,缺什么就買什么,不重要的東西,基本上都沒去接觸(如can總線、以太網等)。
添加圖片注釋,不超過 140 字(可選)
添加圖片注釋,不超過 140 字(可選)
添加圖片注釋,不超過 140 字(可選)
這里給一個極致低價的stm32學習硬件:一個stm32核心板、一個st-link下載器、一個usb轉ttl(用于調試),這一套成本也就30左右(之前推薦過這一套方案,很適合窮學生(比如大學的時候),可以去某寶上找下。
一般而言,比較推薦用stm32f407入門stm32,這個芯片的性能較強、價格也夠低、性價比很高,除此之外,資料也很豐富,還可以用標準庫開發,某寶上一搜一堆。
3.2 動手實踐
嵌入式是工科,工科講究熟能生巧。在學習的時候一定不能偷懶,一定要多動手寫代碼。每學習一個外設都應該去動手寫代碼,將這部分功能的代碼調通。每學習一個知識點都應該寫代碼驗證自己的想法是否正確(到今天依然也是這樣學習,學習某個知識點之后,寫代碼驗證)。寫代碼寫多了,自然就能理解了。同時也要注意寫項目,鞏固已經學習的知識,順帶鍛煉自己項目整合的能力。
3.3 從淺入深
工科的任何知識學習都應該遵守從淺入深、從看得見摸得著的內容開始學習,逐漸過渡到看不見、摸不著的領域(這個時候只能靠自己的基礎,推理到這部分了,然后做實驗進行直接、間接驗證)。stm32的學習也是,從基本的外設開始,這些最容易看到(改個參數,就能看到現象),然后逐漸過渡到對內核的學習、對工具鏈、RTOS等一些比較深入領域內容的學習。
04 常見問題解答1
問:學stm32是用hal庫學習還是標準庫學習?
答:這里首先要明確一個概念,hal庫是st公司為自己家的stm32系列芯片開發的一套庫,一套庫兼容所有的stm32芯片,必然導致代碼臃腫(為了兼容性)。標準庫是st公司早期為stm32芯片研發的開發庫,目前只支持到stm32f429系列,再往后的stm32f7系列就只有hal庫了。hal配合cubemx開發,速度飛快,確實有多種優點。
但博主不推薦使用hal庫學習,理由如下:
1. hal庫是st的,只支持st的芯片,而我們以后開發芯片,不知道是哪家公司的,其他家芯片提供的開發庫更類似于標準庫(這里可以看出st真是有實力的巨頭)。
2. hal和標準庫差別不大,但hal學習起來成本更高(為了兼容性,使用了較復雜的軟件特性),而且會了標準庫,hal上手難度并不大,學習成本基本為0,過度平滑。
3. 最關鍵的,hal庫編譯太慢了,真的巨慢,比標準庫慢多了,博主當年的筆記本性能也是還可以的,也覺得編譯慢,無奈選擇標準庫開發(再吹一波cubemx,真的開發超快)。
我們從hal庫和標準庫本身出發,得到初學者更適合學習標準庫的結論。所以,作為初學者,別糾結了,無腦標準庫吧。當然要是實驗室的同學、或者老師、或者小伙伴都是hal庫學習,還是拿hal庫學習stm32吧,可以更好的交流。
問:學習stm32之前需要先學習51單片機嗎?
答:博主本人在剛上大一的時候,就開始玩51單片機了,博主確實是先學51單片機、再去學習stm32。所以我對這個問題還是有發言權的。結論是:沒有必要先學習51單片機。因為51和stm32差別太大了,我除了大一玩過51單片機,再也沒寫過51代碼,都已經忘了怎么寫了。stm32和51雖然同屬MCU,但就跟五菱和勞斯萊斯都屬于汽車一樣(沒別的意思,別亂想,僅僅比較價格而已),二者差別太大了。在51上面學習的內容除了外設原理在stm32上有用之外,基本沒啥太大用處了
但這些知識在stm32上同樣可以學習,所以大膽的學習stm32吧,現在招聘都要求會一款32位處理器。
05 常見問題解答2
在這一節中,我們簡單的聊一聊招聘市場的情況。經濟學里面有一個論斷:供需關系決定價格。對于我們工程師找工作而言,就是招聘市場上找工作的人與企業招聘人數,二者決定工程師的工資水平。我們工程師找工作靠的是技術水平(能做什么),技術水平的高低(準確的說是稀缺性)決定我們的工資水平。
-
3、5k薪資水平:這是絕大部分應屆生的水平。這些人大概會一些stm32外設的配置,使用這些外設,配合一些模塊(比如屏幕、藍牙、陀螺儀等等)做一些應用開發,做一些小項目。這種水平的同學,找工作其實比較難(因為大家都類似,企業憑什么要你),這是個很現實的問題。而且這種水平對應的工作也不會太好,一般就是3、5k的樣子,市面上一抓一大把。
-
7、8k的薪資水平:要想再進一步,就要學習更多的東西,比如RTOS。RTOS是一個非常好的技能點,它是和周圍同學、同事拉開差距的一個切點,也是關鍵點。能夠使用RTOS提供的功能,如任務管理、信號量、郵箱、互斥量等,可能還會配上其它的中間件,如LVGL,fatfs等,做一些項目,這種應屆生都是比較少的了。相比較前面那些同學,這種應屆生更容易找工作,但依然處于初級階段,依然還是做簡單的應用開發,并未涉及較深入的內容。
-
10k以上:若是想拿到這種水平的offer,就不能光局限在應用層面了。前面兩者都是在應用層打轉,并沒有涉及較深入的內容。我們需要了解RTOS內部的實現機制、實現算法,stm32內核(IAP是個好東西,非常適合作為深研stm32的切入點)。只有到這個時候,我們才算是開始真正具備走向一個技術大牛應該有的基礎。這個水平的嵌入式工程師,有了走向成為技術大牛的可能和基礎,已經在技術大牛的起點了。
-
20k以上:能在應屆生水平拿到20k以上offer的,都是有兩把刷子的。以博主本人為例,在2.4節提到的那些技術,博主都有所涉獵,不僅如此,我還在Linux驅動、嵌入式AI領域有所研究。2.4節提到的技術,可以說20K薪資只是起點了,以后30K、50K也可以理解為2.4節技術的深入研究了。
上面只是博主自己的理解,具體情況,各地可能都不一樣,不能進行統一比較,也可能說的并不對,僅供參考(希望大家也不要在這里較真,只是參考的數據)。