下载 V2M-MPS2_CMx_BSP
- mps2 的资料很少,所以唯一能下载的是 ARM 官方的
V2M-MPS2_CMx_BSP
,下载地址为: https://keilpack.azureedge.net/pack/Keil.V2M-MPS2_CMx_BSP.1.8.0.pack
- 其实这是个 Keil MDK5 的 Pack 包,安装后,会有相应的头文件、简单的示例
提取启动文件与连接脚本
- 安装
Keil.V2M-MPS2_CMx_BSP.1.8.0.pack
后, 在V2M-MPS2_CMx_BSP\1.8.0\Device\CMSDK_CM3\Source\GCC
路径下,有 mps2-an385 的启动文件与连接脚本
- 把
V2M-MPS2_CMx_BSP\1.8.0\Device\CMSDK_CM3\Source\GCC\gcc_arm.ld
复制到工程qemu-mps2-arm
目录下,可以改为link.lds
。
把 V2M-MPS2_CMx_BSP\1.8.0\Device\CMSDK_CM3\Source\GCC\startup_CMSDK_CM3.S
复制到工程 qemu-mps2-arm/drivers
目录下
-
【备注】也可把整个
V2M-MPS2_CMx_BSP\1.8.0\Device\CMSDK_CM3
目录复制到工程qemu-mps2-arm/drivers
目录下 -
通过简单了解到,这个启动文件与连接脚本,与 STM32F103 系列的很像。
scons 构建环境的搭建
-
RT-Thread BSP 使用 scons 进行构建,所以需要
SConscript
SConstruct
两个文件,另外需要rtconfig.py
文件,这几个文件可以从其他的 RT-Thread bsp 如bsp\stm32\stm32f103-fire-arbitrary
复制过来,修改一下构建路径即可 -
SConscript
文件 无需修改,内容如下,遍历 当前与子目录下的SConscript
,获取构建的目标
# RT-Thread building script for bridge
import os
from building import *
cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
for d in list:
path = os.path.join(cwd, d)
if os.path.isfile(os.path.join(path, 'SConscript')):
objs = objs + SConscript(os.path.join(d, 'SConscript'))
Return('objs')
SConstruct
文件:只需要修改RTT_ROOT
的路径
import os
import sys
import rtconfig
if os.getenv('RTT_ROOT'):
RTT_ROOT = os.getenv('RTT_ROOT')
else:
RTT_ROOT = os.path.join(os.getcwd(), '..', 'rt-thread')
print(RTT_ROOT)
sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
from building import *
TARGET = 'rtthread.' + rtconfig.TARGET_EXT
DefaultEnvironment(tools=[])
env = Environment(tools = ['mingw'],
AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS,
CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
AR = rtconfig.AR, ARFLAGS = '-rc',
LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
env['ASCOM'] = env['ASPPCOM']
Export('RTT_ROOT')
Export('rtconfig')
# prepare building environment
objs = PrepareBuilding(env, RTT_ROOT)
# make a building
DoBuilding(TARGET, objs)
rtconfig.py
文件: 基本不需要修改,注意复制一份 STM32F103 系列 Cortex-M3 的,如bsp\stm32\stm32f103-fire-arbitrary\rtconfig.py
图形配置文件
-
RT-Thread 在 ubuntu 下使用
scons --menuconfig
进行图形界面配置,需要相应的 Kconfig 文件,当前需要两个 Kconfig 文件,BSP 下 Kconfig 与bsp/drivers
下的 Kconfig,如 从bsp\stm32\stm32f103-fire-arbitrary
复制一份,修改一下 -
qemu-mps2-arm/Kconfig
内容,注意修改RTT_DIR
路径
mainmenu "RT-Thread Project Configuration"
config BSP_DIR
string
option env="BSP_ROOT"
default "."
config RTT_DIR
string
option env="RTT_ROOT"
default "../rt-thread"
config PKGS_DIR
string
option env="PKGS_ROOT"
default "packages"
source "$RTT_DIR/Kconfig"
source "$PKGS_DIR/Kconfig"
source "$BSP_DIR/drivers/Kconfig"
-
qemu-mps2-arm/drivers/Kconfig
-
这里需要配置一下 MCU 的信息,如
select ARCH_ARM_CORTEX_M3
,用于选择 RT-Thread 的rt-thread/libcpu/arm/cortex-m3/
-
mps2-an385
的串口是 uart0 开始的,配置一个用于 MSH shell 的串口,当前验证是 uart0 可以正常工作
menu "Hardware Drivers Config"
config SOC_MPS2_CORTEX_M3
bool
select ARCH_ARM_CORTEX_M3
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
menu "Onboard Peripheral Drivers"
config BSP_USING_UART0
bool "Enable UART0"
default y
config BSP_USING_UART1
bool "Enable UART1"
default n
endmenu
endmenu
- 默认需要有一个
rtconfig.h
,这个文件可以手动创建,内容为空即可,然后通过scons --menuconfig
,即可刷新rtconfig.h
的内容,同时生成.config
默认配置文件
mps2-an385 相关的文件
- 当前 把
Keil\V2M-MPS2_CMx_BSP\1.8.0\Device\CMSDK_CM3
复制到 工程qemu-mps2-arm/drivers/
目录下,创建并修改qemu-mps2-arm/drivers/SConscript
,用于编译qemu-mps2-arm/drivers
驱动相关的文件
import rtconfig
from building import *
cwd = GetCurrentDir()
# src = Glob('*.c')
src = Split('''
CMSDK_CM3/Source/system_CMSDK_CM3.c
board.c
drv_common.c
drv_uart.c
''')
list = os.listdir(cwd)
CPPPATH = [cwd]
CPPPATH += [cwd + '/CMSDK_CM3/Include']
CPPPATH += [cwd + '/cmsis/core/include']
objs = []
if rtconfig.PLATFORM in ['gcc']:
src += ['CMSDK_CM3/Source/GCC/startup_CMSDK_CM3.S']
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
for d in list:
path = os.path.join(cwd, d)
if os.path.isfile(os.path.join(path, 'SConscript')):
objs = objs + SConscript(os.path.join(d, 'SConscript'))
objs = objs + group
Return('objs')
-
从其他 bsp,复制一份
board.c
board.h
文件 到qemu-mps2-arm/drivers
,board 初始化 -
从其他 bsp,复制一份
drv_uart.c
drv_uart.h
文件 到qemu-mps2-arm/drivers
,串口驱动 -
从其他 bsp,复制一份
drv_common.c
到qemu-mps2-arm/drivers
,当前主要是 定时器初始化
编译并解决编译错误
-
scons 构建
drivers/system_CMSDK_CM3.c:35:4: error: #error device not specified!
,可以在qemu-mps2-arm/drivers/CMSDK_CM3/Source/system_CMSDK_CM3.c
文件上面定义 MCU 的型号#define CMSDK_CM3
-
scons 构建 缺少
core_cm3.h
文件: 这部分可以复制 Keil MDK5 pack 路径下的\ARM\CMSIS\5.8.0\CMSIS\Core\Include\core_cm3.h
下 -
工程里面创建
qemu-mps2-arm/drivers/cmsis/core/include
目录,把以下文件复制过来 -
\ARM\CMSIS\5.8.0\CMSIS\Core\Include\cmsis_compiler.h
-
\ARM\CMSIS\5.8.0\CMSIS\Core\Include\cmsis_gcc.h
-
\ARM\CMSIS\5.8.0\CMSIS\Core\Include\cmsis_version.h
-
\ARM\CMSIS\5.8.0\CMSIS\Core\Include\core_cm3.h
-
\ARM\CMSIS\5.8.0\CMSIS\Core\Include\mpu_armv7.h
-
待进一步完善驱动、配置、修改并启动 RT-Thread
小结
-
本篇主要是
RT-Thread qemu mps2-an385 bsp
相关文件的准备工作,了解构建过程,并为进一步 适配启动 RT-Thread 做准备 -
本篇的 qemu board
mps2-an385
资料比较少,主要是通过 ARM 官方Keil.V2M-MPS2_CMx_BSP.1.8.0.pack
获取到,并且文档也比较少,不过 RT-Thread 移植主要是 定时器与 串口的移植, CPU 架构部分,RT-Thread libcpu 已经支持 ARM Cortex-M3,所以移植起来主要是 BSP 相关的适配与修改 -
接下来开始 适配与修改BSP,让
mps2-an385
RT-Thread 跑起来