回答

收藏

《2023 DigiKey 汽车应用创意挑战赛》 系统适配

#竞赛 #竞赛 1668 人阅读 | 0 人回复 | 2024-01-10

本帖最后由 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硬件设备上。


  • 创建 bsp 目录

      更新RT-thread 代码库bsp 目录下没有S32K14X 的板卡,我们创建个s32k14x 目录并把官方的sdk 软件包放到该目录下待用,参照其他bsp目录结构创建drivers/applications/board 文件夹分别用于防止适配rt-thread 驱动框架的驱动,应用程序及板级初始化程序。





  • 添加kconfig 文件

    RT-thread 是个高度可裁剪的系统,配置工具使用的是kconfig 工具,在bsp 目录下执行menuconfig 命令图,通过形界面的方式进行配置,我们参照其他bsp ,本地参照的是gd32 的kconfig 将对应的文件拷贝至新建的s32k14x bsp 目录下,kconfig 内容如下:
  1. mainmenu "RT-Thread Configuration"

  2. config BSP_DIR
  3.     string
  4.     option env="BSP_ROOT"
  5.     default "."

  6. config RTT_DIR
  7.     string
  8.     option env="RTT_ROOT"
  9.     default "../.."

  10. config PKGS_DIR
  11.     string
  12.     option env="PKGS_ROOT"
  13.     default "packages"

  14. source "$RTT_DIR/Kconfig"
  15. source "$PKGS_DIR/Kconfig"
  16. source "board/Kconfig"
复制代码

以上配置文件配置了BSP_ROOT/PKGS_ROOT/RTT_ROOT 路径,并引用了 "$RTT_DIR/Kconfig"/"$PKGS_DIR/Kconfig"/"board/Kconfig"  文件,其中"board/Kconfig" 文件配置片上资源配置,shell 使用串口资源是通过此配置文件来配置,我们参照gd32 的配置添加如下配置文件。
  1. menu "Hardware Drivers Config"

  2. menu "Onboard Peripheral Drivers"
  3. config SOC_S32K146
  4.     bool
  5.     select RT_USING_COMPONENTS_INIT
  6.     select RT_USING_USER_MAIN
  7.     default y
  8. endmenu

  9. menu "On-chip Peripheral Drivers"

  10.     menuconfig BSP_USING_UART
  11.         bool "Enable UART"
  12.         default y
  13.         select RT_USING_SERIAL
  14.         if BSP_USING_UART
  15.             config BSP_USING_UART0
  16.                 bool "Enable UART0"
  17.                 default n

  18.             config BSP_UART0_RX_USING_DMA
  19.                 bool "Enable UART0 RX DMA"
  20.                 depends on BSP_USING_UART0
  21.                 select RT_SERIAL_USING_DMA
  22.                 default n

  23.             config BSP_USING_UART1
  24.                 bool "Enable UART1"
  25.                 default y

  26.             config BSP_UART1_RX_USING_DMA
  27.                 bool "Enable UART1 RX DMA"
  28.                 depends on BSP_USING_UART1
  29.                 select RT_SERIAL_USING_DMA
  30.                 default n

  31.             config BSP_USING_UART2
  32.                 bool "Enable UART2"
  33.                 default n

  34.             config BSP_UART2_RX_USING_DMA
  35.                 bool "Enable UART2 RX DMA"
  36.                 depends on BSP_USING_UART2
  37.                 select RT_SERIAL_USING_DMA
  38.                 default n

  39.             config BSP_USING_UART3
  40.                 bool "Enable UART3"
  41.                 default n

  42.             config BSP_UART3_RX_USING_DMA
  43.                 bool "Enable UART3 RX DMA"
  44.                 depends on BSP_USING_UART3
  45.                 select RT_SERIAL_USING_DMA
  46.                 default n

  47.             config BSP_USING_UART4
  48.                 bool "Enable UART4"
  49.                 default n

  50.             config BSP_UART4_RX_USING_DMA
  51.                 bool "Enable UART4 RX DMA"
  52.                 depends on BSP_USING_UART4
  53.                 select RT_SERIAL_USING_DMA
  54.                 default n

  55.             config BSP_USING_UART5
  56.                 bool "Enable UART5"
  57.                 default n

  58.             config BSP_UART5_RX_USING_DMA
  59.                 bool "Enable UART5 RX DMA"
  60.                 depends on BSP_USING_UART5
  61.                 select RT_SERIAL_USING_DMA
  62.                 default n
  63.         endif

  64.     menuconfig BSP_USING_I2C1
  65.         bool "Enable I2C1 BUS (software simulation)"
  66.         default n
  67.         select RT_USING_I2C
  68.         select RT_USING_I2C_BITOPS
  69.         select RT_USING_PIN
  70.         if BSP_USING_I2C1
  71.             config BSP_I2C1_SCL_PIN
  72.                 int "i2c1 scl pin number"
  73.                 range 1 159
  74.                 default 24
  75.             config BSP_I2C1_SDA_PIN
  76.                 int "I2C1 sda pin number"
  77.                 range 1 159
  78.                 default 25
  79.         endif

  80. endmenu

  81. menu "Board extended module Drivers"

  82. endmenu

  83. endmenu
复制代码

  • scons 配置

      RT-thread 的工程配置及文件管理是通过scons 脚本控制的,我们只需要配置需要编译的文件就可以通过scans 命令自动生成IAR/MDK/GCC 的配置工程, 我们本次试验使用的是IAR 的工程,其他工程的实现也是类似。


  • IAR 工程模板文件创建

        在对应的BSP 目录下添加 template.ewp 工程模板文件,更新模板文件的Debug/Release 配置下的CPU 型号及链接脚本路径后并保存即可,本地配置的如下。


  • bsp 根目录下scons 配置

参照其他BSP 目录下的结构添加如下三个文件至bsp 根目录下:
SConstruct


  1. import os
  2. import sys
  3. import rtconfig

  4. if os.getenv('RTT_ROOT'):
  5.     RTT_ROOT = os.getenv('RTT_ROOT')
  6. else:
  7.     RTT_ROOT = os.path.normpath(os.getcwd() + '/../..')

  8. sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
  9. try:
  10.     from building import *
  11. except:
  12.     print('Cannot found RT-Thread root directory, please check RTT_ROOT')
  13.     print(RTT_ROOT)
  14.     exit(-1)

  15. TARGET = 'rtthread.' + rtconfig.TARGET_EXT

  16. DefaultEnvironment(tools=[])
  17. env = Environment(tools = ['mingw'],
  18.     AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
  19.     CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
  20.     AR = rtconfig.AR, ARFLAGS = '-rc',
  21.     CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
  22.     LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
  23. env.PrependENVPath('PATH', rtconfig.EXEC_PATH)

  24. if rtconfig.PLATFORM in ['iccarm']:
  25.     env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
  26.     env.Replace(ARFLAGS = [''])
  27.     env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map')

  28. Export('RTT_ROOT')
  29. Export('rtconfig')

  30. SDK_ROOT = os.path.abspath('.')

  31. if os.path.exists(SDK_ROOT + '/S32SDK_S32K1XX_RTM_4.0.1'):
  32.     libraries_path_prefix = SDK_ROOT + '/S32SDK_S32K1XX_RTM_4.0.1'
  33. else:
  34.     libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/S32SDK_S32K1XX_RTM_4.0.1'

  35. SDK_LIB = libraries_path_prefix
  36. Export('SDK_LIB')

  37. # prepare building environment
  38. objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)

  39. # make a building
  40. DoBuilding(TARGET, objs)
复制代码

  • SDK 目录下scons 配置
按照上面的方法将SDK 的驱动文件加入scons 配置脚本。
  1. import rtconfig
  2. from building import *

  3. # get current directory
  4. cwd = GetCurrentDir()

  5. # The set of source files associated with this SConscript file.

  6. src = Split('''
  7. platform/devices/S32K146/startup/system_S32K146.c
  8. platform/devices/startup.c
  9. ''')

  10. src += ['platform/drivers/src/clock/S32K1xx/clock_S32K1xx.c']
  11. src += ['platform/drivers/src/pins/pins_driver.c']
  12. src += ['platform/drivers/src/pins/pins_port_hw_access.c']
  13. src += ['platform/drivers/src/interrupt/interrupt_manager.c']
  14. src += ['platform/drivers/src/lpuart/lpuart_driver.c']
  15. src += ['platform/drivers/src/lpuart/lpuart_hw_access.c']
  16. src += ['platform/drivers/src/lpuart/lpuart_irq.c']
  17. src += ['platform/drivers/src/edma/edma_driver.c']
  18. src += ['platform/drivers/src/edma/edma_hw_access.c']
  19. src += ['platform/drivers/src/edma/edma_irq.c']
  20. src += ['platform/drivers/src/lpi2c/lpi2c_driver.c']
  21. src += ['platform/drivers/src/lpi2c/lpi2c_hw_access.c']
  22. src += ['platform/drivers/src/lpi2c/lpi2c_irq.c']
  23. src += ['rtos/osif/osif_rtthread.c']

  24. path = [
  25.     cwd + '/platform/drivers/inc',
  26.     cwd + '/platform/drivers/src',
  27.     cwd + '/platform/devices',
  28.     cwd + '/rtos/osif',
  29.     cwd + '/CMSIS/Core/Include',
  30.     cwd + '/platform/devices/S32K146/startup'
  31.     ]

  32. CPPDEFINES = ['USING_OS_RTTHREAD']

  33. group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path ,CPPDEFINES = CPPDEFINES)

  34. Return('group')
复制代码

系统文件添加完毕后通过scons --target=iar 生成IAR工程,下载验证,下载到后串口可以输出信息,开机会输出RT-thread 版本信息系统已经正常运行起来了。

  1. msh >
  2. msh >
  3. \ | /
  4. - RT -     Thread Operating System
  5. / | \     5.1.0 build Jan  8 2024 12:22:28
  6. 2006 - 2022 Copyright by RT-Thread team
  7. msh >
  8. msh >
  9. msh >
复制代码



分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条