2018-11-29 17:00:22 +08:00
|
|
|
|
# STM32 系列 BSP 添加教程
|
|
|
|
|
|
|
|
|
|
为了让广大开发者更好、更方便地使用 BSP 进行开发,RT-Thread 开发团队重新整理了现有的 STM32 系列的 BSP,推出了新的 BSP 框架。新的 BSP 框架在易用性、移植便利性、驱动完整性、代码规范性等方面都有较大提升,在新的 BSP 框架下进行开发,可以大大提高应用的开发效率。
|
|
|
|
|
|
|
|
|
|
和 RT-Thread 以往提供的 BSP 不同,在新的 BSP 文件夹中将不会包含固件库、外设驱动等可以被多个 BSP 引用的代码文件。而是将这些通用的文件统一存放在 Library 文件夹中,通过在特定 BSP 中引用这些文件的方式,来包含 BSP 中所需的库文件或者驱动文件。这种方式不仅大大提高了代码复用率,降低了 BSP 的维护成本,而且可以更方便地给开发者提供更丰富的驱动文件,让开发者可以更容易地找到自己需要的资源。
|
|
|
|
|
|
|
|
|
|
新的 BSP 框架还引入了 CubeMX 工具,使用该工具来对 BSP 中使用的外设引脚进行配置。CubeMX 工具 提供了图形化的配置界面,这种图形化的配置方式对开发者来说更加直观,不仅可以让开发者灵活地配置 BSP 中使用的资源,并且可以让开发者对资源的使用情况一目了然。
|
|
|
|
|
|
|
|
|
|
新 BSP 框架的主要特性如下:
|
|
|
|
|
|
|
|
|
|
- 提供多系列 BSP 模板,大大降低新 BSP 的添加难度;
|
|
|
|
|
- 每个 BSP 都配有齐全的驱动文件,开发者可以方便地使用所有驱动;
|
|
|
|
|
- 开发者可以使用 CubeMX 工具对 BSP 进行图形化配置;
|
|
|
|
|
|
|
|
|
|
## BSP 框架介绍
|
|
|
|
|
|
|
|
|
|
BSP 框架结构如下图所示:
|
|
|
|
|
|
|
|
|
|
![BSP 框架图](./figures/frame.png)
|
|
|
|
|
|
|
|
|
|
STM32 BSP 由三部分组成,分别是 (1) 通用库、(2) BSP 模板和 (3) 特定芯片 BSP,下面的表格以 F1 系列 BSP 为例介绍这三个部分:
|
|
|
|
|
|
|
|
|
|
|项目|文件夹|说明|
|
|
|
|
|
| - | - | :-- |
|
|
|
|
|
| 通用库 | stm32/libraries | 用于存放 HAL 库以及基于 HAL 库的通用驱动文件 |
|
|
|
|
|
| F1 系列 BSP 工程模板 | stm32/libraries/templates/stm32f10x | F1系列 BSP 模板,通过修改该模板制作更多 F1系列 BSP |
|
|
|
|
|
| 特定开发板 BSP | stm32/stm32f103-atk-nano | 在 BSP 模板的基础上修改而成 |
|
|
|
|
|
|
|
|
|
|
## 新 BSP 添加方法
|
|
|
|
|
|
|
|
|
|
本节以添加一个新的名为 `stm32f103-atk-nano` 的 BSP 为例,讲解如何添加一个新的 STM32 系列 BSP。
|
|
|
|
|
|
|
|
|
|
新的 BSP 可以通过修改相应系列的 BSP 模板而快速得到,开发者需要修改的文件主要是在 board 文件夹下,下表总结了需要修改的文件内容:
|
|
|
|
|
|
|
|
|
|
| 项目 | 需要修改的内容说明 |
|
|
|
|
|
|-------------|-------------------------------------------------------|
|
|
|
|
|
| CubeMX_Config (文件夹)| CubeMX 工程 |
|
|
|
|
|
|board.c/h | 系统时钟、GPIO 初始化函数、芯片 SRAM 大小 |
|
|
|
|
|
| Kconfig | 芯片型号、系列、外设资源 |
|
|
|
|
|
| SConscript | 芯片启动文件、目标芯片型号 |
|
|
|
|
|
| linker_scripts (文件夹)| BSP 特定的链接脚本 |
|
|
|
|
|
| template.uvprojx ; template.uvproj ; template.ewp | MDK/IAR 工程模板:修改芯片型号、仿真器选项 |
|
|
|
|
|
|
|
|
|
|
添加新 BSP 的过程分为如下五个步骤:
|
|
|
|
|
|
|
|
|
|
1. 复制通用模板
|
|
|
|
|
2. 使用 CubeMX 配置工程
|
|
|
|
|
3. 修改 Kconfig 文件中 BSP 的特定选项
|
|
|
|
|
4. 修改构建工程相关文件
|
|
|
|
|
5. 重新生成工程
|
|
|
|
|
|
|
|
|
|
在接下来的章节中将会详细介绍这五个步骤,帮助开发者快速创建所需要的 BSP。
|
|
|
|
|
|
|
|
|
|
### 复制通用模板
|
|
|
|
|
|
|
|
|
|
制作新 BSP 的第一步是复制一份同系列的 BSP 模板作为新 BSP 的基础,目前提供的通用 BSP 模板如下:
|
|
|
|
|
|
|
|
|
|
| 工程模板 | 说明 |
|
|
|
|
|
| ------- | ---- |
|
|
|
|
|
| libraries/templates/stm32f10x | F1系列芯片模板 |
|
|
|
|
|
| libraries/templates/stm32f4xx | F4系列芯片模板 |
|
|
|
|
|
| libraries/templates/stm32l4xx | L4系列芯片模板 |
|
|
|
|
|
|
|
|
|
|
拷贝 `stm32/libraries/templates/stm32f10x` 文件夹并改名为 `stm32/stm32f103-atk-nano` 。如下图所示:
|
|
|
|
|
|
|
|
|
|
![复制通用模板](./figures/copy.png)
|
|
|
|
|
|
|
|
|
|
### 使用 CubeMX 配置工程
|
|
|
|
|
|
|
|
|
|
这一步中需要在 **CubeMX_Config** 文件夹下创建一个基于目标芯片的 CubeMX 工程,本次创建示例 BSP 选择的芯片型号为 STM32F103RBTx 。
|
|
|
|
|
|
|
|
|
|
#### 重新生成 CubeMX 工程
|
|
|
|
|
|
|
|
|
|
配置系统时钟、外设引脚等,步骤如下图所示:
|
|
|
|
|
|
|
|
|
|
1. 打开外部时钟、设置下载方式、打开串口外设:
|
|
|
|
|
|
|
|
|
|
![配置芯片引脚](./figures/CubeMX_1.png)
|
|
|
|
|
|
|
|
|
|
2. 配置系统时钟:
|
|
|
|
|
|
|
|
|
|
![配置系统时钟](./figures/CubeMX_2.png)
|
|
|
|
|
|
|
|
|
|
3. 设置项目名称,并在指定地址重新生成 CubeMX 工程:
|
|
|
|
|
|
|
|
|
|
![生成对应的配置代码](./figures/CubeMX_4.png)
|
|
|
|
|
|
|
|
|
|
最终 CubeMX 生成的工程目录结构如下图所示:
|
|
|
|
|
|
|
|
|
|
![CubeMX 图7](./figures/CubeMX_5.png)
|
|
|
|
|
|
|
|
|
|
#### 拷贝初始化函数
|
|
|
|
|
|
|
|
|
|
**board.c** 文件中只包含 SystemClock_Config() 和 MX_GPIO_Init() 这两个函数。这两个函数由 CubeMX 工具生成,需要从目录 `board/CubeMX_Config/Src/main.c` 文件中拷贝到 board.c 文件中,如下图所示:
|
|
|
|
|
|
|
|
|
|
![board_1](./figures/board_1.png)
|
|
|
|
|
|
|
|
|
|
**board.h** 文件内 STM32_SRAM_SIZE 大小修改如下图所示:
|
|
|
|
|
|
|
|
|
|
![board_2](./figures/board_2.png)
|
|
|
|
|
|
|
|
|
|
### 修改 Kconfig 选项
|
|
|
|
|
|
|
|
|
|
修改 `board/Kconfig` 文件内容,如下图所示:
|
|
|
|
|
|
|
|
|
|
![Kconfig](./figures/Kconfig.png)
|
|
|
|
|
|
|
|
|
|
上图中使用的宏定义说明如下所示:
|
|
|
|
|
|
|
|
|
|
| 宏定义 | 意义 | 格式 |
|
|
|
|
|
|-|-|-|
|
|
|
|
|
| SOC_STM32F103RB | 芯片型号 | SOC_STM32xxx |
|
|
|
|
|
| SOC_SERIES_STM32F1 | 芯片系列| SOC_SERIES_STM32xx |
|
|
|
|
|
|
2018-11-30 18:29:37 +08:00
|
|
|
|
用户可参考这个链接学习 Kconfig语法:(https://blog.csdn.net/jianwen_hi/article/details/53398141)
|
|
|
|
|
|
2018-11-29 17:00:22 +08:00
|
|
|
|
### 修改工程构建相关文件
|
|
|
|
|
接下来需要修改用于构建工程相关的文件。
|
|
|
|
|
|
|
|
|
|
#### 修改链接脚本
|
|
|
|
|
**linker_scripts** 链接文件如下图所示:
|
|
|
|
|
|
|
|
|
|
![需要修改的链接脚本](./figures/linker_scripts.png)
|
|
|
|
|
|
|
|
|
|
修改这些文件需要用户掌握链接脚本语法,根据相应的芯片进行修改。
|
|
|
|
|
|
|
|
|
|
#### 修改 SConscript 构建脚本
|
|
|
|
|
**SConscript** 脚本决定 MDK/IAR 工程的生成过程中要添加那些文件。在这一步中需要修改芯片型号以及芯片启动文件的地址,修改内容如下图所示:
|
|
|
|
|
|
|
|
|
|
![修改启动文件和芯片型号](./figures/SConscript.png)
|
|
|
|
|
|
|
|
|
|
#### 修改工程模板
|
|
|
|
|
|
|
|
|
|
**template** 文件是生成 MDK/IAR 工程的模板文件,通过修改该文件可以设置工程中使用的芯片型号以及下载方式。MDK4/MDK5/IAR 的工程模板文件,如下图所示:
|
|
|
|
|
|
|
|
|
|
![MDK/IAR 工程模板](./figures/template_1.png)
|
|
|
|
|
|
|
|
|
|
下面以 MDK5 模板的修改为例,介绍如何修改模板配置:
|
|
|
|
|
|
|
|
|
|
![选择芯片型号](./figures/template_2.png)
|
|
|
|
|
|
|
|
|
|
修改程序下载方式:
|
|
|
|
|
|
|
|
|
|
![配置下载方式](./figures/template_3.png)
|
|
|
|
|
|
|
|
|
|
### 重新生成工程
|
|
|
|
|
|
|
|
|
|
重新生成工程需要使用 env 工具,在 env 界面输入命令 menuconfig 对工程进行配置,并生成新的 rt_config.h 文件。如下图所示:
|
|
|
|
|
|
|
|
|
|
![输入menuconfig进入配置界面](./figures/menuconfig_1.png)
|
|
|
|
|
|
|
|
|
|
![选择要打开的外设](./figures/menuconfig_2.png)
|
|
|
|
|
|
|
|
|
|
下面以重新生成 MDK 工程为例,介绍如何重新生成 BSP 工程。
|
|
|
|
|
|
|
|
|
|
使用 env 工具输入命令 `scons --target=mdk5` 重新生成工程,如下图所示:
|
|
|
|
|
|
|
|
|
|
![重新生成 BSP 工程](./figures/menuconfig_3.png)
|
|
|
|
|
|
|
|
|
|
重新生成工程成功:
|
|
|
|
|
|
|
|
|
|
![重新生成 BSP 工程](./figures/menuconfig_4.png)
|
|
|
|
|
|
|
|
|
|
到这一步为止,新的 BSP 就制作完毕,可以使用了。
|