查看: 478|回复: 0

[项目提交] 《2023 DigiKey 汽车应用创意挑战赛》 系统适配

[复制链接]
  • TA的每日心情
    奋斗
    7 小时前
  • 签到天数: 121 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2024-1-10 13:19:39 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 andeyqi 于 2024-1-10 13:59 编辑

           本次设计的OBD数据采集系统,主要分为两部分MCU负责采集下发CAN总线的车身数据信息,采集到的信息上传到SOC进行数据显示,同时MCU需要记录自身的异常信息支持诊断仪读取异常DTC数据信息。MCU使用NXP车规级芯片S32K146,SOC 使用树莓派4B作为输出显示单元,S23K146的系统使用RT-thread 操作系统,MCU 和SOC 之间通过UART通信交互数据,项目简要框图如下:
    框图.png

          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 驱动框架的驱动,应用程序及板级初始化程序。


    folder.png



    • 添加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 型号及链接脚本路径后并保存即可,本地配置的如下。
    146.png

    link.png

    • 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 >
    复制代码



    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-5-6 23:02 , Processed in 0.117959 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.