|

【STM32 HAL教學】LED閃燈程式碼

Table of Contents

介紹

大家好,今天要來分享的是stm32 F446RE核心版的實作教學,我們先來實踐一下透過程式碼控制板子上的LED閃燈,此次這邊我們採用的是HAL庫的開發方法。

開發

可以先用cubemx工具,開啟時鐘,GPIO設定,之後再main.c貼上以下程式碼執行。

完整程式碼如下所示。

#include "stm32f4xx_hal.h"

// 前置宣告
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{
    // HAL 初始化
    HAL_Init();
    // 系統時鐘設定
    SystemClock_Config();
    // GPIO 初始化
    MX_GPIO_Init();

    // 主迴圈:LED 閃爍
    while (1)
    {
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);  // 切換 PA5 狀態
        HAL_Delay(500); // 延遲 500ms
    }
}

/* ---------- 系統時鐘設定 (使用 HSI 16MHz,設到 84MHz) ---------- */
void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    // 1. 啟用 HSI 振盪器
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
    RCC_OscInitStruct.PLL.PLLM = 16;
    RCC_OscInitStruct.PLL.PLLN = 336;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;   // 336/4 = 84 MHz
    RCC_OscInitStruct.PLL.PLLQ = 7;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        Error_Handler();
    }

    // 2. 設定時鐘分頻
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
                                | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 使用 PLL
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;   // 84 MHz
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;    // 42 MHz
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;    // 84 MHz

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
    {
        Error_Handler();
    }
}

/* ---------- GPIO 初始化 (PA5 → LED) ---------- */
static void MX_GPIO_Init(void)
{
    __HAL_RCC_GPIOA_CLK_ENABLE(); // 開啟 GPIOA 時脈

    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽輸出
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}


整體程式執行流程:

初始化 HAL → 系統準備好。

設定時鐘 → MCU 運行在 84 MHz。

設定 GPIO → LED 腳位 (PA5) 設成輸出。

進入無限迴圈 → 每 500ms 切換 LED 狀態,形成閃爍效果。

SystemClock_Config() 系統時鐘設定

功能:

  • MCU 啟動時是 16MHz HSI → 這裡透過 PLL 倍頻 變成 84MHz。
  • AHB (CPU 主總線) 跑 84MHz。
  • APB1 跑 42MHz,APB2 跑 84MHz (符合手冊限制)。
  • 設定 Flash 延遲 (FLASH_LATENCY_2) 確保 CPU 能跟上時鐘。

MX_GPIO_Init() GPIO 初始化

這一段就是把 PA5 設定成 LED 輸出腳位

  • __HAL_RCC_GPIOA_CLK_ENABLE():GPIO 外設需要時鐘才能運作。
  • GPIO_MODE_OUTPUT_PP:推挽輸出 (可輸出高/低電壓)。
  • GPIO_NOPULL:LED 不需要上拉/下拉。
  • GPIO_SPEED_FREQ_LOW:一般 LED 不需要高速。

Error_Handler()

如果系統時鐘設定失敗或其他 HAL 錯誤 → MCU 會進這裡。

讓程式停住不再執行下去,讓開發者知道有明顯錯誤產生。

結論

本篇文章介紹了stm32用HAL庫去讓板子上LED閃燈的方式。

Similar Posts