S32K3 工具篇8:如何移植RTD MCAL现有demo到其他K3芯片

一,文档简介

从NXP的RTD4.0.0的release note里面可以看到,支持的芯片型号非常齐全:

在这里插入图片描述

图 1

从这点可以知道,RTD4.0.0是能够覆盖所有的S32K3系列的芯片的。但是如果想要现成的demo,比如MCAL的demo,可以看到在现成的demo路径下,比如:

C:\NXP\SW32K3_S32M27x_RTD_R21-11_4.0.0\eclipse\plugins\Dio_TS_T40D34M40I0R0\examples\EBT

只有S32K344,S32K358,S32K388,S32K396,S32M276。
所以,如果实际使用中,使用的是其他的S32芯片,比如K312,虽然在RTD支持的范围内,但是却没有现成的demo使用,这个时候就需要自行做移植了。本文将讲解,如何在RTD4.0.0 K344 MCAL demo的基础上移植到S32K312,并且配置对应的EB工程。首先,实现在命令行的执行,成功之后,将能够工作的MCAL代码EB工程移植到S32DS里面。

二 ,平台以及移植步骤

2.1 平台说明

本文基于RTD4.0.0:SW32K3_S32M27x_RTD_R21-11_4.0.0
其余带有patch或者HF的版本,操作过程步骤一致!
硬件平台:S32K312 mini EVB 或者S32K312EVB
其他官方的EVB,比如S32K31XEVB ,或者客户自己的S32K3硬件板子也是一样步骤。
本文由于缺少官方EVB板子,所以是基于S32K312 mini EVB,结合P&E Multilink仿真器下载仿真。平台情况如下:
在这里插入图片描述

图 2

2.2 移植步骤

参考demo可以是RTD4.0.0里面现有的任何一个demo,本文为了简化过程,以DIO为例:

C:\NXP\SW32K3_S32M27x_RTD_R21-11_4.0.0\eclipse\plugins\Dio_TS_T40D34M40I0R0\examples\EBT\S32K3XX\Dio_Example_S32K344

2.2.1 拷贝工程并配置

2.2.1.1 拷贝工程

为了不影响原有的RTD默认demo,这里直接拷贝一个Dio_TS_T40D34M40I0R0,打开路径:

C:\NXP\SW32K3_S32M27x_RTD_R21-11_4.0.0\eclipse\plugins

拷贝Dio_TS_T40D34M40I0R0,另存一个文件夹,名字为:Dio_TS_T40D34M40I0R0_miniK312_doc
其余的芯片过程也是类似的,只需要注意把芯片名称以及相关配置改成需要的芯片即可。
打开文件夹:

C:\NXP\SW32K3_S32M27x_RTD_R21-11_4.0.0\eclipse\plugins\Dio_TS_T40D34M40I0R0_miniK312_doc\examples\EBT\S32K3XX

拷贝一个Dio_Example_S32K344为Dio_Example_S32K312
在这里插入图片描述

图 3

打开路径:

C:\NXP\SW32K3_S32M27x_RTD_R21-11_4.0.0\eclipse\plugins\Dio_TS_T40D34M40I0R0_miniK312_doc\examples\EBT\S32K3XX\Dio_Example_S32K312\TresosProject

修改EB工程Dio_Example_S32K344为Dio_Example_S32K312
在这里插入图片描述

图 4
2.2.1.2 配置工程

进入到新建的Dio_Example_S32K312,使用VScode打开该路径,并且保存VScode workspace到这个路径。
修改project_parameters.mk :

GCC_DIR = C:/NXP/S32DS.3.5_RTD400/S32DS/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi
TRESOS_DIR = C:/EB/tresos_29_0_0
PLUGINS_DIR = C:/NXP/SW32K3_S32M27x_RTD_R21-11_4.0.0/eclipse/plugins
EXAMPLE_DERIVATIVE = S32K312
TRESO_PROJECT_NAME = Dio_Example_S32K312

在这里插入图片描述

图 5

在这里插入图片描述

图6

Check_build_params.mk,删掉如下代码:

ifeq ("$(wildcard $(T32_DIR)/bin/windows/t32marm.exe)","")
    $(error Invalid path set to Trace32. \
    The provided path: from project_parameters.mk T32_DIR=$(T32_DIR) is invalid!)
endif

这部分是给lauterbach trace32用的,如果不删,会报错。

2.2.2 EB 工程配置

下面予以EB工程的配置,打开EB tresos Studio 29.0软件,导入工程。
File->Import->General->Existing Projects into Workspace,添加EB 工程路径:

C:\NXP\SW32K3_S32M27x_RTD_R21-11_4.0.0\eclipse\plugins\Dio_TS_T40D34M40I0R0_miniK312_doc\examples\EBT\S32K3XX\Dio_Example_S32K312\TresosProject\Dio_Example_S32K312

注意,不要点击copy projects into workspace!!!
选中工程Dio_Example_S32K344,右击鼠标,rename 名字为:Dio_Example_S32K312
在这里插入图片描述

图 7

双击someId,打开配置模块。
打开Resource模块,General->ResourceSubderivative 选择为目标芯片partbumber,这里选择:s32k312_hdqfp172
在这里插入图片描述

图 8

保存之后,会发现报很多的错误如下:
在这里插入图片描述

图 9

这里不需要太担心,因为如果仔细分析就会发现,实际上是因为K344上面有的很多模块,K312没有这个模块导致,所以进入报错提示位置,删掉没有的K312模块。
Mcu->McuModeSettingConf->McuPeripheral
点进去可以发现,如果K312没有的模块,已经在peripheral Name的前面有个红叉标志。
在这里插入图片描述

图 10

直接的方法就是,把报错的项目全部删掉,一共有41个。
删除之后,可以发现,所有问题已经没有了:
在这里插入图片描述

图11

选中工程中someId,右击,generate code,可以看到,能够生成工程,并且没有错误。
在这里插入图片描述

图 12

这里不要掉以轻心,虽然到此能够生成代码,并且没有报错,但是实际上还有个地方需要修改。
这里,我们可以先关闭EB tresos工具,然后在VScode里面打开terminal->new terminal, 输入:make generate
可以看到如下结果:
在这里插入图片描述

图13

看到报错的内容是mcucgm0_clockMux0/McuClockMux0Divider5, McuClockMux0Divider6, McuClkMux0Div5_En, McuClkMux0Div6_En.
这里打开S32KRM,可以看到实际上K312是没有MUX_0_5,6的。
在这里插入图片描述

图 14

这时候,再打开EB tresos 软件,界面上也确实有这样的报错,并且在mcucgmClockMux0里面,也没有divider 5,6选项。
在这里插入图片描述

图15

这个时候不需要担心,有个办法可以修改掉这个问题。
关闭EB tresos工具,文本打开:

C:\NXP\SW32K3_S32M27x_RTD_R21-11_4.0.0\eclipse\plugins\Dio_TS_T40D34M40I0R0_miniK312_doc\examples\EBT\S32K3XX\Dio_Example_S32K312\TresosProject\Dio_Example_S32K312\config\Mcu.xdm

文件。直接在文件里面关闭divider 5,6的使能与数值配置。
修改如下代码:

                        </d:var>
                        <d:var name="McuClkMux0Div5_En" type="BOOLEAN" 
                               value="true">
                          <a:a name="IMPORTER_INFO">
                            <a:v>@CALC</a:v>
                            <a:v>@DEF</a:v>
                          </a:a>
                          <a:a name="VARIANTS" type="Variant">
                            <variant:pbvcond>
                              <variant:criterion 
                                                 value="ASPath:/EB/PostBuildSelectable/PostBuildSelectableCriterion"/>
                              <variant:cond>
                                <variant:tst expr="0"/>
                              </variant:cond>
                            </variant:pbvcond>
                          </a:a>
                        </d:var>
                        <d:var name="McuClkMux0Div5_Divisor" type="INTEGER" 
                               value="3">
                          <a:a name="IMPORTER_INFO" value="@DEF"/>
                          <a:a name="VARIANTS" type="Variant">
                            <variant:pbvcond>
                              <variant:criterion 
                                                 value="ASPath:/EB/PostBuildSelectable/PostBuildSelectableCriterion"/>
                              <variant:cond>
                                <variant:tst expr="0"/>
                              </variant:cond>
                            </variant:pbvcond>
                          </a:a>
                        </d:var>
                        <d:var name="McuClkMux0Div5Trigger" type="ENUMERATION" 
                               value="COMMON_TRIGGER_DIVIDER_UPDATE">
                          <a:a name="IMPORTER_INFO" value="@DEF"/>
                          <a:a name="VARIANTS" type="Variant">
                            <variant:pbvcond>
                              <variant:criterion 
                                                 value="ASPath:/EB/PostBuildSelectable/PostBuildSelectableCriterion"/>
                              <variant:cond>
                                <variant:tst expr="0"/>
                              </variant:cond>
                            </variant:pbvcond>
                          </a:a>
                        </d:var>
                        <d:var name="McuClockMux0Divider5_Frequency" 
                               type="FLOAT" value="1.2E7">
                          <a:a name="IMPORTER_INFO">
                            <a:v>@DEF</a:v>
                            <a:v>@CALC</a:v>
                          </a:a>
                          <a:a name="VARIANTS" type="Variant">
                            <variant:pbvcond>
                              <variant:criterion 
                                                 value="ASPath:/EB/PostBuildSelectable/PostBuildSelectableCriterion"/>
                              <variant:cond>
                                <variant:tst expr="0"/>
                              </variant:cond>
                            </variant:pbvcond>
                          </a:a>
                        </d:var>
                        <d:var name="McuClkMux0Div6_En" type="BOOLEAN" 
                               value="true">
                          <a:a name="IMPORTER_INFO">
                            <a:v>@CALC</a:v>
                            <a:v>@DEF</a:v>
                          </a:a>
                          <a:a name="VARIANTS" type="Variant">
                            <variant:pbvcond>
                              <variant:criterion 
                                                 value="ASPath:/EB/PostBuildSelectable/PostBuildSelectableCriterion"/>
                              <variant:cond>
                                <variant:tst expr="0"/>
                              </variant:cond>
                            </variant:pbvcond>
                          </a:a>
                        </d:var>
                        <d:var name="McuClkMux0Div6_Divisor" type="INTEGER" 
                               value="0">
                          <a:a name="IMPORTER_INFO" value="@DEF"/>
                          <a:a name="VARIANTS" type="Variant">
                            <variant:pbvcond>
                              <variant:criterion 
                                                 value="ASPath:/EB/PostBuildSelectable/PostBuildSelectableCriterion"/>
                              <variant:cond>
                                <variant:tst expr="0"/>
                              </variant:cond>
                            </variant:pbvcond>
                          </a:a>
                        </d:var>
                        <d:var name="McuClkMux0Div6Trigger" type="ENUMERATION" 
                               value="COMMON_TRIGGER_DIVIDER_UPDATE">
                          <a:a name="IMPORTER_INFO" value="@DEF"/>
                          <a:a name="VARIANTS" type="Variant">
                            <variant:pbvcond>
                              <variant:criterion 
                                                 value="ASPath:/EB/PostBuildSelectable/PostBuildSelectableCriterion"/>
                              <variant:cond>
                                <variant:tst expr="0"/>
                              </variant:cond>
                            </variant:pbvcond>
                          </a:a>
                        </d:var>
                        <d:var name="McuClockMux0Divider6_Frequency" 
                               type="FLOAT" value="4.8E7">
                          <a:a name="IMPORTER_INFO">
                            <a:v>@DEF</a:v>
                            <a:v>@CALC</a:v>
                          </a:a>
                          <a:a name="VARIANTS" type="Variant">
                            <variant:pbvcond>
                              <variant:criterion 
                                                 value="ASPath:/EB/PostBuildSelectable/PostBuildSelectableCriterion"/>
                              <variant:cond>
                                <variant:tst expr="0"/>
                              </variant:cond>
                            </variant:pbvcond>
                          </a:a>

修改为:

                        </d:var>
                        <d:var name="McuClkMux0Div5_En" type="BOOLEAN" 
                               value="false">
                          <a:a name="IMPORTER_INFO">
                            <a:v>@DEF</a:v>
                            <a:v>@CALC</a:v>
                          </a:a>
                          <a:a name="VARIANTS" type="Variant">
                            <variant:pbvcond>
                              <variant:criterion 
                                                 value="ASPath:/EB/PostBuildSelectable/PostBuildSelectableCriterion"/>
                              <variant:cond>
                                <variant:tst expr="0"/>
                              </variant:cond>
                            </variant:pbvcond>
                          </a:a>
                        </d:var>
                        <d:var name="McuClkMux0Div5_Divisor" type="INTEGER" 
                               value="3">
                          <a:a name="IMPORTER_INFO" value="@DEF"/>
                        </d:var>
                        <d:var name="McuClkMux0Div5Trigger" type="ENUMERATION" 
                               value="COMMON_TRIGGER_DIVIDER_UPDATE"/>
                        <d:var name="McuClockMux0Divider5_Frequency" 
                               type="FLOAT" value="0.0">
                          <a:a name="IMPORTER_INFO">
                            <a:v>@CALC</a:v>
                            <a:v>@DEF</a:v>
                          </a:a>
                        </d:var>
                        <d:var name="McuClkMux0Div6_En" type="BOOLEAN" 
                               value="false">
                          <a:a name="IMPORTER_INFO">
                            <a:v>@DEF</a:v>
                            <a:v>@CALC</a:v>
                          </a:a>
                        </d:var>
                        <d:var name="McuClkMux0Div6_Divisor" type="INTEGER" 
                               value="0">
                          <a:a name="IMPORTER_INFO" value="@DEF"/>
                        </d:var>
                        <d:var name="McuClkMux0Div6Trigger" type="ENUMERATION" 
                               value="COMMON_TRIGGER_DIVIDER_UPDATE">
                          <a:a name="IMPORTER_INFO" value="@DEF"/>
                        </d:var>
                        <d:var name="McuClockMux0Divider6_Frequency" 
                               type="FLOAT" value="0.0">
                          <a:a name="IMPORTER_INFO">
                            <a:v>@DEF</a:v>
                            <a:v>@CALC</a:v>
                          </a:a>

主要是把文件中隐藏的Mux0Divider5,6的使能和frequency value值改掉。
重新打开,可以看到,报错消失,EB工程someId,右击,generate project,代码也能够无报错正常生成。
这里有个小技巧:为了防止之前生成代码和最新EB工程的不匹配,也可以把:

C:\NXP\SW32K3_S32M27x_RTD_R21-11_4.0.0\eclipse\plugins\Dio_TS_T40D34M40I0R0_miniK312_doc\examples\EBT\S32K3XX\Dio_Example_S32K312\generate

文件夹:src,include清空,然后在EB tresos里面,generate project的时候重新生成。
关闭EB软件,在Vscode工程的terminal里面再次输入:make generate
可以看到,这时候已经没有任何问题了:
在这里插入图片描述

图 16

三, 命令行编译及其结果测试

从上面的步骤,已经完成了一个RTD 现有K344工程到K312 MCAL工程的代码以及EB配置移植,下面通过VScode, 命令行形式,生成main.elf, 然后下载测试。
命令:

make generate
make build

main.elf可以在如下文件夹路径找到:

C:\NXP\SW32K3_S32M27x_RTD_R21-11_4.0.0\eclipse\plugins\Dio_TS_T40D34M40I0R0_miniK312_doc\examples\EBT\S32K3XX\Dio_Example_S32K312\out

关于测试,因为有main.elf 文件,以及PE Multilink,可以在S32DS里面新建一个K312的工程,debug接口是PE Multilink的,编译生成代码之后,拷贝main.elf到新建工程的:Debug_FLASH文件夹,在S32DS debug configuration 中,C/C++ application直接替换成main.elf,下载测试。
在这里插入图片描述

图 17

可以看到,已经能够进入debug界面,而且实际测试板上LED灯能够成功闪烁。
说明MCAL 代码porting到K312已经成功。

四, S32DS工程移植以及测试

在之前RTD MCAL EB 工程移植到S32DS的K344工程上,直接修改工程名,修改工程芯片型号,修改ld文件,驱动文件包含等,然后清理工程,编译工程即可。
这里假定已经拥有了RTD MCAL 工程导入到S32DS的工程,然后在此基础上修改。

4.1 S32DS 工程配置

因为在原始RTD 的文件夹下面拷贝过文件夹,所以在S32DS的工程Mcal_Plugins->Link_Source里面多了之前新建的文件夹,需要把这个文件夹不参与编译:

选择Dio_TS_T40D34M40I0R0_minik312_doc,右击Build path->remove from->Debug_FLASH.
在这里插入图片描述

图 18

工程名从Mcal_Dio_S32K344_RTD400 rename为Mcal_Dio_S32K312_RTD400。
修改如下工程配置,project->properties:
(1)preprocessor
S32K344->S32K312
在这里插入图片描述

图 19

(2) Sstandard S32DS C Linker->General
修改

"${MCAL_PLUGIN_PATH}/Platform${MCAL_MODULE_NAME_SUFFIX}/build_files/gcc/linker_flash_s32k344.ld"

"${MCAL_PLUGIN_PATH}/Platform${MCAL_MODULE_NAME_SUFFIX}/build_files/gcc/linker_flash_s32k312.ld"

修改之后,点击apply and close
下面将main.c替换为

C:\NXP\SW32K3_S32M27x_RTD_R21-11_4.0.0\eclipse\plugins\Dio_TS_T40D34M40I0R0_miniK312_doc\examples\EBT\S32K3XX\Dio_Example_S32K312\src\main.c

添加头文件:

#include "Port_Cfg.h"

屏蔽代码:

// #include "check_example.h"
//    Exit_Example(TRUE);

4.2 EB工程替换

拷贝:

C:\NXP\SW32K3_S32M27x_RTD_R21-11_4.0.0\eclipse\plugins\Dio_TS_T40D34M40I0R0_miniK312_doc\examples\EBT\S32K3XX\Dio_Example_S32K312\TresosProject\Dio_Example_S32K312\config

里面所有的.xdm文件到S32DS的EB文件夹,替换老的.xdm:

Mcal_Dio_S32K312_RTD400\Tresos_Project\Mcal_Dio_S32K344_RTD400\config

使用EB tresos打开上面的工程,并且Generate project,生成成功之后,关闭EB工程,回到S32DS

4.3 MCAL S32DS工程测试

先clean project:project->clean project, 然后编译代码。
在这里插入图片描述

图 20

可以看到能够成功编译,然后RUN->debug configuration选择下载代码 xxx_Debug_FLASH_PNE,这里注意,需要把Device从S32K344改变成S32K312
在这里插入图片描述

图 21

配置成功之后,点击debug,下载代码并且仿真,结果如下:
在这里插入图片描述

图 22

可以看到,能够成功进入debug,并且实际上板子上的灯闪烁,说明从RTD MCAL 工程demo移植到S32K312 S32DS也成功运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值