如何系統地入門學習stm32?

電子信息工程大一,讀完了 《C primer plus 》《c與指針》《新概念51單片機C語言教程》,簡單的把郭天祥的51視頻看了一遍,常式也大多能敲出來,總感覺如果看視頻的話效率太低了,想知道各位如何系統的自學stm32的(題主現在手頭有一塊開發板)


不要去學STM32。

我不是說STM32不好,而是這種為了學習單片機而去學習單片機的思路不對

你問,如何系統地入門學習stm32?

本身就是一個錯誤的問題。假如你會使用8051 , 會寫C語言,那麼STM32本身並不需要刻意的學習

你要考慮的是, 我可以用stm32實現什麼

為什麼使用stm32而不是8051? 是因為51的頻率太低,無法滿足計算需求?是51的管腳太少,無法滿足眾多外設的IO? 是51的功耗太大,電池挺不住?是51的功能太弱,而你要使用SPI、I2C、ADC、DMA? 是51的內存太小而你要存儲的東西太多?

當你需要使用stm32某些功能,而51實現不了的時候, 那stm32自然不需要學習,你會直接去尋找stm32某方面的使用方法。比如要用spi協議的網卡、要使用串口通信、要使用rtos等等...

關於寄存器vs庫

我的觀點是:當你debug的時候寄存器很重要,當你需要理解晶元工作細節的時候寄存器很重要,當你開發的時候寄存器不重要。如果你沒有遇到非直接配置寄存器不可的情況,那麼就不要直接面向寄存器層面開發, 因為面向寄存器開發獲得的好處往往抵消不掉這樣做的壞處。 面向寄存器開發程序效率高,但是你需要為了提高0.01%的效率浪費10倍、乃至100倍的時間。 既然ST公司已經給你提供了好用的庫,沒有道理要重新造輪子。

那什麼時候必須直接控制寄存器?

第一、某一個代碼塊調用非常頻繁。比如你有一個巨大的for循環,那麼這個for循環中的每一步操作都應該被謹慎的優化,優化良好就可以獲得更好的性能。這種情況一般常見於圖像處理相關的代碼中。

第二、庫函數有bug。這個遇到的概率非常低,但確實存在。不過一般來說如果mcu表現出預料之外的行為, 你首先要想的應該是你的代碼寫的有bug,而不是庫函數有bug。 如果庫函數真的有bug,你去google搜一下,相信你絕對不是第一個踩坑的人。

對於傳統的電子工程師來講,使用庫編程可能會感到有一點虛,感覺沒有腳踏實地的感覺。 但如果你寫過web、寫過伺服器端代碼、寫過桌面端代碼的話,你就一定會理解API、封裝、抽象的意義。


哇,謝邀

第一次受邀回答問題,感覺壓力好大……【驚訝臉】,我這個半桶水沒多少才學,先佔個坑,晚上電腦補上,請大神們先答

=====================5.22晚 更=======================

嵌入式搬磚道路上的大三狗一枚,撐死算個初學者吧。才學有限,下面僅僅是本人對STM32學習的一點心得建議,希望對題主有幫助吧。

心得

本人當初學習STM32的時候有一些跟風的因素,自以為學的晶元越多就越厲害 =_=、 其實,學習嵌入式重要的是整體的工程思想和項目經驗積累,說到底這些晶元,我感覺學習起來都差不多吧,無非就是對內資源(寄存器、中斷、定時器、串口等等),和對各種外設的操作而已,掛載的外設越多,系統會越複雜,這時可能會用上操作系統,同時,如果工程中涉及到各種演算法、自動控制、採樣、濾波等實際問題的時候,不僅會上操作系統,而且還對數學、物理、電路等方面知識要有較強的功底,對編程的能力的要求會更高,此時就要求對STM32的各種資源有比較明晰的了解了。

回到問題,題主問:如何系統的學習STM32?

(這個問題,,,講句實話,以本人的水平,真的不敢強答 =_=,才學有限,僅僅提幾點建議吧)

建議:

1、要動手實踐,要動手實踐,要動手實踐!

下面有位答主也提到了,工科類的東西光看是不夠的!演算法如何實現,自己獨立設計再動手去敲一敲就知道了;外設如何驅動,找到晶元手冊,照著時序圖自己敲一遍;涉及到操作系統部分的內存管理與進程調用,找到源碼仔仔細細研讀幾遍(自己應該寫不出吧 =_=),相信你一定會很有收穫的,可能我這個方法比較笨,但是確實挺實用的,個人覺得。

2、準備好資料與開發板

相信很多人都有這樣的意識吧,學一款晶元首先想到的是買一塊開發板,對的,沒錯!巧婦難為無米之炊嘛,這裡推薦兩本書《C和指針》、《Cortex-M3權威指南》和《STM32庫開發實戰指南》網上都有PDF版本,結合自己的開發板配套的視頻教程(某火的講的就不錯,需要的話私信發給你),先要理解透徹,然後自己獨立去敲一敲,觸類旁通,例子上給出的都不會很難,知識的拓展很重要,就是舉一反三。還有,不懂得話就多去各大論壇大神虛心請教,論壇里有很多經驗帖子值得學習。

3、庫開發與寄存器開發?

現在STM32入門門檻都不高,稍微有點C語言和單片機基礎的都能學,有人說:寄存器操作那麼複雜難懂,那一堆寄存器名字都記不住,,,那寄存器開發是不是就不重要了?顯然不是,我會說大牛與菜鳥的卻別就在這兒?儘管我也很菜。。。建議:庫開發為主,看寄存器是為了理解實現的原理,所以寄存器部分不能丟了。有餘力可以深入學習下,這對M3內核的理解很有幫助,以及後面ARM系列晶元的學習都很有幫助。

4、多做東西。在實際工程項目中去鍛煉能力

題主才大一,若對這一塊感興趣的話,可要把51單片機的知識深入透徹地學紮實喲,這是基本功。盡量爭取加入實驗室,跟著學校實驗室的老師、學長,學姐,並積极參加校內外組織的各種比賽,如電賽、全國STM32大賽,飛思卡爾智能車,四旋翼等等。一開始不懂沒關係,只要他們不嫌棄你,積極好學、不要怕苦!(在實驗室里要謙虛、好學、低調啊,切勿裝逼!否則被打臉是很慘的,別問我怎麼知道的 =_=........),有條件的話,可以組建團體去接外面的項目,當然要經過老師同意,或者代做畢業設計也是條財路 【 手動斜眼】

5、勤總結,有整體思想。形成自己的總結文檔、代碼風格

可能很多人都沒有這個習慣,包括當初本人自己,拿到一個課題或者項目的時候,大概寫一下流程,就開干,途中遇到很多問題,程序改了又改,從v1.0改到v10.0都還有BUG,,,究根到底,還是自己學得不夠透徹不夠紮實,沒有一個整體的概念,知識零散雜亂,不成體系。有時候,程序框架、流程都沒有錯,就因為時鐘PLL配置上的衝突,導致一個禮拜BUG找不出來,,,所以,形成良好的編程習慣、勤寫注釋、善於總結真的很重要!最好能形成文檔,這絕對是最好的經驗積累形式!

暫時就寫這麼多吧,本人才疏學淺,如有不對之處望大神斧正

都這麼晚了,點個讚唄,,,倫家明天還要上課呢,,,,(哭


講一下個人經歷,大學學習51的時候無意中發現了stm32的程序,哇,好厲害,好多io,好多寄存器,讓後把各個常式都抄了一遍(主要部分),分析一遍功能是如何實現的,分析庫函數,找到具體的寄存器實現,與晶元手冊一一對應,果然一個不差,從此整個人對嵌入式軟體開發感覺就不一樣了。

之後買了個開發版,都沒怎麼用,感覺源碼都是現成的,不用跑都知道結果,懶得調了,玩遊戲去了。

再之後學了ad軟體,學校就教一些基本用法,學的雲里霧裡,直到畢業找工作,沒啥實際經驗,碰了幾次壁,虛了,畢業設計做個電路板充數吧,翻出以前開發板文件找到了原理圖文檔,查晶元,陰差陽錯在網上找到了stm32元件庫文件,一番折騰還真畫出了一個stm32f103rbt6系統板,雖然只有最小系統,電源模塊和幾個介面引出,但經過買元件,投板,焊接,並最終將程序下載成功後,心情還是非常激動的。這也是我硬體開發一個開始。

之後拿著板子招搖撞騙,總結應聘經驗,成功混入一家做stm32的初創企業,在這裡,我才明白了stm32軟體調試的困難所在,不僅僅是外設,而是多個外設共同協調工作,也有諸如lwip,ucos這些大的源碼進行分析,想起以前抄程序的自己,咬咬牙,繼續一點點進行分析。

再之後,往電子行業深處學習,學習多層板,高速電路的設計,技術看上去高深莫測,但我曾經自己就把stm32整出來了,這些肯定也能行。

現在,還在尋求發展機遇,但我每一份簡歷的第一句話永遠都是:精通stm32單片機開發。


大一學STM32,本來就不是一種系統學習的行為。所謂的系統學習,是要你好好學習模電,數電,微機原理等等專業基礎課。學習模電,你會了解上拉電阻下拉電阻的區別,運算放大器的使用,AD/DA轉換的原理。學習數電,你會了解時鐘的含義,各種分頻電路的原理。學習微機原理,你將了解MCU的工作方式,內存和FLASH的區別,還有SPI,IIC等匯流排協議。把這些學得差不多後,再花上一到兩周熟悉STM32的編程格式,也就是庫函數,之後就是各種抄常式。

嗯,本科要做點小玩意,會抄常式也就夠了。如果要深入了解,還得看它的官方手冊。

——————————————————————

另外補充一下,如果真的只是按部就班照課本的進度學習,那基本是記不牢的,所以確實還是要多寫代碼啊。


你為什麼要學stm32?

額。我的理念是事件驅動模式。有事做就學相應的技術,不然就自己倒騰自己的,可能是底層的理論,可能是代碼簡潔之道什麼的。

不過從你的情況來看,為啥不好好學學單片機?晶元這種東西是學習幾個典型的東西,然後掌握那些協議組件什麼的就OK了。

最後,40塊錢買一本野火的書照著做就好了,如果你理解單片機的一些東西的話,會學習的很快


不要學,要去用,工具是拿來用的,關鍵是演算法。還有我想題主已經中了郭天翔的毒了,要定時吃藥。天天玩單片機,大學就廢了。


資深單片機工程師,現在大學任教嵌入式課程,如果你把stm32當成單片機原理來學,那就太膚淺了,學號控制類cpu編程,功夫在課程之外,也就是說電路電子基礎要好,你才能正確領悟stm32內部特性,例如ad採樣時間的選擇,沒有電子基礎很難理解


我竟然是受到了邀請,這是怎麼回事?榮幸。嘻嘻,既然邀請了我說點了。。。

去年 下半年學了半年的51,大概知道了中斷什麼的,今年因為要去比賽,比賽使用的ht32,跟stm32一樣的內核,就看了點stm32的知識。。。。哦,偏題了說正事:

就我現在的水平就只能給你說說看看哪些書,怎麼能看懂一些不理解的名詞了

好了,開始。我這裡說的差不多都是看的網路大神們的建議。(以下個人意見)

1、要會用ide,就怎麼建立工程,怎麼調試,基本的調試會,什麼單步,什麼看外設的寄存器狀態呀!(當中可以去寫個簡單的點燈增加信心哦!我就是這樣,穩不住,一個字:急)你C語言肯定沒得問題。

2、推薦去看

這本書 哦!把中級的的做一下。就是這些,但是前面的也要看看哦

做完應該有好多的認識。

3、在就應該去看看《Cortex-M3權威指南》等內核的書。

我也是新手。我這就stm32寫個流水燈,應該就不太會。而且沒你那麼好的C語言基礎。對了。還有個建議就是一定要好好的去理解下那個時鐘的配置,我感覺哪裡就會用到時鐘的配置。有新感想在補充了。。。。重在堅持(也是說給自己。。。)那顆搗鼓的心。。。。!^_^!


講4點

自己找項目,邊做邊學。建議按照原子哥的視頻來學習。

使用庫函數而不要去使用寄存器開發,除非自己寫板級驅動包。老的庫用的人多,資料多,現在的hal庫可以直接用cube,易移植,不過資料少。

用c開發,關鍵是把c學好,良好的編程習慣會受益一輩子。

多看別人寫的程序,學習他人優點。


謝邀,第一次被邀回答問題。首先我覺得題主應該適當改變一下學習方式,在大學學習不同於高中,很多東西不是靠看書就能學好的。工程學科講究的是實戰和理論結合,既然你已經學過郭天祥的書想必或多或少也對這個領域有了一點了解。不管是晶元還是語言都只是工具,stm32相比於51,在實際使用時主要體現在對片內和外設的操作上,建議你弄一個板子,結合常式自己去寫,記住,晶元手冊永遠是最重要的資料,要學會結合程序閱讀手冊。再就是跑一些實時的操作系統,理解其和裸跑的區別,學會在操作系統下編程的方法。整個過程舉一反三很重要,永遠別死學,最後就是一點建議,不要盯著晶元學,那樣學到只是重複性的技能,玩過幾款典型的即可,重要得是基本功的培養和思想的提升。

暫時想到這麼多,祝好。


同意 @劉金承 ,「所謂的系統學習,是要你好好學習模電,數電,微機原理等等專業基礎課」,所以現在學習32更多是為了使用它。我猜題主主要還是想用來參加比賽吧。如果只是為了拿獎保研的話,專心研究庫函數,研究該常式就行了。但是,32這麼好的東西,真要學好的話,真的能提升對相應專業課的理解啊。如果真的要學好32的話,積累相應的數電模電知識(現在不用追求系統性啊,要用什麼記點什麼)之外,關鍵要學會看參考手冊。學會看參考手冊也意味著你可以很快上手其他類型的控制器了。然後野火原子的書可以參考下,但是還是以官方文檔為主啦。與君共勉,加油


謝邀,剛剛看了一樓的回答,感覺挺專業的,另外,我也是大一工科狗一枚,最近剛剛接觸到32,這個和樓主差不多的。 一起學習,一起進步。

個人感覺,32需要掌握的不是它所有的寄存器之類的,而是去培養一個系統性的思路,比如 用庫函數配置引腳需要做什麼,有幾個步驟,再看看源碼是怎麼賦值的,庫函數底層就是對寄存器的賦值,看懂了,理解了就行,用的時候直接去翻手冊就好了。

最後 思路 思路 思路 思路最重要。


謝邀喲

在51基礎上,C語言要學好,能動手就動手,學習都是這樣的,了解32性能和一些外設

《STM32-釋放您的創造力》和《ARM白皮書——ARM Cortex-M3處理器簡介》兩個文檔值得一看


謝邀。我不是搞硬體的,只不過是公司搞智能硬體的我接觸得稍多而已,本人也只是在摸索中。

這裡算是給個建議,或者,我個人的理解吧:

帶著問題學習、一邊有項目一邊實踐是最好的入門之道,如果手上沒有項目,找一個感興趣的。


我還每月過stm 32,不過感覺你現在學應該有點早,還有就是51的基礎一定要打牢


才大一,問什麼不好好上課做實驗,然後自己參加一些大學生競賽,比如全國大學生智能互聯創新大賽http://www.stmcu.com.cn/contest 這個是用STM32的,好好參賽,既能學到東西,如果獲獎還可以對以後保研工作有好處。


各位大神意見都很給力呀


少看視頻,多看手冊


找個項目做,這樣學得比較快


首先對單片機的結構和原理要清楚,對ARM CORTEX M的架構和原理也要理解。然後,多做項目,配合晶元手冊,入門還是蠻容易的。提高也是可期的。


做些小項目或者參加比賽,用的多了,即使有些外設沒用過,通過查手冊也能很快把程序寫出來了。


搞個溫度計,整個計算器,插上內存卡,做個p3吧。

demo由小及大,要學會整合和使用庫,rtos什麼的源碼抽空多學習一下。寄存器什麼的真沒必要浪費太多時間,寄存器也算是庫的一種啊,了解原理即可


如果你還是學生,那麼一個個實驗過下去,後面基本都會了就拿來做案子,這樣上手快,如果是工程師,抱著需要什麼學什麼的態度去吧,這樣來的自然一些,我這邊註冊了一個關於技術類的微信公眾號,不定期推送一些技術乾貨,可以點擊右上角掃描二維碼,也可以微信搜:電子工程師的樂園


推薦閱讀:

電子設計初學者如何入門?
數模美賽O,F獎 ,美一美二的含金量怎麼樣?

TAG:ARM | 硬體 | 單片機 | 電子設計 | 單片機軟體開發 |