rt-thread/bsp/stm32/docs/STM32系列BSP添加教程.md

165 lines
7.1 KiB
Markdown
Raw Normal View History

# 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/stm32f7xx | F7系列芯片模板 |
| 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)
### 修改工程构建相关文件
接下来需要修改用于构建工程相关的文件。
#### 修改链接脚本
**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 就制作完毕,可以使用了。