Funpack2-2_TC275_多核协同点亮LED
在本方案中使用AURIX TC275 Lite评估板,进行多核休眠以及协同工作验证
标签
嵌入式系统
TC275
多核协同
vic
更新2022-10-09
1564

1.板卡简介

AURIX TM TC275 lite 套件配备了基于 32 位单芯片 AURIX TM TriCore TM的微控制器 Aurix TM TC275。该芯片内部有三个运算核、两个校验核,类似于三个高性能单片机集成在一起,具有四通道CAN接口,电机控制器专用接口,4MBFlash。在评估板上提供与Arduino兼容的接口以及MIKROBUS标准的接口板,可以很方便的连接各种扩展板。同时板载FT2232芯片作为调试器以及USB转串口,对于下载、调试十分方便。评估板上各个接口说明如下所示:

FjAINMY5LVd_rBAx_27UFfzcNbrL

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进入休眠模式。

整体流程图如下所示:

FvsjisrzSVQF7TVognj1eihUV_VQ

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的外设丰富,性能强大,使用方便,十分适合刚接触该领域的工程师上手学习。

附件下载
Multicore_1_KIT_TC275_LK.7z
测试代码
团队介绍
吭哧吭哧埋头干,千万别当股东
团队成员
vic
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号