在嵌入式開發中,結構體是組織複雜數據的核心工具。上一篇我們介紹了結構體的基本定義與引用方式,本文將深入剖析 STM32 官方標準外設庫如何運用結構體來配置 GPIO 等硬體資源,並透過實際程式碼示範其初始化流程。
當使用結構體指標時,需透過 -> 運算子存取成員。例如若 student1 為結構體指標,存取其 name 成員的寫法為:
student1->name;
STM32 固件庫將 GPIO 配置參數封裝於 GPIO_InitTypeDef 結構體中,其核心定義如下:
typedef enum {
GPIO_Mode_AIN = 0x00, // 類比輸入
GPIO_Mode_IN_FLOATING= 0x04, // 浮空輸入
GPIO_Mode_IPD = 0x28, // 下拉輸入
GPIO_Mode_IPU = 0x48, // 上拉輸入
GPIO_Mode_Out_OD = 0x14, // 開漏輸出
GPIO_Mode_Out_PP = 0x10, // 推挽輸出
GPIO_Mode_AF_OD = 0x1C, // 復用開漏輸出
GPIO_Mode_AF_PP = 0x18 // 復用推挽輸出
} GPIOMode_TypeDef;
typedef enum {
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz = 2,
GPIO_Speed_50MHz = 3
} GPIOSpeed_TypeDef;
typedef struct {
uint16_t GPIO_Pin; // 要配置的腳位
GPIOSpeed_TypeDef GPIO_Speed; // 輸出速率
GPIOMode_TypeDef GPIO_Mode; // 工作模式
} GPIO_InitTypeDef;
以下完整程式碼展示如何利用結構體配置 GPIOB 第 5 腳為推挽輸出,並以軟體延時實現 LED 閃爍:
#include "stm32f10x.h"
void Delay(uint32_t count) {
uint32_t i = 0;
for (; i < count; i++);
}
int main(void) {
GPIO_InitTypeDef GPIO_InitStructure; // 宣告結構體變數
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 開啟 GPIOB 時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 指定 PB5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 50 MHz 速率
GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化 GPIOB
while (1) {
GPIO_ResetBits(GPIOB, GPIO_Pin_5); // 輸出低電平,LED 亮
Delay(3000000);
GPIO_SetBits(GPIOB, GPIO_Pin_5); // 輸出高電平,LED 滅
Delay(3000000);
}
}
RCC_APB2PeriphClockCmd 開啟對應 GPIO 埠的時鐘,否則寄存器操作無效。GPIO_Pin、GPIO_Mode、GPIO_Speed 三個成員。GPIO_Init,由固件庫完成寄存器級配置。GPIO_SetBits/ResetBits 控制腳位電平。掌握結構體在固件庫中的應用模式,能讓嵌入式開發更具條理、可維護性更高,也是從「寫暫存器」邁向「用框架」的關鍵一步。