STM32編寫時的技巧(適用於新手)

本文是我在知乎上的一篇回答,有興趣的朋友可以參考下面的鏈接,不過兩篇文章是一樣的。
https://www.zhihu.com/question/66634764/answer/696095626
本文適用於初學者。

硬件功能方面,十分建議學習好TIM,systick,GPIO,USART,NVIC這幾個東西,最好能深入理解,因爲這幾個東西常常是出現在很多個項目當中的,非常重要的東西。

一,環境的搭建與程序的燒錄

初學者的第一道門檻是解決兩個問題:搭建環境以及燒錄程序

1.1 軟件選擇?

首先,選擇編程軟件,是keil v5還是IAR?

我長期使用的是keil v5,不過IAR也是不錯的,IAR適用的單片機更多一點。比如STM8系列的單片機,只能用IAR來編程。我們老師推薦我們先學STM8,因爲它和51是類似的8位處理器,但功能更加全面,不過51的資料比STM8的要多。

keil v5軟件及F103系列安裝包

鏈接:https://pan.baidu.com/s/1O_1Kn6AqMiTLEVu9b-Q3Yw 提取碼:ok10

其他系列的單片機需要去官網下載對應的安裝包

IAR 7.7

鏈接:https://pan.baidu.com/s/1sIQsBfCR_huXlA0B1M9dkw 提取碼:ze4d

這是STM32cube中文網:http://www.stm32cube.com/,打開網站點擊“資源下載”,裏面有許多有用的資料。

1.2 建立keil v5的編程環境

Project - New uVision Project 可以新建工程,選擇保存的位置後,再選擇對應的硬件型號。
在這裏插入圖片描述
圖中,第1個圖標用於修改工程配置,第2個圖標用於管理工程內的文件。

在圖標2中添加對應的.s啓動文件以及.c文件(你需要用到什麼文件就加什麼文件,.h文件可以不加入)
在這裏插入圖片描述
由於軟件此時不知道.c文件中調用的.h頭文件具體在哪裏,所以需要你手動添加。在圖標1中添加頭文件的目錄位置。

在這裏插入圖片描述
由於本人不擅長IAR,故也不在此誤人子弟了。

1.3 Debug調試與程序燒錄

我是用的是J-Link仿真器,將對應的管腳相連,如果你不知道怎麼連接,看看這張圖。仿真器上有對應的表示。此圖是某些STM32單片機上的兩排引腳的含義圖(注意不要接反了)
在這裏插入圖片描述

將仿真器與單片機相連以後,將仿真器接入電腦。此時,仿真器和STM32都應該有燈亮起來。

還沒完,還需要修改程序配置。

修改Option的設置

1.Debug下,選擇J-LInk。接着點擊右側的Settings
在這裏插入圖片描述

2.Port:選爲SW

Max Clock:選爲2MHz
在這裏插入圖片描述

再設置Flash Downlod ,修改爲128k的

在這裏插入圖片描述

4.修改完後,在Option-Utilities下,改爲J-Link

在這裏插入圖片描述

1.4 Debug與燒錄

在編譯成功以後,選擇Load,即可燒錄
在這裏插入圖片描述

使用Debug可以進行逐句的檢查和調試
在這裏插入圖片描述

在Debug模式下,選擇Peripherals - General Purpose L/O - GPIOA

可以打開GPIOA的管腳電平情況示意圖
在這裏插入圖片描述

你可以在此圖中檢查你的編程是否按你的要求進行了操作。如果你配置了GPIOA中的0管腳爲推輓輸出模式,並且使得它在此時呈現高電平,那麼在此圖中會顯示GPIOA_ODR那一行,第0列爲√的形態。

你也可以手動點擊該框格,如果此時STM32外部連接了一個LED燈的話,你可以發現你對框格的操作將立即生效。

二,官方手冊的使用指南

知道了怎麼配置環境,以及如何燒錄,再來談一談編程的思路。

首先,準備好官方的固件庫手冊。

1.初始化:

(這一步用STM32cube易於實現。)一般要配置這些內容:時鐘,中斷(有些不用),GPIO引腳配置,相關的結構體。

此處以配置TIM1舉例:

我要實現TIM1的功能,打開固件庫手冊,打開文件stm32f10x_tim1.h,注意打開的是.h文件。
在這裏插入圖片描述

看到在開頭,有幾個結構體類型TIM1_TimeBaseInitTypeDef以及其他結構體類型,這些東西就是你可以配置的東西,那麼哪些結構體類型你需要配置,哪些結構體類型你沒必要配置呢?

就需要參考官方的例程,或者其他人的例程,這個很好找。找到後,看看人家配置了哪些功能,你只要對應着照貓畫虎地配置就好了。

在該.h文件下有着豐富的信息。比如你建立了結構體變量,你想要配置它,可以在原來的.h文件上下找找有什麼可以使用的量。(可以在結構體類型上點擊右鍵-找到定義的地方)
在這裏插入圖片描述

比如這個TIM1_CouterMode這個成員,可以填寫的內容就可以在.h文件的下面找到。
在這裏插入圖片描述

複製粘貼過去就行了,具體的其他配置,需要看視頻理解其功能和原理。這裏只是說一下編寫時候的技巧。

還需要注意的是,每次配置完成成員以後,一定要將參數初始化,否則配置無效。
在這裏插入圖片描述

2.實現對應的功能

2.1庫函數編寫

你先要明白對於這個硬件,你能用什麼函數?要想知道這個,你必須要查固件庫手冊
在這裏插入圖片描述

比如我要看看TIM1中究竟可以調用哪些函數?官方的固件庫手冊裏可是幫你整理好了。都寫在了一個表裏,我從描述中找到需要的功能函數,再從目錄裏面查找那個函數。

比如,我看中了TIM1_DMAConfig 這個函數。
在這裏插入圖片描述

找到說明,你可以很明顯的知道你要輸入什麼和輸出什麼。如果有些參數你不知道怎麼填寫,比如圖中的DMA傳輸起始地址。

那麼你有三種方式查找:一,百度。二,翻閱.h文件看看有沒有相關的宏定義。三,查看相關的例程。

這裏的傳輸起始位置,就在下面已經有了,不過不建議直接用下面的來表達,因爲你的固件庫手冊的版本不一定和你自己工程當中的固件庫版本匹配,必須要查看stm32f10x_tim1.h文件下是怎麼定義這個宏的。
在這裏插入圖片描述
在這裏,我就查找到了,所以可以直接使用。如果沒有查找到,自己手動翻一下.h文件。

在這裏插入圖片描述
以上說的是庫函數的使用辦法,查閱的是STM32F103xx固件庫使用手冊_v3.5版本.pdf這個文件。

2.2寄存器編寫

如果你想用寄存器編寫,需要查閱STM32F103xx官方參考手冊(源享科技).pdf這個文件,還是用類似的思路查詢:這個硬件下有哪些寄存器?它們的哪一位能實現什麼功能?看中了某一個功能以後,再在工程中進行配置。

不過寄存器編寫的程序對於我來說可讀性不怎麼好。所以,我只要在庫函數不夠用的時候,纔會去用寄存器的方式編寫。

大家看這張圖,明顯和庫函數編寫時候有很大的差異,它沒有一個表格,把所有寄存器的功能給一起簡述出來。不如庫函數查找功能時那麼方便。如果你要找到你想要的功能的話,有時得把TIM寄存器這一整節都看完。

我覺得,如果你想從事這個行業的話,那麼必然要熟悉這些底層的寄存器,但是,如果只是業餘愛好的話,不建議接觸這些寄存器。因爲你要記憶大量的寄存器的某些位對應的功能。
在這裏插入圖片描述

在stm32f10x_tim1.c文件當中,有一些利用宏定義安排好的寄存器位置,可以方便你調用
在這裏插入圖片描述

反過來,如果你是在某個例程當中,看不懂寄存器編寫的代碼,那你就可以來查詢這個手冊。

三,宏定義

宏定義是一個強大的東西,必須要利用好,這樣可以很方便的幫助後期更改硬件及參數。

我把宏定義單獨放在了一個文件裏面:User_Macros.h。

1.看到開頭有一個

#ifndef __User_Macros_H

#define __User_Macros_H

//接下來的內容

#endif //別忘了在結尾加上這個。。

這個是用於防止重複引用的,如果文件A調用了這個頭文件,那麼文件B再調用這個頭文件時,軟件就不會再次編譯了。這句話防止了重複定義等錯誤。
在這裏插入圖片描述

2.可以利用宏定義,建立一些模式:

#define Test_Mode 1

在對應的地方使用:

#if Test_Mode ==1

//測試程序

#endif

這裏可以實現切換諸多的功能。如果不想使用該模式了,打開User_Macros.h將Test_Mode修改成0即可。

也可以添加其他的模式,比如OLED的IIC模式與8080並行模式,或者加入操作系統也可以。
在這裏插入圖片描述

3.我建議將數值都改爲我這種表達方式,比如PA.0口,我用Huoer_Input來代替。以後我要修改霍爾傳感器所接引腳,只需要修改這裏的兩行代碼就行了,不需要再去翻閱代碼那麼麻煩。

4.我十分建議在.h文件當中把註釋寫的豐富一些,方便後期修改調試。

四,工程模板

爲了方便今後的編寫,我建立了工程模板,把我曾經寫過的通用函數封裝起來,放在這個模板裏面,以後直接複製粘貼調用就好了。

這個也是一個十分有用的技巧。可以有效地減少前期初始化配置地操作次數。
在這裏插入圖片描述

五,STM32Cube

這個軟件用於可視化的對STM32的配置,學習這個的好處是編寫速度變快。不需要花費很多的時間在諸多的硬件功能初始化上。

不過這個軟件有個門檻,就是英語。它導出的工程是使用HAL庫或者LL庫編寫的,而這兩個庫的編程手冊我查了很久,全是英文的,沒有中文手冊。有能力的同學,十分建議學習STM32Cube,可以提高編寫的效率。

六,初學者可能遇到的錯誤

我使用的是keilv5,所以以下內容針對的是使用keil v5的同學。

1.中斷函數重複定義

這個錯誤可能大部分人都會遇到。自己編寫的中斷函數與stm32f10x_it.c下的某個函數衝突了???自己又不敢隨意動這個文件。

首先,大家在編寫完中斷函數(注意,中斷函數有固定名稱)以後,一定要將stm32f10x_it.c下的同名稱的中斷函數給註釋掉。

其次,不能直接把stm32f10x_it.c下所有中斷函數全部註釋掉,否則會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章