这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » GIGA_R1_WiFi开发指南【双核功能使用】

共2条 1/1 1 跳转至

GIGA_R1_WiFi开发指南【双核功能使用】

助工
2026-02-09 00:23:31     打赏


【摘要】介绍在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相机连接器等;


image-20260125205601548

image-20260125205601548.png



主要特性



  • 微控制器: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 核心默认是启动的(无法关闭);


image-20260202175317762

image-20260202175317762.png



特性


两核共享1MB RAM + 2MB Flash;


image.png











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端调用该函数来实现;



image-20260203164706004.png

image-20260203164706004



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_IDRPC.cpu_id() ;

返回结果:

CM7_CPUID:M7 核心;

CM4_CPUID:M4 核心;





三、代码编写


1、核心功能设置


Flash 设置:在IDE的【工具】选项中,在下方可以选择【1.5MB + 0.5MB】或者 【1MB + 1MB】的组合方式;



image-20260202213612660.png


核心设置:在IDE的【工具】选项中,选择上传代码的所在核心;

Main Core :M7 核心;

M4 Co-processor :M4 核心;


image-20260203160813800.png

image-20260203160813800



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、点击 上传 烧录程序到开发板上;


image.png


五、效果演示


GIGA_M7M4.gif




关键词: GIGA     R1     WiFi    

助工
2026-02-09 09:55:31     打赏
2楼

很nice的开发板


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]