1.板卡简介
AURIX TM TC275 lite 套件配备了基于 32 位单芯片 AURIX TM TriCore TM的微控制器 Aurix TM TC275。该芯片内部有三个运算核、两个校验核,类似于三个高性能单片机集成在一起,具有四通道CAN接口,电机控制器专用接口,4MBFlash。在评估板上提供与Arduino兼容的接口以及MIKROBUS标准的接口板,可以很方便的连接各种扩展板。同时板载FT2232芯片作为调试器以及USB转串口,对于下载、调试十分方便。评估板上各个接口说明如下所示:
2.任务描述
本次完成的是任务一:使用TC275的三个核心,轮流休眠待机,分别控制板卡上的LED灯,如core0检测按键按下,唤醒core1翻转LED1,一秒后,唤醒core2翻转LED2,系统休眠。
3.主要逻辑
本次演示程序的逻辑为:上电之后,CPU0完成LED1、LED2、按键的初始化,然后开启一个超时时间为200ms的系统定时器,周期性唤醒CPU0。
在系统定时器的中断处理函数中,检查按键是否被按下,如果未被按下则设置CPU0的工作模式为休眠模式进行省电;如果检测到按键被按下,则停止系统定时器,然后退出中断处理函数,执行CPU0的业务代码。
CPU0的主循环中设置CPU1的工作模式为运行模式,随后CPU0进入休眠模式。
CPU1被唤醒之后,将LED1的状态进行翻转,然后等待一秒后,将CPU2设置为运行模式,随后CPU1进入休眠模式。
CPU2被唤醒之后,将LED2的状态进行翻转,然后启动系统定时器进行下一次检测,随后CPU2进入休眠模式。
整体流程图如下所示:
4.代码说明
4.1.初始化代码
本次示例程序中,主要使用的外设是LED1、LED2、按键以及一个系统定时器,在下面的初始化代码中,主要进行LED1、LED2、按键对应的GPIO的初始化,随后对系统定时器进行初始化,设置中断处理函数以及超时时间为200ms。
/* Defines the routine to initialize and start the system timer */
void configSystemTimer(void)
{
IfxStm_Timer_Config timerConfig;
/* Setup timerConfig with default values */
IfxStm_Timer_initConfig(&timerConfig, &MODULE_STM0);
timerConfig.base.frequency = RATE_5_HZ; /* Interrupt rate 0.5 Hz or every 2s */
timerConfig.base.isrPriority = ISR_PRIORITY_2; /* Interrupt priority */
timerConfig.base.isrProvider = (IfxSrc_Tos)ISR_PROVIDER_CPU0; /* CPU0 to trigger the interrupt */
timerConfig.comparator = IfxStm_Comparator_0; /* Comparator 0 register is used */
/* Use timerConfig to initialize the STM */
IfxStm_Timer_init(&g_myTimer, &timerConfig);
/* Run STM and set Compare Value */
IfxStm_Timer_run(&g_myTimer);
}
/* Function to initialize the LED port pin and the time constants */
void initLEDAndTime(void)
{
/* Turn off the LED (LED is low-level active) */
IfxPort_setPinHigh(LED1);
IfxPort_setPinHigh(LED2);
/* Set the port pin mode to output push-pull */
IfxPort_setPinMode(LED1, IfxPort_Mode_outputPushPullGeneral);
IfxPort_setPinMode(LED2, IfxPort_Mode_outputPushPullGeneral);
/* Setup the port pin connected to the push button to input mode */
IfxPort_setPinMode(BUTTON, IfxPort_Mode_inputPullUp);
/* Setup the SystemTimer */
configSystemTimer();
/* Initialize the time variable */
g_ticksFor1s = IfxStm_getTicksFromMilliseconds(BSP_DEFAULT_TIMER, WAIT_TIME);
}
4.2.系统定时器中断处理函数
如下所示的代码为系统定时器的中断处理函数,该中断处理函数每隔200ms触发一次。在该中断处理函数中,读取按键对应的GPIO的电平值,当但电平值为0则表示按键被按下,此时停止系统定时器,在系统定时器的中断能处理函数退出之后CPU0会继续执行主函数的中代码逻辑。当按键未被按下的时候,此时将CPU0的工作模式继续设置为休眠模式,等待下一次检测周期。
void systemTimerIsrCmp0(void)
{
/* Enabling interrupts as ISR disables it */
IfxCpu_enableInterrupts();
/* IR acknowledge and set new compare value */
IfxStm_Timer_acknowledgeTimerIrq(&g_myTimer);
/* With the routine getPinState() the value of a particular pin can be retrieved */
if(IfxPort_getPinState(BUTTON) == 0)
{
/* Stop STM */
IfxStm_Timer_stop(&g_myTimer);
}
else
{
/* Set CPU0 in IDLE mode */
IfxCpu_setCoreMode(&MODULE_CPU0, IfxCpu_CoreMode_idle);
}
return;
}
4.3.CPU0主要业务逻辑
如下所示为CPU0主要执行的业务代码,该函数在CPU0的main函数中被不断执行,该函数主要是将CPU0设置为休眠模式,当系统定时器触发时会唤醒CPU0,在执行完中断处理函数之后,会继续执行休眠代码之后的代码,即:通过设置CPU1的工作模式为运行态来唤醒CPU1,随后设置CPU0的工作模式,使CPU0进入休眠状态。
/* Cpu0 run task */
void taskCore0(void)
{
/* Set CPU0 in IDLE mode */
IfxCpu_setCoreMode(&MODULE_CPU0, IfxCpu_CoreMode_idle);
/* Set CPU1 in RUN mode */
IfxCpu_setCoreMode(&MODULE_CPU1, IfxCpu_CoreMode_run);
return;
}
4.4.CPU1主要业务逻辑
如下代码为CPU1的主要业务代码,该函数在CPU1的main函数中被不断调用,进入该函数时,设置CPU1的工作模式进入休眠状态。当CPU1被CPU0唤醒的时候,继续执行之后的业务代码,首先将LED1对应的GPIO的电平进行反转,随后等待1s,通过修改CPU2的工作模式来唤醒CPU2,而CPU1在该函数下一次调用的开始进入休眠状态。
/* Cpu1 run task */
void taskCore1(void)
{
/* Set CPU1 in IDLE mode */
IfxCpu_setCoreMode(&MODULE_CPU1, IfxCpu_CoreMode_idle);
/* Toggle LED1 */
IfxPort_togglePin(LED1);
/* Wait for approximately 1 second */
wait(g_ticksFor1s);
/* Set CPU2 in RUN mode */
IfxCpu_setCoreMode(&MODULE_CPU2, IfxCpu_CoreMode_run);
return;
}
4.5.CPU2主要业务逻辑
如下代码为CPU2的主要业务代码,该函数在CPU2的main函数中被不断调用,进入该函数时,设置CPU2的工作模式进入休眠状态。当CPU2被CPU1唤醒的时候,继续执行之后的业务代码,首先将LED2对应的GPIO的电平进行反转,随后启动系统定时器,周期性唤醒CPU0进行按键检测,触发下一个业务逻辑,而CPU2在该函数下一次调用的开始进入休眠状态。
/* Cpu2 run task */
void taskCore2(void)
{
/* Set CPU2 in IDLE mode */
IfxCpu_setCoreMode(&MODULE_CPU2, IfxCpu_CoreMode_idle);
/* Toggle LED2 */
IfxPort_togglePin(LED2);
/* Run STM and set Compare Value */
IfxStm_Timer_run(&g_myTimer);
return;
}
5.心得体会
通过本次活动,第一次使用英飞凌车规级MCU,整体而言,借助于英飞凌提供的详细文档以及丰富的实例代码,基本上可以做到快速上手,进行简单功能验证。同时TC275的外设丰富,性能强大,使用方便,十分适合刚接触该领域的工程师上手学习。