赞
踩
这是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完成的,所有这样改一下。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。