使用 STM32 固件庫開發,首先要看懂官方庫包的目錄佈局與核心文件作用。本文詳細拆解 Libraries 目錄下的三大核心子目錄,並逐一解析啟動文件、系統初始化、外設驅動等關鍵文件的角色。
STM32F10x_StdPeriph_Driver/ // 固件庫源碼(各外設 .c/.h) CMSIS/ // Cortex-M3 內核支援層 Project/ // ST 官方範例工程
| 文件 | 路徑 | 作用 |
|---|---|---|
core_cm3.c/h | CMSIS/CM3/CoreSupport/ | Cortex-M3 內核存取介面(NVIC、SysTick、CPUID 等) |
system_stm32f10x.c/h | CMSIS/CM3/DeviceSupport/ST/STM32F10x/ | 系統時鐘配置、SystemInit() 實現 |
stm32f10x.h | 同目錄 | 全量外設結構體定義、位帶別名、中斷號枚舉、宏定義 |
startup_stm32f10x_{ld,md,hd}.s | CMSIS/CM3/DeviceSupport/ST/STM32F10x/ | 啟動文件:堆疊初始化、中斷向量表、Reset_Handler → SystemInit() → main() |
.s 彙編為例)Reset_Handler PROC
EXPORT Reset_Handler
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0 ; 調用系統初始化(時鐘、FPU 等)
LDR R0, =__main
BX R0 ; 跳轉 C 執行入口
ENDP
三個版本對應容量:ld(小)、md(中)、hd(大),專案根據芯片型號選擇其一加入編譯。
每個外設一對 .c/.h(如 stm32f10x_gpio.c/h、stm32f10x_usart.c/h),封裝:
GPIO_InitTypeDef 等)GPIO_Init())GPIO_SetBits()、GPIO_ReadInputDataBit() 等)開發者無需直接操作寄存器,調用 API 即可,極大降低出錯率與學習曲線。
// 51 單片機時代:直接操作寄存器
P0 = 0x11;
// STM32 寄存器層面(不推薦手寫)
GPIOx->BRR = 0x0011;
// STM32 庫函數層面(標準做法)
void GPIO_ResetBits(GPIO_TypeDef* GPIO, uint16_t GPIO_Pin) {
GPIO->BRR = GPIO_Pin;
}
// 使用者只需:
GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_4);
庫函數向下屏蔽寄存器細節,向上提供統一、可複用、可檢查的 API 介面。
Libraries 目錄加入專案路徑CMSIS/CM3/CoreSupport、CMSIS/CM3/DeviceSupport/ST/STM32F10x、STM32F10x_StdPeriph_Driver/inc.s)與 system_stm32f10x.c 到編譯目標stm32f10x_conf.h 中啟用所需外設模組(#include "stm32f10x_gpio.h" 等)搞清目錄結構與核心文件分工,是高效使用 STM32 固件庫、快速定位問題的前提。