一、移植前准备
HK32F030数据手册
HK32F030用户手册
HKMicroChip.HK32F0xx_DFP
HK32F0xx外设库
rt-thread源码
rt-thread env工具
formatting工具
二、移植过程
2.1获取源码
移植完成后需要向RTT提交PR,所以拉取源码前先从rtt官方代码库fork到自己的仓库,然后从自己仓库clone到本地。
创建一个新的分支用于添加bsp
2.2添加bsp目录
Cortex内核的MCU移植原理都大同小异,比较容易上手的方式就是找一个比较符合目标芯片的bsp作为参考。我选择作为参考的bsp目录是at32,虽然内核不同于at32的Cortex-M4,但是这个bsp的目录结构比较符合我的审美。
在bsp目录下创建名为hk32的文件夹,下级目录再分别创建hk32f030c8和libraries目录,libraries用于放置通用的外设库和驱动库。
hk32f030c8目录下则拷贝at32f403a-start下的所有文件。
2.3修改工程文件
修改keil5的工程模板文件template.uvprojx,主要是选择目标芯片
修改根目录下SConstruct文件,主要是与外设库和驱动库目录有关,使用相对地址即可
SDK_ROOT = os.path.abspath('./')
if os.path.exists(SDK_ROOT + '/libraries'):
libraries_path_prefix = SDK_ROOT + '/libraries'
else:
libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries'
SDK_LIB = libraries_path_prefix
Export('SDK_LIB')
objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
hk32f0_library = 'HK32F0xx_StdPeriph_Driver'
rtconfig.BSP_LIBRARY_TYPE = hk32f0_library
objs.extend(SConscript(os.path.join(libraries_path_prefix, hk32f0_library, 'SConscript')))
objs.extend(SConscript(os.path.join(libraries_path_prefix, 'rt_drivers', 'SConscript')))
DoBuilding(TARGET, objs)
修改board目录下Kconfig、SConscript文件,为了方便使用env工具,相关的菜单脚本和构建脚本文件也要修改
芯片型号及其家族
config SOC_HK32F030C8T6
bool
select SOC_SERIES_HK32F0XX
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
启动文件等
src = Split('''
board.c
msp/hk32_msp.c
''')
path = [cwd]
path += [cwd + '/msp']
startup_path_prefix = SDK_LIB
src += [startup_path_prefix + '/HK32F0xx_StdPeriph_Driver/CMSIS/HK32F0xx/Source/system_hk32f0xx.c']
if rtconfig.CROSS_TOOL == 'gcc':
src += [startup_path_prefix + '/HK32F0xx_StdPeriph_Driver/CMSIS/HK32F0xx/Source/gcc/startup_hk32f030x4x6x8.s']
elif rtconfig.CROSS_TOOL == 'keil':
src += [startup_path_prefix + '/HK32F0xx_StdPeriph_Driver/CMSIS/HK32F0xx/Source/ARM/startup_hk32f030x4x6x8.s']
elif rtconfig.CROSS_TOOL == 'iar':
src += [startup_path_prefix + '/HK32F0xx_StdPeriph_Driver/CMSIS/HK32F0xx/Source/iar/startup_hk32f030x4x6x8.s']
CPPDEFINES = ['HK32F030x8']
外设库下的SConscript文件
src = Split("""
src/hk32f0xx_adc.c
src/hk32f0xx_crc.c
src/hk32f0xx_dbgmcu.c
src/hk32f0xx_divsqrt.c
src/hk32f0xx_dma.c
src/hk32f0xx_exti.c
src/hk32f0xx_flash.c
src/hk32f0xx_gpio.c
src/hk32f0xx_i2c.c
src/hk32f0xx_iwdg.c
src/hk32f0xx_misc.c
src/hk32f0xx_pwr.c
src/hk32f0xx_rcc.c
src/hk32f0xx_rtc.c
src/hk32f0xx_spi.c
src/hk32f0xx_syscfg.c
src/hk32f0xx_tim.c
src/hk32f0xx_usart.c
src/hk32f0xx_wwdg.c
""")
path = [
cwd + '/CMSIS/HK32F0xx/Include',
cwd + '/CMSIS/Core',
cwd + '/inc',]
CPPDEFINES = ['USE_STDPERIPH_DRIVER']
group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES)
2.4添加驱动
drv_gpio.c和drv_usart.c,主要是实现向pin、serial设备框架的注册以及底层调用接口的实现。因为外设库语法几乎一致,所以不需要花太多精力。
原作者:JonasWen
更多回帖