PSoC™ E84 Edgi-Talk 开发板搭载了三核架构:Secure M33(安全核)、M33(非安全核)、M55(应用处理器)。其中 Secure M33 负责系统安全引导,而 M33(NS)和 M55 两个内核可以独立运行各自的 RT-Thread 固件,分别控制不同的 LED,实现真正的双核并行。
本篇文章将介绍如何配置并烧录两个独立的示例工程(Edgi_Talk_M33_Blink_LED与Edgi_Talk_M55_Blink_LED),让蓝灯和绿灯分别由 M33 和 M55 控制,同时闪烁。
一、双核架构与启动顺序
开发板的启动遵循严格的顺序:
+------------------+ | Secure M33 | | (安全内核引导) | +------------------+ | v +------------------+ | M33 | | (非安全核启动) | +------------------+ | v +------------------+ | M55 | | (应用处理器启动) | +------------------+关键点:
- M33(NS)必须先启动,因为它负责初始化时钟、外设以及使能 M55 内核
- M55 不能独立启动,它的复位释放由 M33 控制
- 烧录顺序必须遵守:先烧录 M33 工程,再烧录 M55 工程
二、LED 硬件资源
在 多LED控制 中已确认,三颗用户 LED 的引脚定义为:
| LED | 引脚 | 颜色 | 控制核 |
|---|---|---|---|
| LED1 | P16_7 | 红 | — |
| LED2 | P16_6 | 绿 | M55 |
| LED3 | P16_5 | 蓝 | M33 |
两个示例工程分工明确:
- M33 工程:控制蓝色 LED3(P16_5)
- M55 工程:控制绿色 LED2(P16_6)
三、M33 工程:使能 M55 内核
1. 新建 M33 工程
参考 开发环境搭建 的步骤,在 RT-Thread Studio 中新建一个基于Edgi_Talk_M33_Blink_LED示例的工程。
2. 开启 CM55 支持
这是双核运行的核心配置。在 M33 工程中,需要打开 RT-Thread 设置,启用 M55 内核的启动支持:
右键 M33 工程 →RT-Thread Settings
在左侧导航树中,依次展开:硬件 → select SOC Multi Core Mode
勾选Enable CM55 Core:
注意:该配置决定了 M33 启动时是否释放 M55 的复位信号。如果未勾选,即使 M55 固件已烧录,M55 内核也不会启动。
- 保存配置(
Ctrl+S),系统会自动重新生成代码。
3. M33 主程序(LED 部分)
M33 示例工程的main.c中,LED 相关代码如下:
#include <rtthread.h> #include <rtdevice.h> #include <board.h> #define LED_PIN_B GET_PIN(16, 5) /* 蓝色 LED3,由 M33 控制 */ int main(void) { rt_kprintf("Hello RT-Thread\r\n"); rt_kprintf("This core is cortex-m33\r\n"); /* 将 LED 引脚设置为输出模式 */ rt_pin_mode(LED_PIN_B, PIN_MODE_OUTPUT); while (1) { rt_pin_write(LED_PIN_B, PIN_LOW); /* 点亮蓝灯 */ rt_thread_mdelay(1000); rt_pin_write(LED_PIN_B, PIN_HIGH); /* 熄灭蓝灯 */ rt_thread_mdelay(1000); } return 0; }代码要点:
GET_PIN(16, 5)映射到蓝色 LED3rt_pin_mode()配置为输出模式- 主循环以 1Hz 频率(周期 2s)闪烁蓝灯
4. 编译并烧录 M33
点击工具栏的编译按钮编译工程,编译成功后点击下载按钮将固件烧录到开发板。
四、M55 工程:独立运行 LED 闪烁
1. 新建 M55 工程
在 RT-Thread Studio 中,再次新建一个 RT-Thread 项目,配置如下:
| 配置项 | 设置值 |
|---|---|
| 项目类型 | 基于开发板 |
| 开发板 | PSOC_E84-EDGI-TALK |
| BSP 版本 | 1.2.1 |
| 类型 | 示例工程 |
| 示例 | Edgi_Talk_M55_Blink_LED |
| RT-Thread 版本 | 5.0.2 |
| 调试器 | KitProg3 |
| 接口 | SWD |
注意:M55 工程不需要额外开启 CM55 配置,因为 M55 内核的使能开关在 M33 工程中。
新建完成后,项目资源管理器中应同时存在两个工程:
2. M55 主程序(LED 部分)
M55 示例工程的main.c中,LED 相关代码如下:
#include <rtthread.h> #include <rtdevice.h> #include <board.h> #define LED_PIN_G GET_PIN(16, 6) /* 绿色 LED2,由 M55 控制 */ int main(void) { rt_kprintf("Hello RT-Thread\r\n"); rt_kprintf("It's cortex-m55\r\n"); /* 将 LED 引脚设置为输出模式 */ rt_pin_mode(LED_PIN_G, PIN_MODE_OUTPUT); while (1) { rt_pin_write(LED_PIN_G, PIN_LOW); /* 点亮绿灯 */ rt_thread_mdelay(1000); rt_pin_write(LED_PIN_G, PIN_HIGH); /* 熄灭绿灯 */ rt_thread_mdelay(1000); } return 0; }代码要点:
GET_PIN(16, 6)映射到绿色 LED2- 控制逻辑与 M33 完全一致,只是控制的 LED 颜色不同
- 两个核各自运行自己的
main()函数,互不干扰
3. 编译并烧录 M55
编译 M55 工程,编译成功后再次点击下载按钮烧录。
⚠️烧录顺序至关重要:必须先烧录 M33(使能 CM55 的那一份),再烧录 M55。如果顺序颠倒,M55 内核可能无法被正确释放复位,导致绿灯不亮。
五、运行效果
两个工程都烧录完成后,开发板重新上电或按 RST 复位,观察 LED:
| 现象 | 说明 |
|---|---|
| LED3(蓝色)以 1Hz 闪烁 | M33 内核运行正常 |
| LED2(绿色)以 1Hz 闪烁 | M55 内核运行正常 |
| 两颗 LED 同时交替亮灭 | 两个核独立运行,互不影响 |
如果只看到蓝灯闪烁而绿灯不亮,请检查:
- M33 工程中是否勾选了Enable CM55 Core
- 烧录顺序是否为 M33 → M55
- M33 工程是否已正确烧录(可单独烧录 M33 Blink_LED 验证)
六、双核独立运行的本质
从代码层面看,M33 和 M55 的工程结构几乎完全相同:
| 对比项 | M33 工程 | M55 工程 |
|---|---|---|
| 示例模板 | Edgi_Talk_M33_Blink_LED | Edgi_Talk_M55_Blink_LED |
| 控制 LED | LED3(蓝,P16_5) | LED2(绿,P16_6) |
| 打印信息 | This core is cortex-m33 | It's cortex-m55 |
| 启动职责 | 使能 M55 内核 | 无(等待 M33 释放复位) |
两个核拥有独立的程序空间、独立的栈、独立的中断向量表,可以独立运行,也可以通过共享内存区域进行潜在的核间通信。
在本篇文章中,它们只是最简单的独立运行,各自闪烁自己的 LED,验证双核硬件和软件环境均正常。
七、总结
通过本篇文章,完成了以下目标:
- 理解了三核启动顺序:Secure M33 → M33(NS)→ M55
- 掌握了 M55 使能配置:在 M33 工程的 RT-Thread Settings 中勾选 Enable CM55 Core
- 创建了两个独立工程:分别控制蓝灯和绿灯
- 明确了烧录顺序:必须先 M33、后 M55。
---------------------
作者:HonestQiao
链接:https://bbs.21ic.com/icview-3515209-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。