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
实物图如下:
布局
硬件框图如下:
本项目使用了全彩LCD、按键与姿态传感器模块,并使用spi扩展接口控制LED灯板
3 功能展示
本项目实现的功能非常简单,就是点击按键,一个LED翻转,另一个LED等一秒钟之后翻转。
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 参考资料
-
英飞凌官方的关于多核电源管理的教程: 第9讲下-电源和电源管理系统哔哩哔哩bilibili
-
一位b站老哥本次项目的分享: 英飞凌车规级三核MCU开发板KIT_AURIX_TC275_LITE上手测试(多核休眠互调)哔哩哔哩bilibili
- 子蕤giegie的视频: TC275实现呼吸灯【Funpack2-2】【硬禾学堂暑假练】哔哩哔哩bilibili