TA的每日心情 | 奋斗 7 小时前 |
---|
签到天数: 121 天 连续签到: 1 天 [LV.7]常住居民III
|
本帖最后由 andeyqi 于 2024-1-10 13:59 编辑
本次设计的OBD数据采集系统,主要分为两部分MCU负责采集下发CAN总线的车身数据信息,采集到的信息上传到SOC进行数据显示,同时MCU需要记录自身的异常信息支持诊断仪读取异常DTC数据信息。MCU使用NXP车规级芯片S32K146,SOC 使用树莓派4B作为输出显示单元,S23K146的系统使用RT-thread 操作系统,MCU 和SOC 之间通过UART通信交互数据,项目简要框图如下:
RT-thread 系统的移植适配主要是bsp 部分的输配,cpu 相关的光放的代码已经支持了大量的CPU 体系架构的代码,驱动本分的代码一般由厂家sdk 提供,我们只要把sdk 的代码适配到系统里就可以完成最小系统的适配支持,以下链接(https://club.rt-thread.org/ask/article/869d12cbe0bb712b.html)是部分的mcu 的移植说明我们参照下流程及官方的文档(https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/README),参考上面的资料开始我们的主题适配RT-thread 系统至我们的S32K146硬件设备上。
更新RT-thread 代码库bsp 目录下没有S32K14X 的板卡,我们创建个s32k14x 目录并把官方的sdk 软件包放到该目录下待用,参照其他bsp目录结构创建drivers/applications/board 文件夹分别用于防止适配rt-thread 驱动框架的驱动,应用程序及板级初始化程序。
RT-thread 是个高度可裁剪的系统,配置工具使用的是kconfig 工具,在bsp 目录下执行menuconfig 命令图,通过形界面的方式进行配置,我们参照其他bsp ,本地参照的是gd32 的kconfig 将对应的文件拷贝至新建的s32k14x bsp 目录下,kconfig 内容如下:- mainmenu "RT-Thread Configuration"
- config BSP_DIR
- string
- option env="BSP_ROOT"
- default "."
- config RTT_DIR
- string
- option env="RTT_ROOT"
- default "../.."
- config PKGS_DIR
- string
- option env="PKGS_ROOT"
- default "packages"
- source "$RTT_DIR/Kconfig"
- source "$PKGS_DIR/Kconfig"
- source "board/Kconfig"
复制代码
以上配置文件配置了BSP_ROOT/PKGS_ROOT/RTT_ROOT 路径,并引用了 "$RTT_DIR/Kconfig"/"$PKGS_DIR/Kconfig"/"board/Kconfig" 文件,其中"board/Kconfig" 文件配置片上资源配置,shell 使用串口资源是通过此配置文件来配置,我们参照gd32 的配置添加如下配置文件。
RT-thread 的工程配置及文件管理是通过scons 脚本控制的,我们只需要配置需要编译的文件就可以通过scans 命令自动生成IAR/MDK/GCC 的配置工程, 我们本次试验使用的是IAR 的工程,其他工程的实现也是类似。
在对应的BSP 目录下添加 template.ewp 工程模板文件,更新模板文件的Debug/Release 配置下的CPU 型号及链接脚本路径后并保存即可,本地配置的如下。
参照其他BSP 目录下的结构添加如下三个文件至bsp 根目录下:
SConstruct
- import os
- import sys
- import rtconfig
- if os.getenv('RTT_ROOT'):
- RTT_ROOT = os.getenv('RTT_ROOT')
- else:
- RTT_ROOT = os.path.normpath(os.getcwd() + '/../..')
- sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
- try:
- from building import *
- except:
- print('Cannot found RT-Thread root directory, please check RTT_ROOT')
- print(RTT_ROOT)
- exit(-1)
- TARGET = 'rtthread.' + rtconfig.TARGET_EXT
- DefaultEnvironment(tools=[])
- env = Environment(tools = ['mingw'],
- AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
- CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
- AR = rtconfig.AR, ARFLAGS = '-rc',
- CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
- LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
- env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
- if rtconfig.PLATFORM in ['iccarm']:
- env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
- env.Replace(ARFLAGS = [''])
- env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map')
- Export('RTT_ROOT')
- Export('rtconfig')
- SDK_ROOT = os.path.abspath('.')
- if os.path.exists(SDK_ROOT + '/S32SDK_S32K1XX_RTM_4.0.1'):
- libraries_path_prefix = SDK_ROOT + '/S32SDK_S32K1XX_RTM_4.0.1'
- else:
- libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/S32SDK_S32K1XX_RTM_4.0.1'
- SDK_LIB = libraries_path_prefix
- Export('SDK_LIB')
- # prepare building environment
- objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
- # make a building
- DoBuilding(TARGET, objs)
复制代码
按照上面的方法将SDK 的驱动文件加入scons 配置脚本。
- import rtconfig
- from building import *
- # get current directory
- cwd = GetCurrentDir()
- # The set of source files associated with this SConscript file.
- src = Split('''
- platform/devices/S32K146/startup/system_S32K146.c
- platform/devices/startup.c
- ''')
- src += ['platform/drivers/src/clock/S32K1xx/clock_S32K1xx.c']
- src += ['platform/drivers/src/pins/pins_driver.c']
- src += ['platform/drivers/src/pins/pins_port_hw_access.c']
- src += ['platform/drivers/src/interrupt/interrupt_manager.c']
- src += ['platform/drivers/src/lpuart/lpuart_driver.c']
- src += ['platform/drivers/src/lpuart/lpuart_hw_access.c']
- src += ['platform/drivers/src/lpuart/lpuart_irq.c']
- src += ['platform/drivers/src/edma/edma_driver.c']
- src += ['platform/drivers/src/edma/edma_hw_access.c']
- src += ['platform/drivers/src/edma/edma_irq.c']
- src += ['platform/drivers/src/lpi2c/lpi2c_driver.c']
- src += ['platform/drivers/src/lpi2c/lpi2c_hw_access.c']
- src += ['platform/drivers/src/lpi2c/lpi2c_irq.c']
- src += ['rtos/osif/osif_rtthread.c']
- path = [
- cwd + '/platform/drivers/inc',
- cwd + '/platform/drivers/src',
- cwd + '/platform/devices',
- cwd + '/rtos/osif',
- cwd + '/CMSIS/Core/Include',
- cwd + '/platform/devices/S32K146/startup'
- ]
- CPPDEFINES = ['USING_OS_RTTHREAD']
- group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path ,CPPDEFINES = CPPDEFINES)
- Return('group')
复制代码
系统文件添加完毕后通过scons --target=iar 生成IAR工程,下载验证,下载到后串口可以输出信息,开机会输出RT-thread 版本信息系统已经正常运行起来了。
- msh >
- msh >
- \ | /
- - RT - Thread Operating System
- / | \ 5.1.0 build Jan 8 2024 12:22:28
- 2006 - 2022 Copyright by RT-Thread team
- msh >
- msh >
- msh >
复制代码
|
|