[S32K3工具部分]:如何使用IAR编译器或IAR项目来编译S32K3 MCAL项目 [S32K3 tool part]:如何使用 IAR 编译器或 IAR 项目来编译 MCAL 项目
1. 摘要
通过定期观察,我发现仍有许多客户在使用MCAL+IAR等平台,包括使用IAR编译器和直接使用IAR IDE的客户。事实上,我在早年从事工业MCU开发工作时,也特别青睐IAR IDE——其编译速度快、效率高,且生成代码的体积小。但是,当我接触汽车MCU后,我发现其普及率并不高,我也注意到部分客户在将MCAL导入IAR时遇到了各种问题。因此,我将直接撰写一篇工具文章,用于介绍如何使用IAR编译器或IAR IDE项目将恩智浦S32K MCAL与EB tresos MCAL结合编译。
本文结合 S32K344 和 RTD600,说明了如何使用 IAR 编译器编译 MCAL 项目,以及如何将 MCAL 直接导入 IAR IDE 项目
2. IAR 编译器与 S32K3 RTD MCAL 项目
2.1 S32K3 硬件和软件
SW32K3_S32M27x_RTD_R21-11_6.0.0
S32K3X4-EVB
基于 Dio_TS_T40D34M60I0R0
IAR:IAR EW for Arm 9.70.1
EB tresos 29.0.0
2.2 使用IAR编译器CMD方法编译MCAL项目步骤
2.2.1 复制一个 RTD MCAL 新项目
打开路径
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins
复制Dio_TS_T40D34M60I0R0,并将其重命名为Dio_TS_T40D34M60I0R0_IAR
kerryzhou_0-1759479138916.png
图1
2.2.2 编译EB tresos项目
使用EB tresos工具打开以下EB tresos项目:
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Dio_TS_T40D34M60I0R0_IAR\examples\EBT\S32K3XX\Dio_Example_S32K344\TresosProject
生成代码:
kerryzhou_1-1759479139017.png
图2
2.2.3 Vscode 打开 Dio_TS_T40D34M60I0R0_IAR 项目
使用 VS Code 打开以下路径文件夹:
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Dio_TS_T40D34M60I0R0_IAR\examples\EBT\S32K3XX\Dio_Example_S32K344
当然,您也可以使用命令行直接打开此文件夹路径,只要确保其与mk和makefile scr位于同一层路径中即可
kerryzhou_2-1759479139074.png
图3
2.2.4 修改Project_parameters.mk
主要修改以下几点:
TOOLCHAIN = iar
IAR_DIR = C:/IAR/ewarm-9.70.1
TRESOS_DIR = C:/EB/tresos_29_0_0
PLUGINS_DIR = C:/NXP/SW32K3_S32M27x_RTD_R21-11_6.0.0/eclipse/plugins
IAR的路径必须与所使用的IAR软件版本一致,以确保能够找到对应的IAR编译器。
kerryzhou_3-1759479139116.png
图4
2.2.5 修改Check_build_params.mk
将以下内容添加到 check_build_params.mk 中:
else ifeq ($(TOOLCHAIN),iar)
ifeq ("$(wildcard $(IAR_DIR)/arm/bin/iccarm.exe)","")
$(error Invalid path set to the IAR compiler. \
The provided path: from project_parameters.mk IAR_DIR=$(IAR_DIR) is invalid!)
Endif
kerryzhou_4-1759479139165.png
图5
2.2.6 修改Makefile
Makefile 需要进行以下 5 点修改:
(1) 编译器变更
ifeq (${TOOLCHAIN},iar)
CC := $(IAR_DIR)/arm/bin/iccarm.exe
LD := $(IAR_DIR)/arm/bin/ilinkarm.exe
AS := $(IAR_DIR)/arm/bin/iasmarm.exe
# Intel Hexadecimal Flash image tool
GENHEX := $(IAR_DIR)/arm/bin/ielftool.exe
HEX_OPTS := --ihex
OUT_OPTS := -o
endif
kerryzhou_5-1759479139311.png
图6
(2) SRC_DIRS 添加 TOOLCHAIN
SRC_DIRS += $(foreach mod,$(MCAL_MODULE_LIST),$(PLUGINS_DIR)/$(mod)_$(AR_PKG_NAME)/src) \
$(foreach mod,$(MCAL_MODULE_LIST_ADDON),$(PLUGINS_DIR_ADDON)/$(mod)_$(AR_PKG_NAME_ADDON)/src) \
$(PLUGINS_DIR)/Platform_$(AR_PKG_NAME)/startup/src \
$(PLUGINS_DIR)/Platform_$(AR_PKG_NAME)/startup/src/m7 \
$(PLUGINS_DIR)/Platform_$(AR_PKG_NAME)/startup/src/m7/$(TOOLCHAIN)
kerryzhou_6-1759479139439.png
图7
(3)链接器文件修改
ifeq ($(LOAD_TO),flash)
ifeq (${TOOLCHAIN},iar)
LINKER_DEF:= $(PLUGINS_DIR)/Platform_$(AR_PKG_NAME)/build_files/${TOOLCHAIN}/linker_flash_$(DERIVATIVE_LOWER).icf
else
LINKER_DEF:= $(PLUGINS_DIR)/Platform_$(AR_PKG_NAME)/build_files/$(TOOLCHAIN)/linker_flash_$(DERIVATIVE_LOWER).ld
endif
else
ifeq (${TOOLCHAIN},iar)
LINKER_DEF:= $(PLUGINS_DIR)/Platform_$(AR_PKG_NAME)/build_files/$(TOOLCHAIN)/linker_ram_$(DERIVATIVE_LOWER).icf
else
LINKER_DEF:= $(PLUGINS_DIR)/Platform_$(AR_PKG_NAME)/build_files/$(TOOLCHAIN)/linker_ram_$(DERIVATIVE_LOWER).ld
endif
endif
kerryzhou_0-1759486694885.png
图8
(4) 编译器选项变更
ifeq ( ${TOOLCHAIN}, iar)
################################################################################
# IAR 编译器选项
################################################################################
clib := $(IAR_DIR)/arm/lib
CCOPT += --cpu=Cortex-M7 \
-DAUTOSAR_OS_NOT_USED \
-DUSE_MCAL_DRIVERS \
--fpu=FPv5-SP \
--cpu_mode=thumb \
--endian=little \
-e \
-Ohz \
--debug \
--no_clustering \
--no_mem_idioms \
--do_explicit_zero_opt_in_named_sections \
--require_prototypes \
--no_wrap_diagnostics \
--diag_suppress=Pa050 \
$(MISRA) \
-D$(PLATFORM) \
-D$(DERIVATIVE) \
-DIAR \
-DUSE_SW_VECTOR_MODE \
-DENABLE_FPU \
-DD_CACHE_ENABLE \
-DI_CACHE_ENABLE
LDOPT := --entry _start \
--启用堆栈使用 \
--skip_dynamic_initialization \
--no_wrap_diagnostics \
--cpu=Cortex-M7 \
--fpu=FPv5-SP
ASOPT := $(ASOPT) \
--cpu Cortex-M7 \
--cpu_mode thumb \
-g \
-r \
-DMULTIPLE_CORE
endif
kerryzhou_8-1759479139911.png
图9
kerryzhou_9-1759479140195.png
图10
那么,这些IAR编译选项是如何形成的呢?您可以参考RTD600的版本说明,其中包含相应的描述
kerryzhou_10-1759479140292.png
图11
(5)Elf 相关更改
ifeq ( ${TOOLCHAIN}, iar)
%.elf: %.o $(LINKER_DEF)
@echo“正在链接$@”
@$(LD) $(ODIR)/*.o $(LDOPT) --config $(LINKER_DEF) --map $(ODIR)/ -o $(ODIR)/$@@
@$(GENHEX) $(HEX_OPTS) "$(ODIR)/$(ELFNAME).elf" "$(ODIR)/$(ELFNAME).hex"
else
%.elf: %.o $(LINKER_DEF)
@echo“正在链接$@”
@$(LD) -Wl,-Map,"$(MAPFILE)" $(LDOPT) -T $(LINKER_DEF) $(ODIR)/*.o -o $(ODIR)/$@@
@$(GENHEX) $(HEX_OPTS) "$(ODIR)/$(ELFNAME).elf" $(OUT_OPTS) "$(ODIR)/$(ELFNAME).hex"
endif
kerryzhou_11-1759479140481.png
图12
2.2.7 编译以生成elf
指挥官:
make clean
使用make进行编译
生成 ELF 文件:
kerryzhou_12-1759479140695.png
图13
生成后,可以将elf烧录到S32K344 EVB板上进行测试。测试结果显示,板载红灯闪烁,则表明IAR编译器可以在命令行模式下运行。
3. 将 RTD MCAL 导入 IAR IDE 项目
本章将介绍如何创建IAR IDE项目并导入MCAL驱动程序,以实现S32K3 MCAL与EB tresos结合运行。
3.1 MCAL IAR IDE 项目 2 种方法
两种方法的区别以及如何导入MCAL驱动程序:
(1)直接将 RTD MCAL 驱动程序复制到 IAR IDE 项目目录
(2)将 IAR IDE 项目驱动程序连接到原始 RTD 驱动程序路径
kerryzhou_13-1759479140899.png
图14
3.2 MCAL IAR IDE 项目导入步骤
3.2.1 创建新的 RTD MCAL IAR 项目文件夹
创建一个新文件夹,并将其命名为:S32K344_DIO_MCAL_RTD600_IAR
3.2.2 为IAR项目创建子文件夹
生成:EB tresos 项目代码
Include:应用相关的include文件
Mcal:来自RTD的mcal驱动程序副本
src:项目主文件
Tresos_Project:EB tresos项目
kerryzhou_14-1759479140922.png
图15
3.2.3 创建EB tresos项目
(1) 按照以下路径创建EB tresos项目:S32K344_DIO_MCAL_RTD600_IAR\Tresos_Project\Mcal_Dio_S32K344_RTD600_IAR
(2)添加模块:BaseNXP、Dem、Dio、EcuC、Mcu、Platform、Port、Resource
(3) 将RTD xdm文件复制到以下路径:
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Dio_TS_T40D34M60I0R0\examples\EBT\S32K3XX\Dio_Example_S32K344\TresosProject\Dio_Example_S32K344\config
至:S32K344_DIO_MCAL_RTD600_IAR\Tresos_Project\Mcal_Dio_S32K344_RTD600_IAR\config
(4)EB tresos 生成项目
EB tresos 代码将生成到文件夹:
S32K344_DIO_MCAL_RTD600_IAR\Generate
kerryzhou_15-1759479141010.png
图16
3.2.4 将RTD相关驱动程序复制到IAR项目文件夹
(1)BaseNXP:header、include、src
(2) Det:include、src
(3)Dio: include, src
(4)Mcu: include, src
(5)平台:build_files、include、src、startup
(6) 端口:include、src
(7)Rte: include, src
将RTD文件夹复制到IAR项目是一种方法,如果您不想复制文件,也可以使用链接器直接添加RTD安装路径驱动程序。
kerryzhou_16-1759479141081.png
图17
3.2.5 IAR IDE 创建 IAR 项目
(1) 项目->创建新项目
(2) 在IAR项目中,添加群组
项目中相关文件夹的结构如图18所示,其中包括:
生成:Include和src->EB tresos项目生成代码
Mcal:Base、Det、Dio、Mcu、平台、端口、Rte->Mcal驱动程序
Src:Main.c->项目主代码
(3) 将RTD mcal相关驱动程序添加到IAR项目
RTD MCAL相关驱动程序文件可以直接从RTD安装路径下载,或复制到IAR项目中的文件夹,这两种方法均能达到相同的效果。
kerryzhou_17-1759479141217.png
图18
(4)IAR 项目平台文件夹添加结果:
kerryzhou_18-1759479141232.png
图19
(5)主代码添加
可以从以下路径复制Main.c:
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Dio_TS_T40D34M60I0R0\examples\EBT\S32K3XX\Dio_Example_S32K344\src
至
S32K344_DIO_MCAL_RTD600_IAR\src
备注:
//#include "check_example.h"
// Exit_Example(TRUE);
3.2.6 IAR项目选项配置
(1)常规选项→目标→设备→NXP S32K344
(2)C/C++ 编译器->预处理器
附加包含目录:
使用从RTD安装路径复制的IAR项目文件夹驱动程序,目录如下:
$PROJ_DIR$\Generate\include
$PROJ_DIR$\mcal\BaseNXP_TS_T40D34M60I0R0\header
$PROJ_DIR$\mcal\BaseNXP_TS_T40D34M60I0R0\include
$PROJ_DIR$\mcal\Mcu_TS_T40D34M60I0R0\include
$PROJ_DIR$\mcal\Platform_TS_T40D34M60I0R0\include
$PROJ_DIR$\mcal\Rte_TS_T40D34M60I0R0\include
$PROJ_DIR$\mcal\Platform_TS_T40D34M60I0R0\startup\include
$PROJ_DIR$\mcal\Det_TS_T40D34M60I0R0\include
$PROJ_DIR$\mcal\Dio_TS_T40D34M60I0R0\include
$PROJ_DIR$\mcal\Port_TS_T40D34M60I0R0\include
$PROJ_DIR$\include
如果您使用RTD安装路径驱动程序,请使用以下目录:
$PROJ_DIR$\Generate\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\BaseNXP_TS_T40D34M60I0R0\header
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\BaseNXP_TS_T40D34M60I0R0\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Mcu_TS_T40D34M60I0R0\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Platform_TS_T40D34M60I0R0\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Rte_TS_T40D34M60I0R0\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Platform_TS_T40D34M60I0R0\startup\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Dio_TS_T40D34M60I0R0\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Port_TS_T40D34M60I0R0\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Det_TS_T40D34M60I0R0\include
$PROJ_DIR$\include
已定义符号:
S32K3XX
S32K344
IAR
USE_SW_VECTOR_MODE
D_CACHE_ENABLE
I_CACHE_ENABLE
ENABLE_FPU
额外选项:
--no_clustering
--no_mem_idioms
--do_explicit_zero_opt_in_named_sections
--require_prototypes
--no_wrap_diagnostics
语言1:
检查是否需要原型
诊断
抑制以下诊断:
Pa050
kerryzhou_19-1759479141564.png
图20
(3)链接器:
需要添加两点:
$PROJ_DIR$\mcal\Platform_TS_T40D34M60I0R0\build_files\iar\linker_flash_s32k344.icf
库->入口符号: _start
kerryzhou_20-1759479141785.png
图21
(4)调试器
设置:PE micro,运行到主程序
额外选项:
使用命令行选项:
--drv_vector_table_base=__ENTRY_VTABLE
kerryzhou_21-1759479141872.png
图22
3.2.7 编译IAR项目
项目->全部重新编译
kerryzhou_22-1759479141894.png
图23
3.2.8 测试结果
下载与调试结果:
kerryzhou_23-1759479142011.png
图24
下载并运行后,板上的红色 LED 灯闪烁,表明 IAR IDE MCAL 导入方法项目已成功运行。
View full article