🧱 按照“是否可獨立工作”來分:
庫/方式 | 是否可獨立使用 | 是否依賴其他庫 | 說明 |
---|---|---|---|
寄存器裸寫 | ? 是 | ? 無 | 完全自主控制,無庫依賴 |
標準庫(StdPeriph) | ? 是 | ? 只依賴 CMSIS | 自成體系(F1專屬),只用 CMSIS 的 IRQ 宏等 |
LL 庫 | ? 是 | ? 依賴 CMSIS 和 startup 文件 | 官方 LL 是基于 CMSIS 和 startup 的 |
HAL 庫 | ? 是 | ? 依賴 LL(部分)、CMSIS、SysInit | 功能封裝度高,常配合 CubeMX 自動生成 |
CMSIS | ? 是 | ? 無 | ARM 官方標準,常作為基礎層存在 |
CubeMX | ? 不是庫 | ? 生成 HAL/LL 工程 | 它是生成器,不是庫本身 |
libopencm3 | ? 是 | ? 自成體系 | 社區庫,不依賴 HAL/LL,結構清晰 |
RTOS(如FreeRTOS) | ? 是 | ? 通常需要 HAL/LL 支撐底層驅動 | 適用于復雜項目,可以配合 HAL/LL/裸寫等 |
你自定義的 FSM 驅動 | ? 是 | ? 看你是否封裝在庫上 | 可自由封裝 HAL/LL/裸寫,根據風格決定 |
? 總結為一句話:
開發項目時,可以只選用一種庫(HAL、LL、裸寫等)完成全部功能,不需要混用。
但這些庫在內部可能間接依賴更底層的庫(比如 CMSIS),這不是問題,你只要知道它存在即可。
🔍 舉幾個典型開發方式:
🧱 方式 1:純裸寫 + CMSIS(高級硬件控制)
你只包含這幾個文件:
-
startup_stm32f10x.s
(中斷向量表) -
system_stm32f10x.c
(時鐘初始化) -
<core_cm3.h>
(CMSIS 核心支持) -
你自己的
main.c
👉 適合需要極致控制/不依賴任何外部庫的場景
🧱 方式 2:標準庫(F1)單獨用
你包含:
-
CMSIS(自動包含)
-
stm32f10x_gpio.c
、stm32f10x_rcc.c
等標準庫模塊 -
自己寫的業務邏輯
👉 不需要 HAL,也不依賴 LL,適合 F1 系列使用者
🧱 方式 3:HAL 工程(CubeMX 一鍵生成)
CubeMX 幫你生成完整結構,包含:
-
HAL 層:
stm32f1xx_hal_gpio.c
等 -
底層支持文件:
system_stm32f1xx.c
、startup_stm32f103xb.s
-
中間層調用 LL(部分 HAL 會內部用 LL 實現)
👉 適合快速開發和團隊協作項目
🧠 使用推薦:
你的目標 | 推薦策略 |
---|---|
學懂原理、掌控底層 | ? 選擇標準庫 或 LL 庫,能看到寄存器 |
做出可靠 BLE 模塊系統 | ? 用 LL 構建 FSM、狀態機調度、事件隊列等 |
掌控全局,不迷失庫內部 | ? 明確庫的層級依賴,但不盲目混用 |
后續做產品或模塊輸出 | ? 可用 LL+部分 HAL,便于接口封裝 |