STM32 CubeMX 學習:000-搭建開發環境


背景

了解了 STM32 標准庫以后,為了緊跟發展的潮流,我們以 CubeMx為基礎 開始進行 Hal(Hardware Abstract Layer, 硬件抽象層)庫的學習。

CubeMx 是一個 由 ST 推出的芯片圖形化配置工具,為了使開發者盡可能地可以不再關心底層,允許用戶使用圖形化向導生成C初始化代碼。

  • 直觀的STM32微控制器的選擇和時鍾樹配置
  • 微控制器圖形化配置外圍設備和中間件的功能模式和初始化參數
  • C代碼生成項目覆蓋STM32微控制器的初始化符合IAR™,Keil的™和GCC編譯器。

對於新的產品設計,我們強烈推薦使用STM32Cube來加速你的開發過程,並為以后的產品平台移植打下良好的基礎。

HOST-OS : Windows-10
STM32 Cube :v5.6
MCU : STM32F429
LIB : stm32cube_fw_f4_v1250

軟件安裝

使用 CubeMx 進行的開發是這樣的: CubeMx 生成 代碼 + 使用其他工具鏈進行修改與編譯。

像我自己就用過以下2種方式:

  • CubeMx + Keil5 + STM32F429(真機)
  • CubeMx + Makefile + arm-none-eabi-gcc + GNU MCU Eclipse QEMU (仿真)

使用 CubuMx 時需要先安裝好 JAVA 環境,需要安裝 JRE 即可。

STM32-CubeMx:下載地址

軟件的使用

好了,相信看到這里的讀者已經安裝好了CubeMx。

如果是第一次安裝的話,也要把HAL的包下載好:
下載包(包的位置可以通過: Help -> Updater Settings中的Repository Folder重新指定)
1)打開軟件
2)Alt + U 或者 Help --> Manage embeded software packages
3)勾選對應型號的包,Install now (stm32cube_fw_f4_v1250.zip)

Step 1

1)新建工程
Ctrl+L 或者 File -> New Project

2)可以根據 芯片型號\底板 進行選擇;選定以后,還可以在Peripheral調節外設。

  1. 點擊右上角的Start Project

Step 2

頂部的選擇夾依次有4個子夾:Pinout & ConfigurationClock ConfigurationProject ManageTools

Pinout & Configuration

我們會看到軟件有3個豎欄。

對於 芯片功能的選擇可以 通過2種方式分類:CategoriesA->Z

  • Categories : 根據功能的不同進行分類
  • A->Z : 根據 功能的 英文排序進行分類

第一列
不管怎么樣,我們注意到 SYS屬性中有Debug設置,為了能夠重復下載,我們不能選擇"No Debug",建議選擇Serial Wire

為了STM32能夠合理地工作,我們需要在RCC中,做出這樣的設置(此后我們需要根據時鍾樹直觀地配置時鍾):

  • High Speed Clock(HSE) : 選擇Crystal/Ceramic Resonator

STM32CubeMX中外部時鍾配置可選類型為 DisableBYPASS Clock Source(旁路時鍾源)Crystal/Ceramic Resonator(石英/陶瓷 晶振) 三種類型。

旁路時鍾源:指無需使用外部晶體時所需的芯片內部時鍾驅動組件,直接從外界導入時鍾信號。猶如芯片內部的驅動組件被旁路了。只需要外部提供時鍾接入OSC_IN引腳,而OSC_OUT引腳懸空。

外部晶體/陶瓷諧振器(HSE晶體)模式:該時鍾源是由外部無源晶體與MCU內部時鍾驅動電路共同配合形成,有一定的啟動時間,精度較高。OSC_IN 與 OSC_OUT引腳都要連接。

時鍾的來源確定后需要配置芯片內部的多個時鍾線,進入Clock Configuration頁面,可以根據時鍾樹直觀地配置時鍾。

一般來說,stm32系統初始化要初始化:時鍾>中斷>外設;但因為是第一次新建工程,我們暫時不選擇其他的東西。

最后一列
我們看到這里是一個芯片管腳的預覽框。不同的引腳由不同的顏色顯示其當前狀態:

  • 黃色引腳為該功能的GPIO已被用作其他功能,可以忽略。
  • 綠色表示管腳已使用
  • 灰色代表該引腳沒有被初始化

左鍵點擊:點擊引腳可以配置其功能
右鍵點擊:可以為其添加自定義標簽(類似注釋)

配置以后的引腳可以根據配置的不同的功能,在左邊看到配置屬性,例如:
配置了GPIO以后,可以在第一列GPIO中看到有關的設置,我們可以在這里將其配置為推挽(Output Push Pull),上拉輸入模式(Pull-up);或者配置為低速推挽輸出模式,以及初始化輸出(GPIO output level)高(High)。

Clock Configuration

時鍾配置采用圖形配置,直觀簡單。各個外設時鍾一目了然:

  • 開啟外部時鍾8MHz、PLL Source Mux時鍾來源於HSE
  • System Clock Mux時鍾來源選擇PLLCLK
  • 經過PLL(Phase locked loop, 鎖相環)的分頻與倍頻后得到168MHz時鍾
  • AHB Prescaler分頻器設置1分頻(不分頻),得到168MHz的主頻時鍾,HCLK = 168MHz。

Project Manage

我們可以看到:ProjectCode GeneratorAdvanced Settings

Project

Project Setting 項目設置,填寫以下內容:(注意不要出現中文,否則可能出錯)

  • Project Name : 項目名稱
  • Project Location : 項目位置
  • Toolchain Folder Location: 對應的工具鏈所在的目錄,默認不改
  • Application Struture:應用程序結構(包含兩個選項:Basic和Advanced。)

Basic:是基礎的結構,一般不包含中間件(RTOS、文件系統、USB設備等)。
Advanced:相反就是包含中間件,一般針對相對復雜一點的工程。
當然,這兩種生成的結構都比較基礎,一般實際項目都會重新整理一遍軟件架構。

  • Toolchain / IDE:根據需要選擇即可(Keil 是 MDKARM)

Linker Settings 鏈接設置:可設置堆棧大小,此處默認不作修改。

Mcu and Firmware Package 微處理器與固件包:默認即可。

Code Generator

STM32Cube Firmware Library Package Cube固件包拷貝選項
A)Copy all used libraries into the project folder: 將所有使用過的庫復制到項目文件夾中。

不管你用,還是沒有用到,都拷貝到你工程目錄下。這樣一來,你工程下文件就比較多。

B) Copy only the necessary library file:只復制必要的庫文件。

這個相比上一個減少了很多文件。比如你沒有使用CAN、SPI...等外設,就不會拷貝相關庫文件到你工程下。

C)Add necessary library files as reference in the toolchain project configuration file:在工具鏈項目配置文件中添加必要的庫文件作為參考。

沒有復制HAL庫文件,只添加了必要文件(如main.c)。相比上面,沒有Drivers相關文件。

Generated files 生成文件
1)Generate peripheral initialization as a pair of'.c/.h' files per peripheral:每個外設生成獨立的'.c/.h'文件

  • 不勾:所有初始化代碼都生成在main.c
  • 勾選:初始化代碼生成在對應的外設文件。 如UART初始化代碼生成在uart.c中。

2)Backup previously generated files when re-generating :在重新生成時備份以前生成的文件
勾選后,在重新生成代碼時,會在相關目錄中生成一個Backup文件夾,將之前源文件拷貝到其中。

3)Keep User Code when re-generating:在重新生成時保留用戶代碼

比如:我在main.c中添加了一段代碼,重新生成時,會在main.c中保留你之前自己添加的這段代碼。
注意:前提是這段代碼寫在規定的位置。也就是BEGIN和END之間。否則同樣會刪除。

4)Delete previously generated files when not re-generated:刪除以前生成,但現在沒有生成的文件

比如:之前生成了spi.c,現在重新配置沒有spi.c,則會刪除之前的spi.c文件。

HAL Settings
1)Set all free pins as analog (to optimize the power consumption):將所有空閑引腳設置為模擬(以優化功耗)

做低功耗產品時這個選項有必要勾選。

2)Enable Full Assert:使能所有斷言,相當於參數檢查。

Advanced Settings

上下有兩個選項:Driver Selector(驅動選擇器)和Cenerated Funcution Calls(調用函數設置)。

Driver Selector 驅動選擇器:可以選擇 HAL 或者 LL (提示:目前有些型號MCU的部分外設沒有LL驅動)

在CubeMx 的固件包中,LL庫(Low Layer)是ST新增的庫,與HAL捆綁發布的,由於它直接操作寄存器,更接近硬件層,對需要復雜上層協議棧的外設不適用。

Generate Function Call 生成函數調用
這里能夠操作的只有兩個選項:Not Generate Function Call、和Visibility (Static)

1)Not Generate Function Call 不生成函數調用 : 代碼不調用對應初始化函數。

比如:你GPIO項勾選Not Generate Function Call,你main.c函數中就不會調用MX_GPIO_Init這個函數。

2)Visibility (Static) 可見性(靜態):指 初始化代碼聲明為static。

提示:
A.有些選項是默認值,不能修改。如SystemClock_Config配置不聲明為ststic.
B.使用static是配合上面Code Generator代碼生成章節中Generated files生成文件使用。如果都生成.c .h獨立文件了,就不會生成static了。

Tool 工具

這一個界面是與 分析有關的。初學者可以暫時跳過不理會。

注意事項

CubeMX 生成的代碼 會有一些特殊的注釋,這些注釋對於 CubeMx 是有意義的,用戶的代碼只能寫在位於 USER CODE BEGIN ...USER CODE END ...之間(自己建立的源碼文件不受影響)。否則,當對於 CubeMx 進行重新配置的時候,代碼可能會因為被覆蓋而消失。例如:

int main(void)
{
  /* USER CODE BEGIN 1 */
    用戶可編寫的代碼區
  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
    用戶可編寫的代碼區
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
    用戶可編寫的代碼區
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
    用戶可編寫的代碼區
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    用戶可編寫的代碼區
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}


免責聲明!

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



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