这是Tricore MCAL安装路径
打开ADS新建一个AURIX Project
我手上的是龙邱的TC377最小系统, 就这样选
理解下第一个选项
新建好的基础工程是这个样子
删除掉Library文件夹, 因为我们这里要使用的MCAL而不是iLLD库(虽然它们实现的功能大体相同)
在工程里新建一个文件夹为Mcal
将如图所示的文件夹拷贝到工程的Mcal文件夹(直接拷贝到ADS, 这样ADS才能自动识别要编译的.c和将文件夹添加为头文件搜索路径),这个文件夹是TC377寄存器定义, iLLD库也有这个,只是定义貌似和Mcal提供的略有不同。
Mcal文件夹下新建一个Ssw文件夹
将MCAL Demo里面的Ssw代码拷贝到工程对应的文件夹, 这个貌似还是使用的iLLD库的启动代码, 之后用ETAS的话Ssw是RTA生成的
新建一个Integration文件夹
从这个地方拷贝你需要用的的额文件, 我不知道这个是咋生成的, 反正在Demo里先拿过来用
这两个文件要用到也单独拷贝到Integration文件夹
新建一个Platform文件夹
将如图所示的文件拷贝进去
将你需要用到的模块的静态代码文件夹拷贝到Mcal文件夹
假如我只是点个灯, 那么我需要用到MCU PORT DIO模块, 注意McalLib必须默认添加
新建一个文件夹叫McalCfg 将EB生成的配置代码拷贝到这。
EB生成的
#include "Ifx_Ssw_Infra.h"
#include "IFX_Os.h"
#include "Mcu.h"
#include "Port.h"
#include "Dio.h"void core0_main(void)
{unsigned short cpuWdtPassword;unsigned short safetyWdtPassword;ENABLE();cpuWdtPassword = Ifx_Ssw_getCpuWatchdogPassword(&MODULE_SCU.WDTCPU[0]);safetyWdtPassword = Ifx_Ssw_getSafetyWatchdogPassword();Ifx_Ssw_disableCpuWatchdog(&MODULE_SCU.WDTCPU[0], cpuWdtPassword);Ifx_Ssw_disableSafetyWatchdog(safetyWdtPassword);/*MCAL Init鏀惧埌杩欏効*/const Mcu_ConfigType * McuConfigPtr = NULL_PTR;const Port_ConfigType * PortConfigPtr = NULL_PTR;Std_ReturnType InitClockRetVal;Mcu_PllStatusType Mcu_GetPllStatusRetVal = MCU_PLL_STATUS_UNDEFINED;McuConfigPtr = &Mcu_Config;Mcu_Init(McuConfigPtr);InitClockRetVal = Mcu_InitClock((Mcu_ClockType)0);if(InitClockRetVal == E_OK){do{Mcu_GetPllStatusRetVal = Mcu_GetPllStatus();} while(Mcu_GetPllStatusRetVal != MCU_PLL_LOCKED);#if (MCU_DISTRIBUTE_PLL_CLOCK_API == STD_ON)Mcu_DistributePllClock ();
#endif}PortConfigPtr = &Port_Config;Port_Init(PortConfigPtr);McuConfigPtr = NULL_PTR;PortConfigPtr = NULL_PTR;Dio_LevelType led_blue = 1;static uint32 count = 0;/******************/while(1){if(count >= 3000000){count = 0;Dio_WriteChannel(DioConf_DioChannel_DioChannel_LedBlue, led_blue);led_blue = !led_blue;}count++;}
}#include "Ifx_Ssw_Infra.h"
#include "IFX_Os.h"void core1_main(void)
{unsigned short cpuWdtPassword;
#if ((defined IFX_CFG_SSW_ENABLE_TRICORE0) && (IFX_CFG_SSW_ENABLE_TRICORE0 == 0))unsigned short safetyWdtPassword;
#endifENABLE();
#if ((defined IFX_CFG_SSW_ENABLE_TRICORE0) && (IFX_CFG_SSW_ENABLE_TRICORE0 == 0))safetyWdtPassword = Ifx_Ssw_getSafetyWatchdogPassword();Ifx_Ssw_disableSafetyWatchdog(safetyWdtPassword);
#endifcpuWdtPassword = Ifx_Ssw_getCpuWatchdogPassword(&MODULE_SCU.WDTCPU[1]);Ifx_Ssw_disableCpuWatchdog(&MODULE_SCU.WDTCPU[1], cpuWdtPassword);while(1){}
}#include "Ifx_Ssw_Infra.h"
#include "IFX_Os.h"void core2_main(void)
{unsigned short cpuWdtPassword;ENABLE();cpuWdtPassword = Ifx_Ssw_getCpuWatchdogPassword(&MODULE_SCU.WDTCPU[2]);Ifx_Ssw_disableCpuWatchdog(&MODULE_SCU.WDTCPU[2], cpuWdtPassword);while(1){}
}
参考Demo修改一下三个Core的Main函数
编译报错了
将Ifx_Cfg_Ssw.h 中这三个地方由1改为0
编译成功, 我调试了跑起来没问题
Ifx_Cfg_Ssw.h 上述三个定义是指定是否在Ssw阶段初始化PMS和时钟(依赖iLLD库,但我们删除了), 我们的例程这两部分初始化是要放到Ssw结束跳转到Core0_Main() 中调用Mcu_Init,Mcu_InitClock完成的,所有这样改一下。