【摘要】介绍在Arduino环境下,使用GIGA R1 WiFi的H7双核功能进行开发的方法;
一、硬件介绍
1、产品特点
Arduino GIGA R1 WiFi 开发板,提供76个GPIO引脚(其中12个为模拟端口、12个PWM、4个串行端口、3个I2C、2个SPI、1个FDCAN、1个SAI);
采用双核STM32H747XI微控制器(480MHz的Cortex-M7内核和240 MHz的Cortex-M4内核);
配备2MB闪存、1MB内存,以及6MB外部闪存和8MB SDRAM;
通过板载Murata 1DX模块实现WiFi和低功耗蓝牙连接;
还有输入/输出3.5mm音频插孔、JTAG连接器、20Pin的Arducam相机连接器等;


主要特性
微控制器:STMicro STM32H747XI Cortex-M7@480 MHz + M4 @ 240 MHz MCU(2MB 双组闪存、1MB RAM)
内存:8MB SDRAM
存储:16MB QSPI NOR 闪存
无线功能:2.4GHz WiFi 802.11b/g/n和蓝牙 5.1 BR/EDR/LE(Murata 1DX 模块)
接口
显示屏:20pin接口
摄像头:20pin Arducam摄像头接口
USB1x USB Type-C 端口用于编程和 HID1x USB 2.0 主机 Type-A 端口
音频:3.5 毫米音频插孔
调试:JTAG 连接器
电源:通过VIN引脚提供6 ~ 24V输入
VRT(为RTC供电)和 OFF(关闭电路板电源)引脚
复位按钮、BOOT0按钮、RGB_LED、电源LED
安全功能:Microchip ATECC608A
每个 I/O 引脚 8mA
二、功能实现
1、硬件介绍GIGA R1的主控STM32H747XI有两个核心:分别是 M4 和 M7,每个核心都可以单独编程,其中M7作为主处理器,M4作为协处理器;
M7为主处理器,必须运行才能启动M4核心(即从M7内部启动M4);
M4 核心默认是禁用的(可开启);
M7 核心默认是启动的(无法关闭);
特性
两核共享1MB RAM + 2MB Flash;
M4核功能
支持:I2C、SPI、UART、CAN、DAC、ADC、BLE;
不支持:WiFi、USB串口;
2、功能效果
双核功能效果:在M4核心(client)调用M7核(server)绑定的函数功能(加法 / 减法计算),然后通过M7进行计算以及串口打印输出的结果;
双核通信: Arduino通过RPC (Remote Procedure Call) 机制,让一个核心(M4)可以“控制”另一个核心(M7);
RPC 是一种允许程序向位于其他地方的程序发送请求的方法:它基于客户端-服务器模型(也称为调用者/被调用者)
Arduino通过RPC库(#include "RPC.h")实现:
该库允许将任一M4 / M7核设置为 server / client 从而实现它们之间的远程调用;将一个函数“绑定”到server端的名称,然后从client端调用该函数来实现;
例:M4核(client)通过RPC调用M7核(server)的add函数时 RPC.call("add", 1, 2)
运行流程:
M4 (应用层):用户发起调用;
M4 (数据层):库将 "add", 1, 2 打包成 MessagePack 二进制流;
M4 (传输层):通过 OpenAMP/RPMsg 协议,将二进制流写入共享内存;
M4 (物理层):触发 HSEM 中断(按门铃);
M7 (物理层):收到中断,醒来;
M7 (传输层):从共享内存读取数据;
M7 (数据层):解析 MessagePack,还原出 "add", 1, 2;
M7 (应用层):查找 "add" 对应的函数,执行 1+2,得到 3;
M7 (回传):将结果 3 打包 -> 写入内存 -> 触发中断通知 M4;
M4 (接收):收到结果 3,函数返回;
RPC库主要相关函数功能
RPC.begin():初始化库;
server端:RPC.bind("this_function", thisfunction) 将 声明的函数名称(this_function) 绑定到 调用函数(thisfunction),然后从client端调用该函数;
client端:RPC.call("this_function", int args) 用于调用 声明的函数名称(this_function) 并传递可选参数 args 的函数,最后返回结果;
串口打印功能:仅在M7核心上可用,M4核心需使用 RPC.println(val) 用于向M7发送数据,再将数据打印到串口;
查询当前CPU_ID:RPC.cpu_id() ;
返回结果:
CM7_CPUID:M7 核心;
CM4_CPUID:M4 核心;
三、代码编写
1、核心功能设置
Flash 设置:在IDE的【工具】选项中,在下方可以选择【1.5MB + 0.5MB】或者 【1MB + 1MB】的组合方式;
核心设置:在IDE的【工具】选项中,选择上传代码的所在核心;
Main Core :M7 核心;
M4 Co-processor :M4 核心;
2、主要相关代码
四、程序烧录分别将代码上传至M4 / M7核(Target core选择);
每次LED闪烁时,进行一次加减法计算;
#include "Arduino.h" #include "RPC.h" #include "SerialRPC.h" // 判断当前CPU_ID String currentCPU() { if (RPC.cpu_id() == CM7_CPUID) { return "M7"; } else { return "M4"; } } // 加法 (运行在 M7) int addOnM7(int a, int b) { Serial.println(currentCPU() + ": 执行加法计算 "); return a + b; } // 减法 (运行在 M7) int subtractOnM7(int a, int b) { Serial.println(currentCPU() + ": 执行减法计算 "); return a - b; } void setup() { Serial.begin(115200); pinMode(LEDB, OUTPUT); // 初始化 RPC (启动 M4) if (!SerialRPC.begin()) { Serial.println("RPC 初始化失败"); } // M7 服务端: 注册函数供 M4 调用 if (currentCPU() == "M7") { RPC.bind("remoteAdd", addOnM7); RPC.bind("remoteSubtract", subtractOnM7); } } void loop() { // M4 调用 if (currentCPU() == "M4") { // 闪烁 LED digitalWrite(LEDB, LOW); delay(500); digitalWrite(LEDB, HIGH); delay(500); // 调用加法函数 int a1 = random(100); int b1 = random(100); SerialRPC.println(currentCPU() + ": 计算: " + String(a1) + "+" + String(b1)); auto res1 = RPC.call("remoteAdd", a1, b1).as<int>(); SerialRPC.println(currentCPU() + ": 结果 = " + String(res1)); // 调用减法函数 int a2 = random(100); int b2 = random(100); SerialRPC.println(currentCPU() + ": 计算: " + String(a2) + "-" + String(b2)); auto res2 = RPC.call("remoteSubtract", a2, b2).as<int>(); SerialRPC.println(currentCPU() + ": 结果 = " + String(res2)); SerialRPC.println(" "); } // M7 串口打印 if (currentCPU() == "M7") { String buffer = ""; while (SerialRPC.available()) { buffer += (char)SerialRPC.read(); } if (buffer.length() > 0) { Serial.print(buffer); } } }
1、连接USB数据线至开发板;
2、选择端口号对应的开发板;
3、点击 上传 烧录程序到开发板上;
五、效果演示







我要赚赏金
