Mbed在自己的stm32F103RCT6系列平台移植适配
前言
本文介绍了如何从零开始在keil中搭建自己的stm32F103RCT6开发环境,其实也没有适配过程,只是一些简单的include代码而已,没啥技术含量,在这里只是做些记录,希望给需要的人一些参考。对于mbed系统,我也是初学,如有错误,还请斧正。
下载安装keil
在此不再赘述,可以参考 这里
下载mbed已经适配好的demo工程
对于stm32f103这种板子,mbed老早就给我们适配好了,各种demo可以从mbed下载,很简单,这里也不赘述了,参考这位兄台的文章即可。我也是参考这位兄台的文章,只可惜自己水平太渣,后面的步骤基本上就看不懂了,感觉也太复杂了。anyway,还是继续这篇傻瓜教程吧。
假设你已经下载了上面文章中提到的demo工程,Nucleo_printf_uvision5_nucleo_f103rb.zip
,打开压缩包发现,没有mbed的源代码,全是.o
文件,那肯定是不行的,其实,这些.o
文件的源码都在mbed-os里面。
下载mbed
从github上下载最新的release版本,我这里用的是mbed-os-tools-release-5.10.0.zip
解压之,最后,我的目录是这样滴:
创建自己的demo
在这个文件夹中创建自己的demo目录,比如叫my_demo
好了,拷贝Nucleo_printf_uvision5_nucleo_f103rb
中的Nucleo_printf.uvoptx
和Nucleo_printf.uvprojx
到这个文件夹下,然后新建一个目录,叫user
好了,把Nucleo_printf_uvision5_nucleo_f103rb
中的main.cpp
mbed_config.h
放到user
中,最后,目录结构是这样滴:
./Nucleo_printf.uvoptx
./Nucleo_printf.uvprojx
./user
./user/main.cpp
./user/mbed_config.h
然后打开上面的工程文件,把工程中的所有文件夹都remove掉,这样,自己的工程算是建立好了。
添加mbed的代码
为了好看,建立两个group吧:
-
user
中添加之前user
文件夹中的main.cpp
config.h
-
mbed
中添加mbed os中的代码
如何从mbed os中摘取这个平台的代码呢,其实很简单,这里罗列了一下代码所在的文件夹
mbed-os-tools-release-5.10.0\drivers
mbed-os-tools-release-5.10.0\hal
mbed-os-tools-release-5.10.0\platform
把上面文件夹或子文件夹中的所有.c
.cpp
.h
文件添加到mbed中。如果遇到如下弹窗:
直接cancel就行,.json
后缀的不需要添加。同理,一些.out
的文件也不需要添加。
还需要添加
mbed-os-tools-release-5.10.0\targets\TARGET_STM #文件夹下所有.c .h .cpp
mbed-os-tools-release-5.10.0\targets\TARGET_STM\TARGET_STM32F1 #文件夹下所有.c .h .cpp
mbed-os-tools-release-5.10.0\targets\TARGET_STM\TARGET_STM32F1\device #文件夹下所有.c .h .cpp
mbed-os-tools-release-5.10.0\targets\TARGET_STM\TARGET_STM32F1\TARGET_NUCLEO_F103RB #文件夹下所有.c .h .cpp
mbed-os-tools-release-5.10.0\targets\TARGET_STM\TARGET_STM32F1\TARGET_NUCLEO_F103RB\device #文件夹下所有.c .h .cpp
mbed-os-tools-release-5.10.0\targets\TARGET_STM\TARGET_STM32F1\TARGET_NUCLEO_F103RB\device\TOOLCHAIN_ARM_STD # **注意,只要添加.S文件即可!**,而这个sct文件,后面会用到,记住这个路径
有点繁琐,仔细添加,不要添加错了!代码添加ok了,接下来添加头文件的include path,我罗列了一下所有的路径,如果你的目录结构和我一致,可以直接用:
.
./user
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0/hal
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0/drivers
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0/hal/storage_abstraction
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0/hal/TARGET_FLASH_CMSIS_ALGO
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0/platform
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0/targets/TARGET_STM
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0/targets/TARGET_STM/TARGET_STM32F1
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0/targets/TARGET_STM/TARGET_STM32F1/device
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/device
最后添加一下sct文件:
该文件就是上文提到的sct文件,该文件是用来link最终的可执行文件的。
编译测试
感觉差不多了,编译一下试试吧:
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Rebuild target 'Nucleo_printf'
compiling BusIn.cpp...
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/device/stm32f103xb.h(150): error: #5: cannot open source input file "core_cm3.h": No such file or directory
#include "core_cm3.h"
..\mbed-os-tools-release-5.10.0\mbed-os-tools-release-5.10.0\drivers\BusIn.cpp: 0 warnings, 1 error
compiling BusInOut.cpp...
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/device/stm32f103xb.h(150): error: #5: cannot open source input file "core_cm3.h": No such file or directory
#include "core_cm3.h"
..\mbed-os-tools-release-5.10.0\mbed-os-tools-release-5.10.0\drivers\BusInOut.cpp: 0 warnings, 1 error
compiling AnalogIn.cpp...
提示说找不到core_cm3.h
这个文件,可能是我们少添加了一些文件吧,添加进去吧:
# 先添加头文件路径
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0/cmsis/TARGET_CORTEX_M
# 再添加缺失的文件到工程中
../mbed-os-tools-release-5.10.0/mbed-os-tools-release-5.10.0/cmsis/TARGET_CORTEX_M/core_cm3.h
继续编译:
compiling mbed_sleep_manager.c...
compiling mbed_us_ticker_api.c...
compiling mbed_ticker_api.c...
compiling flash_common_algo.c...
..\mbed-os-tools-release-5.10.0\mbed-os-tools-release-5.10.0\hal\TARGET_FLASH_CMSIS_ALGO\flash_data.h(57): error: #101: "flash_s" has already been declared in the current scope
struct flash_s {
..\mbed-os-tools-release-5.10.0\mbed-os-tools-release-5.10.0\hal\TARGET_FLASH_CMSIS_ALGO\flash_common_algo.c(72): error: #136: struct "flash_s" has no field "flash_algo"
.r9 = (uint32_t)obj->flash_algo->algo_blob + obj->flash_algo->static_base,
..\mbed-os-tools-release-5.10.0\mbed-os-tools-release-5.10.0\hal\TARGET_FLASH_CMSIS_ALGO\flash_common_algo.c(72): error: #136: struct "flash_s" has no field "flash_algo"
.r9 = (uint32_t)obj->flash_algo->algo_blob + obj->flash_algo->static_base,
..\mbed-os-tools-release-5.10.0\mbed-os-tools-release-5.10.0\hal\TARGET_FLASH_CMSIS_ALGO\flash_common_algo.c(73): error: #136: struct "flash_s" has no field "flash_algo"
.pc = (uint32_t)obj->flash_algo->algo_blob + obj->flash_algo->init
不知所云,查看官方提供的demo里并没有flash_common_algo.c
这个文件,那就把这个文件从工程中去掉吧。继续编译,发现编译成功。如果需要生成hex文件的话,需要配置一下:
这样就OK了。
用串口下载Nucleo_printf.hex
文件到板子上,查看PinNames.h
,这里的SERIAL_TX 对应 PA_2,SERIAL_RX 对应 PA_3,LED1 对应 PA_5,接上杜邦线,发现小灯正常闪烁:
串口数据也正常,适配结束。