这是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;
#endif
ENABLE();
#if ((defined IFX_CFG_SSW_ENABLE_TRICORE0) && (IFX_CFG_SSW_ENABLE_TRICORE0 == 0))
safetyWdtPassword = Ifx_Ssw_getSafetyWatchdogPassword();
Ifx_Ssw_disableSafetyWatchdog(safetyWdtPassword);
#endif
cpuWdtPassword = 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完成的,所有这样改一下。