Funpack2-2:基于TC275的多核点灯
使用英飞凌的TC275开发板,使三个核轮流唤醒休眠,来操作LED灯
标签
点灯
TC275
Funpack2-2
多核开发
sytnocui
更新2022-10-09
哈尔滨工业大学
576

1 项目需求

任务一:

使用TC275的三个核心,轮流休眠待机,分别控制板卡上的LED灯,如core0检测按键按下,唤醒core1翻转LED1,一秒后,唤醒core2翻转LED2,系统休眠

2 硬件介绍

项目使用的开发板为英飞凌的 KIT_AURIX_TC275_LITE 开发板,其搭载的TC275芯片是一个三核的车规级芯片。

描述:

AURIX TM TC275 lite 套件配备了基于 32 位单芯片 AURIX TM TriCore TM的微控制器 Aurix TM TC275。它可以与一系列开发工具一起使用,包括 AURIX TM Development Studio、英飞凌免费的基于 Eclipse 的 IDE,或来自 Hightec/PLS/Infineon 的基于 Eclipse 的“FreeEntryToolchain”。

特性:

  • Arduino 连接器

  • Arduino ICSP 连接器

  • 稳压器 5V 至 3.3V

  • 可选 0 欧姆电阻器(1210 英制中的 R39_opt/R40_opt)

  • Arduino 连接器(数字)

  • 用于 AURIX™ TM的 20 MHz 晶振和用于 OCDS 的 12 MHz 晶振

  • 用于 WIFI/BLE 的 Mikrobus 连接器

  • 英飞凌 CAN 收发器 TLE9251VSJ 和 CAN 连接器

  • 针连接器 X2

  • 电源指示灯 (D5)

  • LED D1/D2 用于 ADBUS7/4 和 LED3 用于 ESR0 信号(低电平有效)

  • Arduino 针连接器(电源和模拟输入)

  • 电位器 (10 kOhm) 和可焊接的 0 Ohm 电阻器(0805 英制中的 R33)

  • 微型 USB(推荐 USB3.0)

  • 10 针 DAP 连接器

  • 复位按钮

  • 2 x Shield2GO 连接器,用于 Infineon Maker Shields

  • EEPROM 1Kbit

 

实物图如下:

FmXapGjH8H-ZjojNHUOYfFY0e3VO

布局

FsnTPGxAa34giedMx2wldWNhVvea

硬件框图如下:

FlfbDkYPqntizOh06y1YC2sAwscS

本项目使用了全彩LCD、按键与姿态传感器模块,并使用spi扩展接口控制LED灯板

3 功能展示

本项目实现的功能非常简单,就是点击按键,一个LED翻转,另一个LED等一秒钟之后翻转。

Frsn4yVq3uC4wxPrvoKkmNbA_a-e

4 实现思路

  • 首先配置环境

  • 在英飞凌官方的例程中找寻相关的,学习其API

  • 在B站搜索英飞凌多核视频学习

  • 把上述相关程序缝到一块。

5 实现过程

5.1 环境配置

我开发的这几天官网的下载安装包功能不知道为什么不好使了,而且之前做智能车使用的1.3.0版本过于老旧,甚至不支持导入例程的功能,于是在这里分享一个群友分享的1.6.0版本的安装包:

链接: https://pan.baidu.com/s/15Whw6TNMqUmTkT6B8RrFjQ?pwd=s7hm 提取码: s7hm

本文写在2022/9/28,此时该版本还是非常新的。

5.2 多核开发

多核开发的主要逻辑写在CPU0中,CPU1与CPU2只负责翻转对应的LED,且长期处在休眠模式,首先介绍CPU1与CPU2的代码,其中CPU1的代码如下:

 //初始化LED1
 configLED1();
 //进入休眠模式
 IfxCpu_setCoreMode(&MODULE_CPU1, IfxCpu_CoreMode_idle);
 ​
 while(1)
 {
     //仅翻转一次,函数里在翻转后即进入休眠模式
     toggleLED1_once();
 }

CPU2的代码如下:

 //初始化LED1
 configLED2();
 //进入休眠模式
 IfxCpu_setCoreMode(&MODULE_CPU2, IfxCpu_CoreMode_idle);
 ​
 while(1)
 {
     //仅翻转一次,函数里在翻转后即进入休眠模式
     toggleLED2_once();
 }

而CPU0使用一个定时器STM0定时200ms轮询检测按键是否被按下,如果被按下,就依次唤醒另外两个核,而后会让CPU0自己睡眠。每个定时器中断到来,CPU0都会被唤醒,所以中断处理函数中什么都不用写即可。

 //初始化定时器,定时器只负责唤醒CPU0,定时器中断函数里面什么也没写
 configSystemTimer();
 ​
 while(1)
 {
     //如果按键被按下,就依次唤醒另外两个核
     if(IfxPort_getPinState(BUTTON) == 0){
         IfxCpu_setCoreMode(&MODULE_CPU1, IfxCpu_CoreMode_run);
         waitTime(IfxStm_getTicksFromMilliseconds((&MODULE_STM0), WAIT_TIME));
         IfxCpu_setCoreMode(&MODULE_CPU2, IfxCpu_CoreMode_run);
     }
     //让CPU0自己睡眠,等待下个定时器中断唤醒之
     IfxCpu_setCoreMode(&MODULE_CPU0, IfxCpu_CoreMode_idle);
 }

 

6 遇到的主要难题及解决方法

6.1 编译不过问题

不知道为什么ADS编译不过去,此时右键左侧文件导航栏中的项目文件夹,点击Clean Project即可。

6.2 延时函数问题

遇到了一个脑残问题,我把延时函数写到了定时器里面,且延时时间超了定时器时间,以至于一运行就卡死,之后注意别犯傻了。

6.3 外设初始化位置问题

在写代码的过程中 GPIO初始化的位置很有讲究,其实在任意一个核初始化,别的核都是可以用的,但是问题是如果你唉CPU0核中初始化CPU1核用的外设,由于三个CPU是同时在跑的,如果CPU0还没有初始化结束,CPU1就已经跑到了使用GPIO的语句,就寄了,所以为了保险起见,最好哪个核用哪个外设,就把这个外设的初始化写在这个核的代码里。

7 收获与感想

其实本次项目也不是我第一次用英飞凌的板子,我是16th的智能车四轮组别,使用的是TC264,我们这一届是我们学校第一届使用英飞凌的单片机,可能学长的积累也不多吧,当时留下了一堆悬而未决的问题就被淘汰进创意了,所以当时英飞凌和多核开发给我的印象都十分不好。但其实现在看来,英飞凌还是可以的,根本原因可能还是我当时太菜了。

本次项目主要是体验了多核开发的流程,总的来说坑还是没有我想的那么多,通过研究官方的例程,得到相关的API后,很快就可以上手让指定的核睡眠与唤醒的流程。

但未来我也不知道这次学到多核开发可以用在什么地方,如果精进多核开发,我感觉还是会遇到很多的多线程抢占问题,锁问题,都是很大的问题,水很深,我把握不住。可能RTOS才是我进阶的主要方向吧,我对硬件性能的追求还没有强到要用多核开发来实现的时候。反倒这次项目让我实操了一遍单片机电源管理,也就是低功耗模式的进入与退出之类的,感觉对我今后调一些物联网相关整活中还是有点启发意义的。

估计这个板子之后要吃灰了~

8 参考资料

附件下载
tricore_demo.zip
ADS1.6.0工程,导入工作空间,Clean Project之后,编译即可。
团队介绍
我不到啊
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号