stm32 对于 rt-thread 的 bsp 移植

参考链接

STM32 系列 BSP 制作教程

STM32 系列外设驱动添加指南

步骤

bsp 模板

复制 bsp/stm32/libraries/templates 下面复制你的型号的模板 到 bsp/stm32/下,改成你喜欢的名字

配置 gcc

rtconfig.py, 配置编译器

1
2
3
4
5
if CROSS_TOOL == "gcc":
PLATFORM = "gcc"
EXEC_PATH = (
os.getenv("HOME") + "/dev/embedded/rt-thread/gcc-arm-none-eabi-6_2-2016q4/bin/"
)
1
scons -c; scons --dist

生成 cubeMX 项目

创建跟你 mcu 一样的项目,修改配置,生成代码。

复制 Inc 和 Src 目录到 board/CubeMX_Config 下覆盖

从 board/CubeMX_Config 里面找到 main.c,复制 SystemClock_Config() 到 board/board.c 里面,这是唯一需要手工复制的函数,如果不复制,可能会出现烧录以后失去响应的问题

时钟配置

强烈建议看一下原理图,里面 mcu 相关的晶振部分的频率,在 cubeMX 的时钟部分的 HSE 和 LSE 的频率,一定要和原理图里面的一致

串口引脚配置

注意看原理图里面的串口引脚,是否有重新映射的引脚,不然无法通信

配置 Kconfig

修改 board/Kconfig,搜索 config SOC_STM32, 改为相应的芯片型号

如果需要 i2c 等配置,而当前的 Kconfig 里面没有的话,可以从别的 bsp 里面借鉴一下

flash 和 ram 大小相关

bsp_helper.py

注意真实的大小

mcu 具体的 flash 和 ram 大小,最好看一下芯片手册,比如 f407igt6 里面,有 64k 的内存是保留不能使用的

可以使用 segger 公司的 JFlashLiteExe 查看具体芯片的 flash 和 ram 大小, v6.86g 这个版本是最后一个能看内存大小的版本,推荐使用

SConscript

修改 board/SConscript, 看看芯片等信息有没有错误

搜索 CPPDEFINES, 改成你的芯片对应的型号,具体写法参考 CPPDEFINES 上面的内容里面改

根据你的芯片型号,修改下面对应的汇编启动文件 xxxxxx.s, 如果不知道用哪个,可以用 cubeMX 生成项目以后找,看用的是哪个文件

1
2
3
4
5
6
if rtconfig.CROSS_TOOL == 'gcc':
src += [startup_path_prefix + '/STM32F1xx_HAL/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc/startup_stm32f103xb.s']
elif rtconfig.CROSS_TOOL == 'keil':
src += [startup_path_prefix + '/STM32F1xx_HAL/CMSIS/Device/ST/STM32F1xx/Source/Templates/arm/startup_stm32f103xb.s']
elif rtconfig.CROSS_TOOL == 'iar':
src += [startup_path_prefix + '/STM32F1xx_HAL/CMSIS/Device/ST/STM32F1xx/Source/Templates/iar/startup_stm32f103xb.s']