使用 SW4STM32 和 HAL 庫首次設定閃爍 LED 示例

注意: 有許多 IDE,工具鏈和庫可以隨時使用 STM32。以下設定只需要很少的努力就可以使它工作,但它只是其中之一。隨意探索其他人,它不是此示例的目的是強制任何人使用此處將使用的工具。)

IDE 安裝

適用於 STM32 的 System Workbench:適用於 Windows,Linux 和 OS X 的免費 IDE。它由 AC6構建,可從 OpenSTM32 社群網站註冊後下載。

IDE 本身基於 Eclipse,但為 STM32 開發提供了一些附加功能,如:

  • Ac6 STM32 MCU GCC 工具鏈
  • OpenOCD 和 GDB(arm-none-eabi-gdb),具有自動生成的除錯配置,具體取決於目標板
  • 內建選項可程式設計或擦除晶片

在建立自己的電路板之前先從 STM32 開始,建議嘗試使用 DiscoveryNucleoEval 板 ,它們帶有一個板載 SWD(序列線除錯)程式設計器/偵錯程式,稱為 ST-Link。

建立一個專案

此示例將使用 STM32F4 Discovery 套件 ,該套件具有 STM32F407VG 微控制器。 (也可以使用任何其他板。)

  1. 開啟 SW4STM32 並建立一個新的 C 專案: 檔案→新建→C 專案

  2. 給它命名為 “STM32F4_Discovery-Blinky” ,從專案型別列表中選擇 Executable / Ac6 STM32 MCU 專案。預設情況下,唯一可用的工具鏈是 Ac6 STM32 MCU GCC 。點選下一步。

    StackOverflow 文件

  3. 下一步是*除錯/釋出設定*,現在可以通過單擊下一步跳過。

  4. 董事會選擇。可以選擇現有的板,如本例所示,可以新增 STM32F4 Discovery 或新的定製板。

    StackOverflow 文件

  5. 下一步是 *Project Firmware 配置*。選擇無韌體標準外設庫 (SPL)或硬體抽象層 (HAL)。有人質疑哪一個更適合開發,但這個問題超出了本例的範圍。此示例將使用 HAL 庫,因為它是 ST Microelectronics 目前支援的。用於 HAL 的其他可用軟體工具是 STM32CubeMX ,它是初始化程式碼生成器。此外, STM32CubeFx 或 STM32CubeLx 軟體包還提供了幾個示例應用程式。如果目標韌體丟失,請下載目標韌體,建議選擇 *在專案中新增低階驅動程式* 和 *作為應用程式中的源* 選項。最後,單擊 Finish。

    StackOverflow 文件

閃爍 LED 應用

由於此專案是使用 STM32F4 Discovery 建立的,因此在 / STM32F4_Discovery-Blinky / Utilities / STM32F4-Discovery / project 資料夾下已有幾個即用型功能,可用於連線 Discovery 工具包的外圍裝置(加速度計,音訊) ,LED,按鈕)。在這個例子中,將從 stm32f4_discovery.c 檔案中使用 void BSP_LED_Init(Led_TypeDef Led)void BSP_LED_Toggle(Led_TypeDef Led) 函式來閃爍綠色 LED,即 LED4。決定哪個 LED 使用 Discovery 工具包的原理圖。

StackOverflow 文件

一些 #defineenum 已經隱藏了實際的引腳和埠名稱,使用 Ctrl + Click 來跟蹤它們。

  1. main 內部,呼叫 HAL_Init() 函式,重置所有外設,初始化 Flash 介面和 Systick。 (Systick 將用於生成閃爍的延遲。)
  2. 必須配置系統時鐘。可以使用 STM32CubeMX 時鐘配置功能或參考手冊來完成。在此示例中,系統時鐘由內部 PLL(鎖相環)提供,內部 PLL 由外部 8 MHz 晶體振盪器(HSE)提供。預分頻器已設定為實現最大可用頻率,在 F4 發現的情況下為 168 MHz。
  3. 初始化外設,在本例中為 GPIO 引腳。
  4. 在無限迴圈內,呼叫 LED 切換和 HAL_Delay() 功能。HAL_Delay() 使用 Systick 並以毫秒為單位產生延遲。

整個程式碼如下:

#include "stm32f4xx.h"
#include "stm32f4_discovery.h"
            
void SystemClock_Config(void);

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

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

    /* Initialize one of the LED GPIO pin */
    BSP_LED_Init(LED4);

    while(1)
    {
        BSP_LED_Toggle(LED4);
        HAL_Delay(1000);       // in miliseconds
    }
}

/**
 * @brief  System Clock Configuration
 *         The system Clock is configured as follow :
 *            System Clock source            = PLL (HSE)
 *            SYSCLK(Hz)                     = 168000000
 *            HCLK(Hz)                       = 168000000
 *            AHB Prescaler                  = 1
 *            APB1 Prescaler                 = 4
 *            APB2 Prescaler                 = 2
 *            HSE Frequency(Hz)              = HSE_VALUE
 *            PLL_M                          = (HSE_VALUE/1000000u)
 *            PLL_N                          = 336
 *            PLL_P                          = 2
 *            PLL_Q                          = 7
 *            VDD(V)                         = 3.3
 *            Main regulator output voltage  = Scale1 mode
 *            Flash Latency(WS)              = 5
 * @param  None
 * @retval None
 */
void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;

  // Enable Power Control clock
  __PWR_CLK_ENABLE();

  // The voltage scaling allows optimizing the power consumption when the
  // device is clocked below the maximum system frequency, to update the
  // voltage scaling value regarding system frequency refer to product
  // datasheet.
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  // Enable HSE Oscillator and activate PLL with HSE as source
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  // This assumes the HSE_VALUE is a multiple of 1MHz. If this is not
  // your case, you have to recompute these PLL constants.
  RCC_OscInitStruct.PLL.PLLM = (HSE_VALUE/1000000u);
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
  // clocks dividers
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK
      | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
}

使用錘子構建, StackOverflow 文件 通過右鍵單擊專案資料夾並選擇 Target→Program chip … 選項來下載應用程式。

另一種下載方式是使用 debug 。為此,請單擊 StackOverflow 文件 工具欄中錯誤圖示旁邊的箭頭,然後開啟“ 除錯配置…” 選單。建立一個新的 Ac6 STM32 除錯配置,如果 C / C++ Application 欄位為空,請填寫以下內容:

除錯\ STM32F4_Discovery,Blinky.elf

其他除錯引數(如 OpenOCD 配置檔案和使用的 Telnet 和 GDB 埠)由框架自動生成和填充。最後,單擊除錯按鈕。