下图是我项目的目录结构,关于目录设计思想,这里不展开描述,只讲解如何将hal库移植到该项目中并配置:

首先先明确 HAL 移植的"最小闭环"需要哪些文件(以STM32F407为例):
-
CMSIS+STM32F4xx_HAL_DriverCMSIS给ARM Cortex‑M内核 +STM32设备提供"最底层统一接口/头文件/启动模板"STM32F4xx_HAL_Driver是ST的HAL驱动库 -
三件套:
startup / system / linker:startup_stm32f407xx.s
MCU 上电复位后执行的第一段代码
system_stm32f4xx.c
芯片级系统初始化与全局时钟变量维护
app.ld
告诉链接器
Flash/RAM/CCMRAM的地址与大小和各内存段(.isr_vector/.text/.rodata/.data/.bss)的位 置,并导出启动文件需要的符号(_estack/_sidata/_sdata/_edata/_sbss/_ebss) -
stm32f4xx_hal_conf.hHAL的"编译期配置开关",决定:- 开启哪些
HAL模块(GPIO/UART/RCC/SDIO/FSMC...) - 时钟参数(例如
HSE_VALUE) - 断言/回调等选项
- 开启哪些
-
stm32f4xx_it.c/.h实现"中断入口函数"
-
stm32f4xx_hal_msp.c实现
HAL提供的"硬件相关回调(钩子)"
关于本项目hal移植,我将其分为三部分:
external/st(原始代码):包括CMSIS和STM32F4xx_HAL_Driver

platform(芯片级):包括startup_stm32f407xx.s和system_stm32f4xx.c

applications(产物级): 包括app.ld、stm32f4xx_hal_conf.h、stm32f4xx_it.c/.h、stm32f4xx_hal_msp.c

在完成文件移植后还需要进行一些配置:
HAL配置文件stm32f4xx_hal_conf.h,必须正确配置:HSE_VALUE(板子外部晶振频率,错了PLL会失败)- 启用用到的
HAL模块宏(例如GPIO/RCC/PWR...)
- 配置
stm32f4xx_it.c/.h,至少实现:SysTick_Handler():调用HAL_IncTick()(建议再调用HAL_SYSTICK_IRQHandler())
至此hal库的移植和配置都已完成,但要想使项目运行起来,在Keil或其他IDE软件中再配置一下编译器、编译路径等,基本就可以用了,如果只想用vscode进行开发,可以配置外部编译器arm-none-eabi-gcc,并用cmake和ninja组织和构建编译,再用openocd+任意仿真器下载程序即可,如果有想了解vscode+arm-gcc+cmake+ninja+openocd这套开发流程的(全链条开源、高效且高度可定制,可跨平台),可以留言,如果超过三个人,我就出一期教程。