【STM32 HAL教學】LED閃燈程式碼
介紹
大家好,今天要來分享的是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閃燈的方式。
