之前有寫過一篇比賽經驗帖:從0開始,三個月,獲全國一等獎

這次應龍哥要求,給大家寫一份STM32入門的文章。因為我是搞軟體的,這裡就只給大家介紹STM32的編程學習的一些思路,幫助大家儘快入門。

我打算是分兩篇寫,一個基礎篇,一個提升篇。

這一篇為大家講一下STM32入門學習的一些基礎。

在之前的文章也跟大家提到過,基礎真的非常非常重要。

如果基礎打牢了,電賽拿個省獎應該是沒有大問題的,不過拿國獎的話還需要一定量的強化練習,關於強化的部分後面再寫一篇給大家介紹。

在內容講解之前,先講一下學習方法。其實不只是學習單片機,不管是學什麼自學能力都非常重要。

當初我剛開始學的時候,去找龍哥,原本我是希望龍哥能教會我,然而龍哥就是給我丟了一套原子的視頻,只給我講了一下基本要學的東西和學習思路,很多東西我都是自己學,看不懂的地方先去百度搜,如果還是不懂才去問龍哥。

因為一般我去問龍哥,龍哥每次都會給我幾句話:自己百度去,這個都不懂,給你兩巴掌。下次我問你還不會,我打死你。

我們平時去問老師也是一樣,老師只給你提供思路,實際的操作還是要靠自己。但是我真的很感謝老師和龍哥,因為只有自己搞懂才是真懂,自己自學學到的知識記憶會特別深刻。

這裡就以STM32f103為例,網上有很多相關的學習的視頻,正點原子的和野火的講的都不錯。

我是看正點原子的視頻入門的,所以我的思路跟正點原子的很類似,我這裡的介紹不會太詳細,只是給大家提供一些學習的思路。

各位小夥伴如果有問題可以去群里討論或者去看一下正點原子學習視頻,希望下面的內容對大家能有幫助。

我把單片機的基礎內容為以下四個部分,下面我單個講解。

1、點燈和按鍵

一般來說,學單片機都是從點燈開始的。我當時學點燈和按鍵學了一個星期,純小白入門的話,學起來肯定會有一些困難。

我當時是從51轉32的,跟著視頻邊看邊寫,當時我就很喜歡鑽牛角尖,51點燈定義一個引腳就一行,但是32比51麻煩太多,從新建工程添加文件,定義引腳,當時就覺得各種亂七八糟的東西,很懵逼。

這裡給大家提幾個小建議,剛開始學的時候,不要說要把每一行每一句搞清楚,把關鍵的語句搞清楚就可以了,等你學到了後面再往前看的時候,會有一種突然間恍然大悟的感覺,因為每用到引腳就要進行引腳配置,配置多了,學的東西多了自然而然就懂了。

然後剛開始新建工程盡量不要使用模板,每一次新建工程都自己添加文件,搞懂整個工程的框架,學到後面可以自己總結一套適合自己的模板。

點燈其實就是配置引腳輸出高電平和低電平來控制外部LED燈的亮滅,配置語句非常簡單,首先使能引腳時鐘,然後配置引腳輸出模式即可。按鍵的話也類似,只不過按鍵是配置輸入模式。按鍵的硬體圖如下所示:

以KEY_UP為例,左端是VCC,右邊接的是單片機的引腳,不按時中間斷開,當按鍵按下,中間連通,此時單片機會檢測到有高電平輸入。按鍵還有一個消抖程序,是為了保證穩定,避免二次檢測,除此之外,按鍵有支持連按和禁止連按兩種模式,這裡請讀者自行去了解。

點燈和按鍵在平時做項目的時候用處也是很大的,每次我新建工程第一個程序永遠都是點燈,因為複雜一點的程序一般都會涉及中斷,每次我都是把點燈放在中斷裡面,根據燈的亮滅變化來判斷你的中斷配置是否成功或者判斷中斷實現的功能是否正常運行,除此之外也可以用燈來檢查工程里其他的邏輯語句,因為開發平台只能檢查程序的語法錯誤,邏輯錯誤只能自己去檢查。

2、串口與外部中斷

串口的功能基本上就是實現數據的傳輸,通過杜邦線連接兩塊單片機,數據可以從一塊單片機發送到另一塊單片機。像現在網上的一些模塊比如溫濕度檢測模塊,就是通過串口把檢測到的溫濕度的值發送到單片機。

也可利用串口實現單片機與電腦的數據交互,此時需用到串口調試工具。串口功能的配置也比較簡單,配置好時鐘後,設置好輸入或輸出模式,然後設置波特率,數據位長度,奇偶校檢位等即可使用,這些在原子的視頻中都有詳細的講解。

原子給的常式是在主函數的死循環裡面不停接收或發送。我並不支持這種操作,我在做畢業設計的時候,因為程序比較多,剛開始我也是在死循環裡面接收數據,隨著程序越來越大,更新數據的時間變得越來越慢。

串口通信還涉及到一個串口中斷,用串口中斷來接收數據的話,可以大大優化程序的運行速度。

外部中斷原理跟按鍵很類似,也是通過檢測外部信號來實現相應的功能。外部中斷是單片機實時地處理外部事件的一種內部機制。

當某種外部事件發生時,單片機的中斷系統將迫使CPU暫停正在執行的程序,轉而去進行中斷事件的處理;中斷處理完畢後.又返回被中斷的程序處,繼續執行下去。

這裡要提醒一下,中斷執行的語句也需要盡量簡化,因為一般的單片機都是單線程的,無法同時運行中斷裡面的功能和系統功能,進入中斷後其他的功能都會短暫停止工作,只運行中斷裡面的功能。如果中斷裡面功能語句過多可能會影響整個系統的運行。

3、定時器

我個人覺得定時器是單片機的核心,用途非常廣。

定時器有最主要的三個功能:定時器中斷,輸出PWM,輸入捕獲。

詳細配置這裡不講了,下面分別講解三大功能。

定時器中斷是根據自己配置定時器的時間來進入中斷,就拿兩輪平衡小車為例,配置定時器每50ms進入一次中斷,接收陀螺儀檢測的小車傾角信息,平衡小車是通過不停的檢測小車的平衡狀態以此來控制電機向前或向後運動保證小車平衡。

輸出PWM功能主要是輸出一段可以控制占空比的方波信號。比如點燈,可以改變輸出PWM占空比的大小來控制燈的亮度。

我電賽搞的是控制,用的最多的是用來控制電機或者舵機。

以電機為例,一般單片機會連接一個電機驅動,電機驅動會根據單片機發送PWM的占空比來控制電機的轉速和方向。

比如5V8000轉速的電機連接最大輸出5V的驅動,單片機如果發送給驅動的PWM占空比為100%,驅動滿伏輸出,電機也會滿轉速運轉,一分鐘轉8000轉;

如果給的PWM占空比為50%,驅動輸出的實際電壓變為2.5V,電機速度會變為4000轉每分鐘。

輸入捕獲功能可用於測量一段未知信號的頻率,周期和占空比等等。比如輸入一段方波,檢測到上升沿的時候定時器開始計數,檢測到下降沿後把計數時間設為t1,檢測到第二個上升沿後總計數時間設為t2,占空比則為t1/t2,頻率為1/t2,周期為t2。

4、ADC

全稱為Analog-to-Digital Converter,將連續變數的模擬信號轉換為離散數字信號。ADC功能主要用於檢測電壓值,

拿平衡小車來說,需要用ADC檢測平衡小車的電量來提醒用戶是否需要充電。

又比如光敏模塊,其實就是利用ADC測量光敏模塊內部光敏電阻的電壓值,溫度模塊則是用ADC測量內部熱敏電阻的電壓值。

但是要注意,單片機上的ADC引腳檢測的最高電壓不得大於3.3V,太大了會燒壞單片機,一般的電壓都需用先通過一個確定倍數的放小電路後再進行測量。

下圖就是我在16年省賽準備期間做的一個微型的示波器:

16年省賽是我第一次接觸STM32,當時因為水平不夠校內篩選的時候就被刷了。上圖有測出來的電壓值,電流值,功率,周期,峰峰值,也有當時還沒測出來的占空比等等一些數據,還有一些是調試過程中用來檢驗的一些數據。

5、結束語

除了上面講到的東西,還要跟大家提一下現在兩種主流的配置引腳的方式,庫函數和操作寄存器。

我自己先學的是庫函數,後面自己也學了寄存器操作的方法。其實兩種方法的原理是一樣的,庫函數其實就是把寄存器給包裝起來了,實際上都是對寄存器的操作。

這裡給大家一個建議,如果是想在單片機這條路上走遠一些的,寄存器一定要搞懂。

像我有的同學在公司實習的時候,公司就只給了他一個寄存器操作手冊,因為很多產品內部的部件都是定製的,網上沒有程序參考,只能自己配置,如果看不懂寄存器根本無法下手。

這篇文章有很多東西都沒有寫,像重映射等等一些功能其實也很重要,單片機的原理圖大家也一定要看懂,我這裡只是給大家一個思路,詳細的學習資料還是要參照正點原子的,原子開發板的資料中有一些文檔像STM32開發指南和STM32中文參考手冊需要多看看,請大家多多注意。

最後再提醒一下大家,寫程序是很看動手能力的,一定一定要多動手,不要只複製粘貼。自己平時也可以去網上找找題目做,就比如學會點燈後,自己用杜邦線多接幾個LED燈,寫程序實現各種花式點燈;

學會按鍵後,可以自己改程序實現連按功能;學會後面的定時器,ADC和LCD後,可以自己做一個小型示波器。大家入門後也可以多去看看演算法相關的一些書籍,程序語法花寫時間總能搞懂,但是演算法才是核心。

因為我是一個典型的工科男,文筆很差,裡面廢話很多,講的一些東西也不知道大家能不能看懂。

希望文章對初學者能有所幫助,中間有遺漏或者講錯的地方歡迎指正。

C語言的一個小陷阱

博士論文抄襲,看頭髮辨真假

嗨,你是選擇自學成才還是參加培訓

三十歲一事無成,一個失敗工程師的自白


還沒有進群的小夥伴可以添加小編微信~

關注公眾號【大魚機器人】

備註【進群】,拉你進微信交流群~

此外,可以在公眾號上獲取海量學習資源~等你~


5T資源大放送!包括但不限於:C/C++,Linux,Python,Java,PHP,人工智慧,PCB、FPGA、DSP、labview、單片機、等等!在公眾號內回復「更多資源」,即可免費獲取,期待你的關注~

推薦閱讀:

相关文章