Robomaster電控培訓(一) 單片機基礎


RM電控入門(一) 單片機基礎

 

寫在前面

  對於完全沒接觸過單片機的robomaster電控新人,在初期的學習中往往是痛苦不已,對於一些嵌入式的相關概念也比較模糊,那筆者也根據自己的經歷,給大家梳理一下一些基礎概念,讓大家能更快地掌握電控的學習方法,鑒於筆者能力有限,難免有疏漏之處,歡迎大家在評論區與筆者討論指正。

 

單片機、STM32、開發板

  單片機一詞是很多年前的概念了,其對應的英文是“Single Chip Microcomputer”,但是大家聽到的更多的是MCU(micro control uint) 微型控制單元,是因為在過去半導體工藝發展起步階段,一個完整的計算機系統是由多個芯片在一個PCB板上,當時出現了在一種芯片上集成了CPU、SRAM、Flash等模塊的微型計算機系統稱為單片機。但是隨着半導體技術的發展,幾乎現在所有買到的都是單片機,不存在分離式的”多片機“。而現在流行的MCU叫法,突出了單片機兩個特點:一個是微型的芯片級計算機,另一個就是擅長控制,而不是DSP(擅長運算)。

  再談談STM32,從字面上來理解,ST是意法半導體公司,M是Microelectronics,32代表32位,合起來STM32就指ST公司開發的32位微型控制器,其實在大學生眼中,STM32單片機常常與51單片機進行比較,51單片機作為入門級的經典MCU,是傳統的8位單片機,其結構簡單,易於教學,而且不需要額外的仿真器只需通過串口就可以實現下載編程。但是畢竟51單片機資源有限,性能跟不上需求,在這樣的情景下,ST(意法半導體)公司推出了極高性價比,擁有簡單易用的庫開發方式的STM32。STM32屬於一個微控制器,自帶了許多常用的通信接口,比如USART,IIC,SPI等,可以接許多傳感器,也就能控制許多設備。像大學生比賽中常見的四軸飛行器、物流小車、平衡車,再到日常生活中常見的掃地機器人、智能手環等都有STM32的身影。

  STM32是一個相當大的家族,有許多的系列以滿足不同的需求。

QQ截圖20210801115328

  那我們目前主流用的一般有兩種系列,F1系列與F4系列,如果是普通應用,無需外接RGB屏幕可以選擇F1系列;如果是追求高性能,數據運算量比較大,或是需要外接屏幕的,可以選擇主頻更高的F4系列,像Robomaster比賽中常用的A板和C板都是F4的開發板,而B板則是F1系列。

  那么說到底STM32也只是一塊芯片,但我們平時拿在手里開發的俗稱“板子”的東西,正規一點的稱呼叫開發板,開發板將芯片中的引腳引出來,連接到各種傳感器上,然后通過程序控制這些引腳輸出高電平或者低電平來控制各種傳感器工作。開發板是一種評估板,板載資源非常豐富,引腳復用也比較多,力求在一個板子上驗證芯片的全部功能。

QQ截圖20210801151526

                Robomaster A板                 Robomaster B板             Robomaster C板

 

 

  下面我以A板為例,介紹一下開發板的組成。將A板的保護海綿揭開,可以看到A板的芯片STM32F427IIH6(左圖)

image-20210801152307122 image-20210801152754182

  芯片的正面是絲印,ARM表示芯片使用的是ARM公司的內核,STM32F427IIH6是芯片型號,后面的字應該是與芯片的生產批次有關,最下面是ST公司的logo。芯片的四周是引腳(這張圖片看的不是很清楚,我在右側放了一張STM32F429IGT6的芯片,可以很清楚的看到四周的引腳)。芯片的左下角有個小圓點表示是1腳,然后引腳從1腳逆時針的順序排列(這是所有芯片的引腳排列順序)。

  可以看出A板的芯片型號是STM32F427IIH6,那這個型號有什么含義,我在這里簡單介紹一下STM32的命名規則 STM32產品型號划分   那么從表解讀看,A板的芯片STM32F427IIH6的含義是:32位的MCU,基礎型,(427這里沒解釋,可以近似看作407的升級版),176引腳,2048k 的flash容量,LFBGA封裝,溫度范圍從-40°到+85°。這些東西我們不需要刻意去記,但是了解他們的命名規則可以在看到芯片型號就能大概掌握其基礎信息。A板、B板和C板的芯片型號在開發板用戶手冊都能查到。

image-20210802235856345

image-20210802235935867

image-20210802235952832

image-20210803000034668

 

  這份表格摘自A板的開發板用戶手冊。可以看出A板的外設接口非常豐富,3.3V~24V電源的輸出,2路CAN,4路串口(除開DBUS),8路PWM,18個用戶自訂GPIO,自訂按鍵等,是一款非常強勁的開發板。在以后的文章中,我也會逐步介紹這其中的一些功能。

 

KEIL5與STM32CubeMX

  說完了硬件部分,我們再來講一下程序開發。那單片機的程序開發工具我們常常使用的是Keil MDK 5 和STM32CubeMX,Keil是美國Keil軟件公司(現已被ARM公司收購)出品的支持ARM微控制器的一款IDE。 IDE的全稱是集成開發環境(Integrated Development Environment),簡單的來說IDE相當於編輯器+編譯器+連接器+其他組件,可以無需借助其他軟件就可以實現完整的程序開發。也就是說我們用keil這一款軟件就可以實現代碼編寫、代碼編譯、程序燒錄、程序調試的功能。那既然有了keil我為什么還要提STM32CubeMX這一款軟件呢?這就不得不談到STM32的主流開發方式了。

  STM32的主流開發方式包括寄存器開發和固件庫開發,其中固件庫開發包括標准庫開發和HAL庫開發。寄存器開發是非常底層的開發方式:即直接通過操控寄存器來實現功能。這樣的好處是工程運行效率高,但開發難度較大,可讀性和可移植性差。當工程比較簡單時,可移植性可能不能給你帶來很直觀的感覺。一旦工程量龐大起來,可移植性往往是最優先考慮的。那么固件庫開發就是將一系列的寄存器操作進行封裝,降低了開發的難度,提高了程序的可讀性和可移植性。然后就是固件庫開發中的標准庫開發和HAL庫開發。標准庫開發用的是標准庫函數,HAL庫開發用的是HAL庫函數。既然都是庫函數,那何必要封裝成兩個庫呢?實際上,HAL庫是配合支持ST開發的一款圖形化工程配置軟件STM32CubeMX一起使用的。

  圖形化工程配置,就是根據自己對硬件外設需求(這里的外設指的是芯片上的外設,簡稱片上外設,像以后的文章中會講到的GPIO、USART、IIC、SPI等都是外設),通過一些選項的勾選,像填表一樣告訴軟件你的需求,然后軟件會根據你的需要自動寫好底層的配置代碼。可能大家會不太好理解為什么外設要配置底層代碼。實際上,在圖形化配置工程出現之前,單片機開發要復雜許多,之前配置一個外設,需要查看芯片手冊,看哪些資源在什么引腳上,要考慮引腳復用問題,時鍾線配置問題等等。現在有了圖形化配置工具cubemx,雖然不是說可以完全拋棄手冊隨手編程,但是配置的流程大大簡化也不易出錯。而STM32CubeMX是ST公司近幾年極力推薦的程序生成開發工具,所以在這幾年新推出的STM32芯片,ST公司干脆直提供HAL庫,但是畢竟都是封裝好的固件庫函數,所以學了HAL庫函數之后,閱讀標准庫函數也不會存在很大障礙,所以大家也不用太過於糾結學那種開發方式,只要理解了STM32的本質,任何庫都只是一種工具。當然個人建議還是先從HAL庫開始學起,對整個單片機開發之后再從寄存器層面思考單片機開發。

  考慮到網上有豐富完整的keil以及stm32cubemx的安裝教程,我這里就不再贅述。還是從使用層面給大家介紹一下兩個軟件的一些常見的使用方法。

 

KEIL

打開KEIL的一個工程,我想重點講一下紅圈部分的功能,其余未標出的要么是太常規像保存、新建、打開等。要么是在日常使用過程中不常用的功能。

20210802111731

 

1

編譯類按鈕,使用頻率非常高,從左到右依次是:

  • 編譯當前文件

  • 編譯修改過的文件

  • 編譯所有文件

  • 編譯多個工程文件

  • 停止編譯(未編譯時是灰色)

  • 下載

QQ截圖20210802231343

編輯跳轉類,從左到右依次是:

  • 撤銷 ctrl+Z

  • 重做 ctrl+Y

  • 光標移到上一次位置

  • 光標移到下一次位置(配合上一個按鈕使用)

QQ截圖20210802231745

  • 注釋所選代碼

  • 取消注釋所選代碼

QQ截圖20210802231901

  • 進入調試(debug)模式

在進入調試模式下,keil的界面會有較大變化,主要是調試的一些功能,那在本篇文章中不做介紹,在之后的文章中我們會以實例來介紹debug模式下的keil

QQ截圖20210802232252

這兩個按鈕功能比較復雜,但是也有許多是平時不怎么用的,還是先說左邊這個按鈕

image-20210802232422058 這個按鈕叫做 工程目標選項(Options for Target )按鈕,也叫做魔術棒按鈕。我們重點講一下其中的C/C++選項卡

image-20210802234851247

  • 第一處為預定義,像一些庫函數的頭文件,和芯片相關的頭文件在這里統一宏定義,一般是不用往上面加東西的,但有時候程序報錯了在網上查找解決方法有時就是這里缺少了相關頭文件

  • 第二處最為重要,像Robomaster這種代碼量不小的比賽,一個兵種的代碼往往有許多頭文件和源文件,那么有時為了需要分類不同的文件夾來存放不同的源文件和頭文件,那么要想頭文件被引用(include)到,就要在Include Path中將對應的頭文件所在的目錄包含進來,具體是點右邊的省略號按鈕,再添加路徑

    image-20210802235609177

魔術棒中還有一個Debug選項卡也是比較常用的,但是放在之后的文章講解

image-20210803000601281再來說說這個 單工程管理按鈕

image-20210803000751450

  我們主要使用的也就是Project Items選項卡,在這個頁面中,我們能自主的決定我們的一個工程結構,你可以新建一個group來放目的不同的源文件,也可以解散你覺得分類繁瑣的group。總之,如果你在你的工程文件內新生成的源文件要放入你的工程結構內,就需要在這里將你的源文件添加到其中的一個group內。

 

 

image-20210803000223319

  在keil左側的一大塊是四個窗口(如果少了幾個可以在菜單欄中的view選項中勾選缺失的),我們重點講解Project窗口以及Functions窗口

image-20210803000436850

  在project窗口內,我們可以看到整個工程的文件目錄,像本例就是light_led工程,下有四個文件夾,里面有hal庫的源文件,有一些芯片的啟動文件,這些都是在我們選好相應芯片后自動生成的,如果你之后添加了你的源文件group進來(具體操作在上面),那么在project窗口也能看到,其中有些源文件有可展開的加號,點開后可以看到這個源文件到底包含了哪些頭文件

 

image-20210803001720820

  然后是Functions窗口,這是一個新人很難察覺到功能,在Functions窗口內,我們可以看到這個工程所有的源文件,同樣有可展開的加號,點開后我們可以看到這個源文件所有定義的函數,如本圖所示,在gpio.c中,只定義了一個MX_GPIO_Init的函數(這就是STM32CubeMX自動生成的GPIO相關的底層代碼),還可以看到,有許多源文件中有hal字樣,這些源文件里面的函數都是hal庫的函數,那么自然而然的我們也可以查看這些源文件里的函數:雙擊該函數可以跳轉到該函數的定義。

 

最后是與編譯相關的窗口,在keil的底部

image-20210803002141434

  可以看到有一個Build Output窗口和一個Error List窗口

  • Build Output窗口: 在點擊編譯按鈕后,Build Output窗口會滾動字幕來表示編譯的進度,那最后編譯通過 沒有錯誤沒有警告的話就像上圖一樣。那如果變編譯有錯誤,就會出現錯誤信息並提示編輯不成功,如下圖。那如果是編程中出現一些可能會出現錯誤的地方,或是所寫代碼不是很嚴謹,那么會以黃色三角驚嘆號標注在左側行數旁,雖然編譯結果是只要沒error,就可以下載到開發板中,但有些時候我們還是要注意一寫警告信息

    image-20210803003340769

                                                                                                                                                                    編譯錯誤,不能下載到開發板中

image-20210803003811241

                                                                                                                                                         編譯無錯誤,但有警告可以下載到開發板中

 

  那么不是說只有在編譯完我們才能知道編譯的一個錯誤與警告情況,在Error_list窗口中,keil會實時地將可能存在的錯誤和警告的行數和原因打印出來,這也很方便我們養成良好的編程習慣

image-20210803004210818

  在本圖中,我在一行語句中添加了一個空格,在Error_list窗口就馬上寫出了可能的錯誤原因,錯誤所在源文件,錯誤所在行數,在主編程視窗的行數左側,也有小紅叉注明。這些提示,雖然有的時候可以很快的找到錯誤糾正,但是有些時候也會存在誤判,可能是由於代碼還沒編寫完,那如何處理這些信息,就依靠日常的編程經驗了。

 

STM32CubeMX

image-20210803005526154

  打開STM32CubeMX,可以看到上圖,那么我們要新建一個工程通常可以通過快捷鍵 Ctrl+N,或是在上方File文件夾內選New Project,或是在中間選ACCESS TO MCU SELECTOR, 在圖中有三種新建工程的方式

  1. 從MCU選擇芯片新建工程 2. 從開發板中選擇對應開發板新建工程 3. 從實例中選擇新建工程

  那么我們通常都是從MCU新建工程,點開后得下圖

image-20210803010000404

  那么我們可以從內核,芯片系列, Line(?暫時不清楚什么意思),封裝方式,其他和所用外設等類別來選擇我們的芯片,但是我們一般是已經有了相應芯片來新建工程,所以我們只需在Part Number的右側搜索框中輸入我們芯片的型號即可,這里以A板的STM32F427IIH6為例。可以看到紅框中為我們所需的芯片,右側的參數也能對上。雙擊芯片型號開始配置

image-20210803010351088

image-20210803010557283

  那么可以看到中間的正方形代表的就是我們的芯片,一些圓形就是我們的引腳。那我們現在所在的就是Pinout & Configuration選項卡,這里主要是選擇我們需要的外設。

image-20210803010828889

  • System Core 選項卡中可以配置 GPIO,DMA,獨立看門狗(IWDG), 中斷(NVIC),RCC時鍾,SYS調試等

     

    image-20210803011044246

     

  • Analog中主要配置的是與模擬量相關的,比如模數轉換器(ADC)

 

image-20210803011150496

  • Timers主要配置定時器,可以看到F4有非常多的定時器外設

image-20210803011303199

  • Connectivity主要配置與通信相關的外設,比如CAN, IIC,SPI,串口(UART&USART)

image-20210803011419825

  • Middleware配置一些中間件,像FreeRTOS在這里配置

  每個選項卡選到具體的外設配置,在右側都會有詳細的配置條目,這里不做介紹,在之后具體學到相應外設我們再做講解。

image-20210803011658045

  接下來是Clock Configuration,在這里你可以清楚看到該芯片的時鍾樹,而每個時鍾的來源,倍頻分頻因子,都可以通過勾選來實現清晰的時鍾配置,如果你沒有其他的要求,你可以在你想要的外設所在的總線上填好頻率后,按回車軟件會自動根據你的需要配置合理的分頻倍頻。

  當所有都配置好后,我們需要填寫一下其他信息,比較簡單我就在圖中說明了,設置完后我們就點generate code 生成代碼

  注意,工程所在的路徑不能包含中文,否則在generate code中會報錯

image-20210803012246664

 

image-20210803012401272

 

 

總結

  本篇文章我們主要介紹了單片機的一些概念和開發的軟件的使用,目的是熟悉一下軟件的使用和環境的搭建。下一篇文章我會給大家介紹單片機的GPIO外設。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM