内容介绍
内容介绍
开发板介绍:
AURIX TC275 lite 套件配备了基于 32 位单芯片 AURIX TM TriCore TM的微控制器 Aurix TC275, 其中包含了非常多的外设, 如:
- 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)
1. 本板卡最终实现了什么功能
这次我选择了任务1, 设计可以控制TC275多个核心休眠,和唤醒的程序,实现下面的功能:
第一步:开机的时候只有第1个CPU启动, 同时反转LED1等待按钮按下,如果有按钮按下,就启动第2个CPU
第二步:第2个CPU启动的时候,就使用第2个CPU让第1个CPU休眠,同时翻转LED2, 并且等待按钮按下.如果按钮按下,就启动
第三步:第3个CPU启动的时候,就使用第3个CPU让第2个CPU休眠,同时反转2个LED, 并且启动1秒后,整个系统进入休眠模式,所有CPU停止活动.
2. 各功能对应的主要代码片段及说明
1. 设置全局变量,比如各个GPIO口的设置,延迟的时间,闪烁的时间等参数
#define ISR_PRIORITY_2 2
/* Defines CPU that triggers the interrupt */
#define ISR_PROVIDER_CPU0 0
/* Defines CPU that triggers the interrupt */
#define ISR_PROVIDER_CPU2 2
/* Rate 0.5 Hz */
#define RATE_0_5_HZ 0.25
/* Rate 1 Hz */
#define RATE_1_HZ 0.5
/* LED */
#define LED1 &MODULE_P00,5
#define LED2 &MODULE_P00,6
#define BUTTON &MODULE_P00,7 /* Port pin for the button */
#define ALLOW_SLEEP_MODE 0x0 /* Allow sleep mode for GTM */
#define BLOCK_SLEEP_MODE 0x1 /* Block sleep mode for STM */
#define PMSWCR1_CPUSEL 0x1 /* Set the CPU0 as CPU master */
#define PMCSR0_REQSLP 0x2 /* Request sleep mode
2. 初始化, 如GPIO, 定时器等外设的初始化
IfxPort_togglePin(LED1); /* Toggle Port Pin 00.5
/* Set Port Pin 00.5 to output mode and turn off the LED (LED is low-level active) */
IfxPort_setPinModeOutput(LED2, IfxPort_OutputMode_pushPull, IfxPort_OutputIdx_general);
IfxPort_setPinHigh(LED2);
IfxPort_setPinMode(BUTTON, IfxPort_Mode_inputPullUp);
3. 设置各个CPU的状态, 设置他们为休眠模式或者运行模式, 在各个main方法中调用就可以对特定CPU进行设置
void set_c1_c2_idle(void)
{
/*
* 设置cpu1, cpu2为idle.
*/
IfxCpu_enableInterrupts();
IfxCpu_setCoreMode(&MODULE_CPU1, IfxCpu_CoreMode_idle);
IfxCpu_setCoreMode(&MODULE_CPU2, IfxCpu_CoreMode_idle);
}
void set_c0_idle(void)
{
/*
* 设置cpu0为idle.
*/
IfxCpu_enableInterrupts();
IfxCpu_setCoreMode(&MODULE_CPU0, IfxCpu_CoreMode_idle);
}
void set_c0_run(void)
{
/*
* 设置cpu0为run.
*/
IfxCpu_enableInterrupts();
IfxCpu_setCoreMode(&MODULE_CPU0, IfxCpu_CoreMode_run);
}
void set_c1_idle(void)
{
/*
* 设置cpu1为idle.
*/
IfxCpu_enableInterrupts();
IfxCpu_setCoreMode(&MODULE_CPU1, IfxCpu_CoreMode_idle);
}
void set_c1_run(void)
{
/*
* 设置cpu1为run.
*/
IfxCpu_enableInterrupts();
IfxCpu_setCoreMode(&MODULE_CPU1, IfxCpu_CoreMode_run);
set_c0_idle();
}
void set_c2_idle(void)
{
/*
* 设置cpu2为idle.
*/
IfxCpu_enableInterrupts();
IfxCpu_setCoreMode(&MODULE_CPU2, IfxCpu_CoreMode_idle);
}
void set_c2_run(void)
{
/*
* 设置cpu1为run.
*/
IfxCpu_enableInterrupts();
IfxCpu_setCoreMode(&MODULE_CPU2, IfxCpu_CoreMode_run);
set_c1_idle();
}
3. 实现功能的演示及说明
第一:上电的时候只有第1个CPU启动, 这个时候会翻转LED1, 直到我们按下按钮
第二:当我们按下按键的时候, 第2个CPU启动,可以看到LED2进行翻转, 直到我们再次按下按钮
第三:在我们再次按下按钮的时候, 第3个CPU启动, 2个LED同时翻转, 并且启动1秒后,整个系统进入休眠模式,所有LED停止翻转
4. 对本活动的心得体会
- 了解了多核更多情况下的用途: 这块开发板集成度很高, 上手几乎没有难度, 英飞凌的开发环境也大大降低了入门的门槛, 对多核的编程也变得很容易. 是一个给身边的人介绍英飞凌, 了解多核编程的一个非常好的契机.
- 善加利用说明文档:开发过程中遇到了结果问题, 比如调试模式使用不了, 如何调用GPIO等功能, 通过官方的文档都能得到解决. 就像这次的启动和休眠核心的部分, 我之前并没有多核编程的经验, 只有开发Arduino和STC单片机的经验. 但是这次接触到了英飞凌的开发, 使用官方的开发文档还有官方的开发历程, 非常快速地上手了这款单片机
- 最后, 非常感谢电子森林以及群里面的提供我帮助的朋友们
附件下载
Project_of_Main.zip
项目工程
团队介绍
zhuting
评论
0 / 100
查看更多
猜你喜欢
Funpack2-2用TC275实验三个核心轮流休眠待机使用TC275的三个核心,轮流休眠待机,分别控制板卡上的LED灯,如core0检测按键按下,唤醒core1翻转LED1,一秒后,唤醒core2翻转LED2,系统休眠
MMA
941
Funpack2-2 基于TC275实现多核心轮流休眠待机基于TC275,实现多核心轮流休眠待机,控制板卡上的LED灯。
安先生
1181
Funpack2-2 TC275休眠功能任务1:使用TC275的三个核心,轮流休眠待机,分别控制板卡上的LED灯,如core0检测按键按下,唤醒core1翻转LED1,一秒后,唤醒core2翻转LED2,系统休眠
weiguoqian
857