一、HAL固件包获取(STM32F407ZGT6为例)
ST官网:
下滑找到下载按钮下载
二、固件包文件结构介绍
2.1 总体结构简介
- _htmresc -----------------------包含一些图片,没用
- Documentation ----------------固件包说明文档,有需要则观看
- Drivers ---------------------------驱动源码
- Middlewares --------------------ST官方或者第三方的中间文件
- Projects --------------------------ST官方开发板的一些例程
- Utilities ---------------------------为ST官方开发板例程提供的公共组件
- package.xml --------------------固件包版本信息
- Package_license.html --------软件版权信息
- Package_license.md ---------软件版权信息
- README.md -------------------自述文件
- Release_Notes.html ---------补充或更新的描述
2.2 Drivers文件夹简介
- BSP -----------------------------------板级支持包 ,适配与ST官方开发板
- CMSIS --------------------------------符合CMSIS的组件,包括:DSP库、Cortex-M内核及其设备文件、微控制器专用头文件、启动文件、专用系统文件
- STM32F4xx_HAL_Driver --------HAL库外设驱动代码,F4系列HAL库源文件和头文件
2.3 Middlewares文件夹简介
ST | STemWin | STemWin工具包 |
STM32_USB_Device_Library | USB从机设备支持包 | |
STM32_USB_Host_Library | USB主机设备支持包 | |
Third_Party | FatFs | FAT文件系统支持包 |
FreeRTOS | FreeRTOSqia实时系统支持包 | |
LwIP | LwIP网络通信协议支持包 |
2.4 工程创建主要使用文件
主要使用Drivers文件夹中的CMSIS与STM32F4xx_HAL_Driver文件夹中文件
CMSIS | Device | 存放微控制器专用头文件、启动文件、专用系统文件 |
Include | 存放Cortex-M内核及其设备文件、编译器相关头文件 |
Device文件夹下所需使用文件:
在CMSIS->Device->ST->STM32F4xx->Include 路径下的 | |
stm32f4xx.h | 所有F4系列的顶层头文件,通过条件编译包含某个芯片的头文件,定义通用的枚举类型,定义通用的宏定义(F4系列公用) |
stm32f407xx.h | 包含中断编号定义、外设寄存器结构类型体定义、寄存器映射、寄存器定义、外设判定(根据芯片型号自选) |
system_stm32f4xx.h | 与system_stm32f4xx.c一起定义了系统初始化函数SystemInit和系统时钟更新函数SystemCoreClockUpdate(F4系列公用) |
在CMSIS->Device->ST->STM32F4xx->Source->Templates 路径下的 | |
system_stm32f4xx.c | 与system_stm32f4xx.h一起定义了系统初始化函数SystemInit和系统时钟更新函数SystemCoreClockUpdate(F4系列公用) |
在CMSIS->Device->ST->STM32F4xx->Source->Templates->arm 路径下的 (本人使用arm的编译器,请根据自己使用的编译器自选) | |
startup_stm32f407xx.s | F407系列芯片的启动文件(根据芯片型号以及编译器类型自选) |
Include文件夹下所需使用文件:
在CMSIS->Include 路径下的 | ||
cmsis_armcc.h | Arm Compiler 5 (AC5) 编译器所需头文件 | |
cmsis_armclang.h | Arm Compiler 6 (AC6) 编译器所需头文件 | |
cmsis_compiler.h | AC5、AC6共用头文件 | |
cmsis_version.h | 编译器版本头文件 | |
core_cm4.h | Cortex-M4内核所需头文件(据型号自选F1是M3) | |
mpu_armv7.h | mpu内存保护所需头文件 |
三、创建HAL工程
3.1 裁剪得到所需CMSIS文件夹
删除CMSIS文件夹下无用文件,删除选中的文件留下所需的Device、Include文件夹
进入CMSIS->Device->ST->STM32F4xx,删除选中的文件留下所需的Include、Source文件夹
进入CMSIS->Device->ST->STM32F4xx->Include,删除无用文件留下如下所需的文件
进入CMSIS->Device->ST->STM32F4xx->Source->Templates,删除无用文件留下如下所需的文件
进入CMSIS->Device->ST->STM32F4xx->Source->Templates->arm,删除无用文件留下如下所需的启动文件
进入CMSIS->Include,删除无用文件留下如下所需的文件
3.2 创建工程文件
(1)新建文件夹存放工程
创建一个自命名文件夹存放整个工程,并在文件夹下创建Drivers、Middlewares、Output、Projects、User 5个子文件夹存放不同文件
Drivers | 存放与硬件相关的驱动层文件 |
Middlewares | 存放中间层组件、第三方层文件 |
Output | 存放工程编译产生的输出文件 |
Projects | 存放MDK工程文件 |
User | 存放HAL库用户配置文件、main.c文件、中断处理文件以及分散加载文件 |
(2)Drivers文件夹
进入Drivers文件夹新建名为BSP的文件夹,复制刚刚裁剪的CMSIS文件夹粘贴至Drivers下,复制从ST官网下载的HAL库固件包中的Drivers文件夹下的STM32F4xx_HAL_Driver文件夹粘贴至自己工程中的Drivers文件夹下,从正点原子的开发板资料中拷贝SYSTEM文件夹至Drivers下
进入刚刚粘贴过来的STM32F4xx_HAL_Driver文件夹中删除所选文件,只留下所需的Inc和Src文件夹
(3)Middlewares文件夹
该文件夹可存放其他中间件以及第三方组件库如文件系统、嵌入式实时系统、网络协议、消息协议、GUI等等,现在暂时未使用,空置。
(4)Output文件夹
存放编译器编译输出的中间文件,如.hex、.bin、.o文件等,需要后续结合编译器配置,暂时空置。
(5)Projects文件夹
存放编译器(MDK、IAR等)工程文件,本人使用MDK,所以在该文件夹下新建MDK-ARM文件夹存放MDK文件。
(6)User文件夹
存放HAL库用户配置文件、main.c文件、中断处理文件以及分散加载文件
进入从ST官网下载的HAL库固件包中的Projects文件夹,点击型号匹配的例程文件夹后按Templates->Inc路径进入Inc文件夹复制stm32f4xx_hal_conf.h、stm32f4xx_it.h两个文件粘贴至自己创建的工程的User文件夹下,再返回从ST官网下载的HAL库固件包中的Projects文件夹内,按Templates->Src路径进入Src文件夹复制stm32f4xx_it.c文件粘贴至自己创建的工程的User文件夹下
(7)Keil创建工程
在Keil新建工程自命名并将存放目录改为刚刚新建的工程文件夹中的Projects下的MDK-ARM中
选择对应芯片,按确定后弹出这个窗口直接按取消cancel即可
由于我们自己创建了存放输出文件的文件夹,可以把keil自动生成的存放输出文件的文件夹删除,进入自己工程文件夹中的Projects的MDK-ARM文件夹中删除Listings、Objects文件夹
修改工程名与分组名:点击图中按钮进入修改
按如下添加工程名与分组,可自行修改
添加启动文件:选择Startup分组后按下Add Files进入->Drivers->CMSIS->Device->ST->STM32F4xx->Source->Templates->arm路径下,修改文件类型为All files选中 startup文件点击add添加
在User分组中添加stm32f4xx_it.c,选中User,文件在工程文件夹的User文件夹中,其他步骤相同如上
在User分组中添加system_stm32f4xx.c, 选中User,文件在工程文件夹的Drivers->CMSIS->Device->ST->STM32F4xx->Source->Templates文件夹中,其他步骤相同如上
在Drivers/SYSTEM分组中添加delay.c、sys.c、usart.c三个源码,分别在Drivers->SYSTEM->delay、Drivers->SYSTEM->sys、Drivers->SYSTEM->usart三个文件夹下,操作步骤如上
添加hal库源码,所需文件存放在Drivers->STM32F4xx_HAL_Driver->Src中,所需文件如下图,
配置完成后点击OK完成配置,看到左侧文件栏带有小钥匙标志,表示文件处于只读状态,需要解开
对所需解锁的文件夹右键属性修改,或者对你的工程根目录修改属性把只读取消并作用于子目录也许
接下来KEIL中设置
配置外部晶振为8M(根据自己的芯片板子选择),编译器选择AC5
勾选生成HEX文件
修改输出hex文件存放位置为自己工程的Output文件夹
修改listing输出文件存放位置为自己工程的Output文件夹
设置全局宏定义,两个宏USE_HAL_DRIVER、STM32F407xx用逗号隔开,两个宏在stm32f4xx.h里用于条件编译,优化等级为默认Level 0,勾选C99 Mode
添加头文件路径
选择仿真器
设置仿真器选择SW,时钟选择最大的即可
设置Utilities
勾选魔术棒
创建main.c并保存在User文件夹
双击左侧组栏User找到User文件夹下的main.c文件添加至User组
在stm32f4xx_it.c中加入 #include "stm32f4xx_hal.h" 头文件引用
可以开始写自己的main了