1. 从Arduino MEGA到FortyTwo Systems MEGA一次硬件平台的“升维”思考如果你玩过Arduino那么“MEGA”这个名字对你来说一定不陌生。Arduino MEGA 2560那块经典的8位AVR单片机开发板凭借其丰富的I/O口和庞大的社区生态成为了无数创客、学生和原型开发者的入门首选。但今天我们要聊的是另一个“MEGA”——FortyTwo Systems MEGA。这并非简单的重名而是一次从8位世界向32位ARM Cortex-M0内核的彻底跨越其核心目标直指一个在嵌入式领域至关重要但在传统Arduino生态中相对薄弱的环节工业级可靠性与实时通信能力尤其是对CAN总线的原生支持。FortyTwo Systems MEGA的核心是一颗来自Microchip的SAMC21N微控制器。选择这颗芯片本身就透露了设计者的意图。SAMC21系列是基于ARM Cortex-M0内核的32位MCU它在保持低功耗的同时提供了远超8位AVR处理器的性能最高48MHz主频和内存256KB Flash32KB RAM。更重要的是SAMC21N内置了CAN FDController Area Network Flexible Data-rate控制器。CAN总线是什么简单来说它是汽车、工业自动化、医疗器械等领域广泛使用的、高可靠性的多主机串行通信协议。它抗干扰能力强能实现复杂的网络通信是连接电机控制器、传感器、仪表盘等节点的“神经系统”。传统的Arduino MEGA要实现CAN通信必须依赖外置的MCP2515等芯片模块通过SPI接口模拟不仅增加了硬件复杂度和成本其性能和可靠性也无法与原生CAN控制器相提并论。因此FortyTwo Systems MEGA的出现可以看作是为那些希望用Arduino的简易开发方式兼容Arduino IDE和库去触碰真正工业应用场景的开发者搭建了一座桥梁。它保留了类似Arduino MEGA的引脚布局和开发体验但内核已经脱胎换骨具备了处理更复杂任务、进行可靠工业通信的硬实力。这不仅仅是性能的提升更是应用场景的拓展——从桌面上的互动艺术装置走向车间里的电机控制节点、实验室的数据采集单元甚至是小型移动机器人底盘的核心控制器。2. SAMC21N微控制器藏在MEGA板卡下的“工业心脏”要理解FortyTwo Systems MEGA的能力边界我们必须深入其核心——SAMC21N18A这颗芯片。它属于Microchip的SAM C21系列基于ARM Cortex-M0内核。别小看这个“M0”它虽然属于ARM Cortex-M家族中的入门级产品但其设计哲学是“在极致的能效比下提供足够的性能”。对于大量需要实时响应、长时间电池供电的嵌入式设备如传感器节点、执行器来说M0内核是绝佳的选择。与Arduino MEGA采用的ATmega25608位AVR16MHz相比SAMC21N的性能是碾压级的架构与主频32位ARM Cortex-M0 48 MHz vs 8位 AVR 16 MHz。这意味着在数据处理能力、中断响应速度上都有质的飞跃。内存256KB Flash 32KB SRAM vs 256KB Flash 8KB SRAM。更大的RAM使得程序可以处理更复杂的数据结构、更大的缓冲区这对于CAN报文缓存、通信协议栈运行至关重要。外设这是关键差异点。SAMC21N原生集成了CAN FD控制器支持最高8Mbps的数据速率CAN FD模式远超经典CAN的1Mbps。它还拥有多个SERCOM串行通信接口这些接口可以通过软件灵活配置为UART、I2C、SPI中的任何一种提供了极高的引脚复用灵活性。此外高级定时器TC/TCC、模拟外设ADC、DAC也一应俱全。为什么原生CAN如此重要可靠性原生CAN控制器直接处理CAN协议的核心层数据链路层包括报文滤波、错误检测与处理、自动重发等机制都是由硬件完成的实时性和确定性极高。而通过SPI扩展的CAN模块如MCP2515所有CAN协议处理都由MCU通过软件驱动SPI接口来完成增加了软件开销和中断延迟在总线负载高或错误频发的恶劣环境下稳定性不如原生方案。性能CAN FD支持更大的数据场最多64字节经典CAN为8字节和更高的速率这对于传输更多传感器数据或配置参数非常有用。SAMC21N的原生控制器可以充分发挥CAN FD的性能。简化设计省去了外部CAN控制器和收发器如TJA1050之间的连接电路系统集成度更高潜在故障点更少。因此选择SAMC21N意味着FortyTwo Systems MEGA在诞生之初就瞄准了需要可靠串行网络通信的应用这是它与经典Arduino MEGA在基因层面的不同。3. 硬件设计解析为工业通信铺平道路一块开发板的好坏不仅在于主控芯片更在于围绕芯片的周边电路设计。FortyTwo Systems MEGA的硬件设计清晰地体现了其“工业通信桥梁”的定位。首先看电源设计。工业环境电源噪声大、波动可能剧烈。好的开发板必须具备宽电压输入范围和稳定的电源树。MEGA板卡通常支持通过直流电源插座或USB供电并可能包含必要的线性稳压器LDO或开关稳压器为MCU内核、I/O以及外围器件提供干净、稳定的电压。对于需要连接外部CAN总线的情况板载的CAN收发器例如TJA1051T/3是关键。这个芯片负责将MCU的CAN控制器产生的逻辑电平信号转换为符合ISO 11898标准的差分信号CAN_H和CAN_L在总线上传输。收发器通常需要独立的电源隔离或保护电路以防止总线上的浪涌电压损坏核心MCU这在工业设计中是基本考量。其次是引脚布局与兼容性。为了降低用户的学习和迁移成本FortyTwo Systems MEGA很可能采用了与Arduino MEGA 2560兼容的引脚排列。这意味着大量的Arduino MEGA Shield扩展板在物理上可以插接。但是这里有一个至关重要的“但是”电气兼容性不等于功能兼容性。SAMC21N的引脚功能如哪个引脚对应哪个SERCOM、哪个定时器与ATmega2560完全不同。因此直接使用为Arduino MEGA编写的、涉及底层引脚操作的代码例如直接寄存器操作PORTx、DDRx是绝对无法工作的。只有那些通过Arduino抽象层如digitalWriteanalogRead且不依赖特定硬件外设如特定硬件串口、PWM引脚的代码才有可能在重新编译后运行。这也是从8位AVR迁移到32位ARM必须面对的挑战。最后是通信接口的强化。除了核心的CAN FD接口通过一个标准的DB9或端子排引出板载的USB接口很可能不仅仅用于供电和编程还可能通过MCU内置的USB设备控制器实现USB-CDC虚拟串口方便调试。额外的UART、I2C、SPI接口也通过排针引出方便连接屏幕、传感器等模块。这些设计都使得这块板卡能够作为一个功能丰富的通信网关或主控节点。注意硬件兼容性的陷阱。当你把一块旧的Arduino MEGA传感器扩展板插到FortyTwo Systems MEGA上时首先要检查的不是程序而是电源和信号电压。确保两者都是3.3V逻辑电平SAMC21N通常是3.3V而旧的Arduino MEGA是5V。直接连接5V输出到3.3V输入引脚可能会损坏SAMC21N。务必使用电平转换器或确认扩展板支持3.3V操作。4. 软件生态与开发环境搭建硬件是骨架软件是灵魂。FortyTwo Systems MEGA最大的优势之一是它试图融入庞大的Arduino生态系统。这意味着你可以使用熟悉的Arduino IDE进行开发极大地降低了32位ARM和CAN总线开发的门槛。核心是板卡支持包Board Support Package, BSP。为了让Arduino IDE识别并支持这块特定的板卡需要安装对应的BSP。对于基于SAMC21的板卡通常可以通过Arduino IDE的“开发板管理器”来安装。例如可能需要添加一个由FortyTwo Systems或社区维护的板卡管理器URL然后搜索安装“FortyTwo Systems MEGA”或“SAMC21”相关的支持包。安装成功后你就能在“工具”-“开发板”菜单下找到它并像选择“Arduino MEGA 2560”一样选择它。开发流程的细微差别编程器/调试器与通过USB转串口芯片如ATmega16U2进行编程的经典Arduino不同ARM Cortex-M芯片通常采用SWDSerial Wire Debug接口进行编程和调试。FortyTwo Systems MEGA板上很可能集成了一块EDBGEmbedded Debugger芯片这也是许多基于Atmel/Microchip ARM的板卡常见设计它通过USB提供SWD接口和虚拟串口。在Arduino IDE中你需要选择正确的“编程器”例如“Atmel EDBG”或“CMSIS-DAP”。库的兼容性通用的、纯算法或不依赖特定硬件的Arduino库如Servo库的软件模拟模式、PID库通常可以直接使用。但涉及硬件的库如Wire用于I2CSPI用于SPISoftwareSerial需要其底层实现支持SAMC21架构。幸运的是Arduino Core for SAMD/SAMC这是SAMC21的基础核心通常已经提供了这些硬件抽象层的实现。关键在于你要使用为“SAMD21/SAMC21”或“32-bit ARM”编译的库版本。CAN总线库这是开发的核心。你需要一个能让Arduino环境调用SAMC21N内部CAN控制器的库。这个库可能由板卡供应商提供也可能来自社区例如ACAN或mcp_can的替代原生版本。这个库会提供初始化CAN控制器设置波特率、滤波器、发送和接收CAN报文的基本API。它的易用性和稳定性直接决定了你使用CAN总线的体验。一个简单的开发环境验证步骤安装Arduino IDE1.8.x或2.0。在“文件”-“首选项”的“附加开发板管理器网址”中添加对应的BSP仓库地址。打开“工具”-“开发板”-“开发板管理器”搜索并安装“FortyTwo Systems MEGA”或“SAM C21”支持包。安装完成后在“工具”-“开发板”列表中选择“FortyTwo Systems MEGA”。在“工具”菜单下正确选择端口通常是识别出的虚拟串口和编程器如“Atmel EDBG”。尝试打开一个最简单的Blink示例修改LED对应的引脚号需要查看板卡原理图确认板载LED连接的是哪个GPIO例如PIN_PA17然后点击上传。如果LED开始闪烁恭喜你基础开发环境已经打通。5. CAN总线通信实战从配置到收发当你的开发环境就绪后真正的重头戏——CAN总线通信就可以开始了。我们假设你已经有了一个可用的CAN库这里我们以概念和通用步骤为主导讲解在FortyTwo Systems MEGA上实现CAN通信的全过程。5.1 CAN控制器初始化设定总线的“交通规则”在发送或接收任何报文之前必须对SAMC21N内部的CAN控制器进行初始化配置。这主要包括两个部分位时序配置和滤波器配置。位时序配置决定了通信的速率和鲁棒性。你需要根据你的CAN网络情况设置正确的波特率例如500kbps或1Mbps。对于CAN FD还需要设置数据阶段的速率例如2Mbps或5Mbps。配置波特率本质上是配置MCU时钟分频和位时间段内各段的长度同步段、传播段、相位缓冲段1/2。通常库函数会提供一个简单的接口例如CAN.begin(500000)来设置500kbps的经典CAN速率。对于更精细的调整你可能需要传入一个包含更多时序参数的结构体。// 伪代码示例具体API取决于你使用的库 #include ACAN_SAMC21.h void setup() { // 初始化CAN控制器设置波特率为500kbps ACANSAMC21Settings settings (500 * 1000); // 500 kHz // 可以进一步设置其他参数如采样点 // settings.mBitRatePrescaler ...; // settings.mPropagationSegment ...; // settings.mPhaseSegment1 ...; // settings.mPhaseSegment2 ...; const uint32_t errorCode ACANSAMC21::can.begin (settings); if (errorCode ! 0) { Serial.print (CAN初始化失败错误码: 0x); Serial.println (errorCode, HEX); while (1); // 停止执行 } Serial.println(CAN控制器初始化成功); }滤波器配置是CAN的精髓之一。CAN控制器可以配置多个接收过滤器用来决定哪些报文可以被接收并存入接收FIFO哪些直接被忽略。这在多节点的复杂网络中非常有用可以大幅减轻MCU处理中断的负担。过滤器可以基于CAN报文的标识符ID进行设置支持范围过滤和精确匹配。例如你只关心ID为0x100到0x1FF的报文就可以设置一个对应的掩码过滤器。5.2 CAN报文发送将数据送上“高速公路”初始化完成后发送报文就相对直接了。你需要构建一个CAN报文对象填充其关键字段然后调用发送函数。一个标准的CAN 2.0B数据帧包含标识符ID11位标准帧或29位扩展帧代表报文的优先级和内容含义。ID值越小优先级越高。远程传输请求RTR区分数据帧0和远程帧1。远程帧用于请求另一个节点发送特定ID的数据。数据长度码DLC0-8表示后面数据场的字节数。数据场实际要传输的数据最多8字节。void loop() { CANMessage message; // 假设库定义了CANMessage结构体 message.id 0x123; // 标准帧ID message.ext false; // 标准帧 message.rtr false; // 数据帧 message.len 4; // 发送4字节数据 message.data[0] 0xDE; message.data[1] 0xAD; message.data[2] 0xBE; message.data[3] 0xEF; // 尝试发送报文 if (ACANSAMC21::can.tryToSend(message)) { Serial.println(CAN报文发送成功); } else { Serial.println(发送缓冲区满发送失败); // 在实际应用中这里可能需要重试策略或等待 } delay(1000); // 每秒发送一次 }实操心得发送超时与缓冲区管理。tryToSend这类非阻塞函数在发送缓冲区满时会立即返回失败。在实时性要求高的系统中简单的delay重试不可取。更好的做法是结合一个状态机或使用阻塞式的send函数如果库提供并设置合理超时。同时要监控CAN控制器的错误计数器和发送错误状态这对于诊断总线问题如断线、短路至关重要。5.3 CAN报文接收监听网络上的“对话”接收报文通常有两种方式轮询和中断。对于简单的应用轮询足够但对于需要及时响应CAN报文的系统必须使用中断模式。中断接收模式是更可靠和高效的方式。你需要先定义一个接收回调函数并在初始化时注册它。当CAN控制器收到符合过滤条件的报文并存入硬件FIFO后会触发中断MCU自动调用你的回调函数来处理报文。// 全局接收缓冲区或队列用于在中断服务程序(ISR)和主循环间传递数据 volatile bool newMessageReceived false; CANMessage receivedMessage; // 中断服务程序ISR - 必须简短快速 void onCanInterrupt() { if (ACANSAMC21::can.receive(receivedMessage)) { // 从硬件FIFO读取报文 newMessageReceived true; // 注意在ISR内不要做复杂操作如Serial.print尽快设置标志位退出。 } } void setup() { // ... 初始化CAN同上... // 附加中断处理函数到CAN接收中断 ACANSAMC21::can.attachInterrupt(onCanInterrupt); } void loop() { if (newMessageReceived) { newMessageReceived false; // 清除标志 // 在主循环中安全地处理接收到的报文 Serial.print(收到CAN报文ID: 0x); Serial.println(receivedMessage.id, HEX); Serial.print(数据: ); for (int i 0; i receivedMessage.len; i) { Serial.print(receivedMessage.data[i], HEX); Serial.print( ); } Serial.println(); // 这里可以根据ID进行业务逻辑处理 processCanMessage(receivedMessage); } // 主循环的其他任务... }轮询接收模式则是在主循环中不断检查是否有可用的报文。void loop() { CANMessage message; if (ACANSAMC21::can.receive(message)) { // 非阻塞接收 // 处理报文 Serial.println(轮询收到报文); } // 执行其他任务 delay(10); }重要警告中断服务程序ISR的禁忌。在onCanInterrupt这样的ISR中必须保持代码极其简短。绝对避免调用可能阻塞或依赖中断的函数如Serial.print()、delay()、malloc()等。ISR的核心任务就是快速读取硬件状态如读取CAN接收FIFO然后将数据拷贝到全局缓冲区或设置一个标志位随即退出。所有耗时的处理如解析数据、控制输出都应交由主循环中的loop()函数根据标志位来执行。违反这一原则会导致系统不稳定甚至看门狗复位。5.4 CAN FD进阶更大的数据吞吐量如果你的FortyTwo Systems MEGA和CAN库支持CAN FD那么你将能享受到更大的数据载荷最多64字节和更高的数据段速率。初始化时需要额外配置FD模式和数据段波特率。发送和接收的API与经典CAN类似但报文结构体需要支持更长的数据场。// 伪代码初始化CAN FD ACANSAMC21FDSettings fdSettings; fdSettings.mNominalBitRate 500 * 1000; // 仲裁段波特率 500kbps fdSettings.mDataBitRate 2000 * 1000; // 数据段波特率 2Mbps fdSettings.mFDMode true; // 启用FD模式 ACANSAMC21::can.begin(fdSettings); // 发送CAN FD报文 CANFDMessage fdMsg; fdMsg.id 0x456; fdMsg.ext true; fdMsg.fd true; // 标记为FD帧 fdMsg.brs true; // 启用比特率切换数据段使用更高波特率 fdMsg.len 16; // 发送16字节数据 // ... 填充fdMsg.data ...使用CAN FD时需要确保总线上的所有节点都支持FD模式并且配置了兼容的波特率参数否则通信会失败。6. 项目实战构建一个简单的CAN总线温度监测节点理论说得再多不如动手做一个项目。让我们设想一个简单的应用场景用FortyTwo Systems MEGA制作一个CAN总线温度监测节点。它周期性地读取一个数字温度传感器如DS18B20的数据并将数据打包成CAN报文发送到总线上。同时它也可以监听总线上的控制命令如修改采样频率。6.1 硬件连接FortyTwo Systems MEGA主控制器。DS18B20温度传感器单总线数字温度传感器。将其VCC接3.3VGND接GND数据线接一个GPIO引脚例如引脚8并接一个4.7kΩ上拉电阻到3.3V。CAN总线网络将板载CAN收发器的CAN_H和CAN_L通过双绞线连接到CAN总线上。总线两端需要连接120欧姆的终端电阻这是消除信号反射、保证通信稳定的必需条件。电源通过USB或外部电源如12V为开发板供电。6.2 软件实现我们需要用到两个库一个用于CAN通信假设为ACAN_SAMC21一个用于DS18B20如DallasTemperature和OneWire。#include ACAN_SAMC21.h #include OneWire.h #include DallasTemperature.h // 温度传感器引脚和对象 #define ONE_WIRE_BUS 8 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(oneWire); // CAN相关 volatile bool newCmdReceived false; CANMessage rxMessage; unsigned long sendInterval 5000; // 默认5秒发送一次 unsigned long lastSendTime 0; // CAN接收中断处理函数 void onCanInterrupt() { if (ACANSAMC21::can.receive(rxMessage)) { if (rxMessage.id 0x201) { // 假设控制命令的ID是0x201 newCmdReceived true; } } } void setup() { Serial.begin(115200); while (!Serial); // 等待串口就绪仅用于调试 // 1. 初始化温度传感器 sensors.begin(); // 2. 初始化CAN控制器500kbps ACANSAMC21Settings settings(500 * 1000); if (ACANSAMC21::can.begin(settings) ! 0) { Serial.println(CAN初始化失败); while(1); } ACANSAMC21::can.attachInterrupt(onCanInterrupt); Serial.println(CAN温度节点启动成功); } void loop() { unsigned long currentTime millis(); // 处理接收到的CAN控制命令 if (newCmdReceived) { newCmdReceived false; // 假设命令第一个字节为0x01表示设置间隔第二个字节为间隔秒数1-255 if (rxMessage.len 2 rxMessage.data[0] 0x01) { sendInterval rxMessage.data[1] * 1000UL; // 转换为毫秒 Serial.print(更新发送间隔为: ); Serial.print(rxMessage.data[1]); Serial.println( 秒); } } // 定时发送温度数据 if (currentTime - lastSendTime sendInterval) { lastSendTime currentTime; // 读取温度 sensors.requestTemperatures(); float tempC sensors.getTempCByIndex(0); // 构建CAN报文 (ID: 0x200 标准数据帧) CANMessage txMessage; txMessage.id 0x200; txMessage.ext false; txMessage.rtr false; txMessage.len 4; // 发送4字节浮点数 // 将浮点数转换为字节数组简单处理实际应用可能需要更规范的编码如ISO-TP uint8_t *tempBytes (uint8_t*)tempC; for (int i 0; i 4; i) { txMessage.data[i] tempBytes[i]; } // 发送报文 if (ACANSAMC21::can.tryToSend(txMessage)) { Serial.print(温度发送成功: ); Serial.print(tempC); Serial.println( °C); } else { Serial.println(温度发送失败缓冲区满); } } // 这里可以添加其他任务如闪烁LED指示状态 }6.3 调试与问题排查当你烧录代码后可能会遇到各种问题。以下是一个排查思路CAN通信完全无反应检查物理连接CAN_H和CAN_L是否接反总线两端是否都有120Ω终端电阻用万用表测量CAN_H和CAN_L之间的电阻在总线上只有两个节点且都接终端电阻时应接近60Ω。检查波特率确保发送和接收节点设置的波特率完全一致。500kbps和500000一定要对应。检查初始化CAN控制器的初始化函数是否返回成功可以在初始化后打印错误码进行排查。使用CAN分析仪这是最强大的工具。像创芯科技CAN分析仪、周立功CAN盒、同星TSMaster等可以监听总线上的原始报文让你看到是否有报文发出、报文内容是否正确、总线电平是否正常。这是诊断CAN问题不可或缺的利器。能发送但接收不到或反之检查ID和过滤器接收方是否设置了过滤器无意中过滤掉了发送方的ID可以先在接收方设置一个“接收所有报文”的过滤器进行测试。检查中断如果使用中断接收中断服务程序是否被正确挂载全局变量是否使用了volatile关键字检查软件逻辑接收方的处理代码是否正确是否及时从硬件FIFO中读取了报文避免FIFO溢出通信不稳定偶尔出错检查总线负载是否有多节点频繁发送导致总线负载过高可以通过分析仪查看总线负载率。检查布线CAN总线应使用双绞线并避免过长的支线“树状”拓扑。良好的布线是稳定通信的基础。检查地线确保所有节点的地线是共地的避免地电位差引入共模噪声。监控错误计数器大多数CAN库提供读取发送/接收错误计数器的函数。错误计数器持续增长是总线存在物理层问题如短路、开路、干扰的明确信号。通过这个实战项目你将亲身体验从传感器数据采集、CAN报文组包、中断处理到总线调试的完整流程。这正是FortyTwo Systems MEGA这类板卡的价值所在它让你能以相对低的门槛深入到工业通信的核心领域把想法变成能在真实网络中可靠运行的节点。7. 进阶应用与生态展望当你掌握了基本的CAN通信后FortyTwo Systems MEGA还能带你走得更远。CAN上层协议原始的CAN报文只是传输工具。在实际工业或汽车应用中人们定义了各种上层协议来组织数据例如CANopen在工业自动化中广泛应用定义了设备模型、通信对象字典、网络管理等。J1939商用车如卡车、工程机械的标准协议定义了参数组PGN、可疑参数编号SPN等。ISO-TP (ISO 15765-2)用于传输超过8字节的长数据通过分段和流控实现。如果你想通过CAN传输一个文件或一段较长的配置就需要它。在Arduino生态中也有相应的开源库来实现这些协议如CANopenNode、J1939等。在SAMC21这样的32位平台上运行这些协议栈其资源绰绰有余。多任务与实时性虽然Arduino的loop()模型简单但对于复杂的应用可能力不从心。你可以引入实时操作系统RTOS如FreeRTOS。有社区项目将FreeRTOS移植到了基于SAMD21/SAMC21的Arduino核心上。这样你可以创建多个任务Task——一个任务专用于CAN通信的接收和发送一个任务处理传感器数据一个任务管理用户界面——由RTOS内核进行调度大大提高系统的模块化和实时响应能力。与PC工具的交互你开发的CAN节点经常需要与上位机PC软件交互。除了使用专用的CAN分析仪硬件你还可以让FortyTwo Systems MEGA扮演一个USB转CAN的适配器。通过精心编写固件利用其USB CDC或自定义USB类功能将接收到的CAN报文通过USB虚拟串口转发给PC上的软件如Python脚本、C#程序或candump等工具同时将PC下发的命令转发到CAN总线上。这本身就是一个极具价值的项目。FortyTwo Systems MEGA的出现反映了嵌入式开发的一个趋势开发体验的简易化与硬件能力的专业化正在融合。它降低了进入工业通信领域的门槛但并没有牺牲性能。对于学习者、创客和需要快速原型验证的工程师来说它是一个绝佳的跳板。你可以先用它快速验证CAN通信的想法然后基于相同的芯片SAMC21N设计自己的定制化PCB将原型转化为产品。在这个过程中你在Arduino IDE里积累的代码和经验很大一部分可以平滑地迁移到更专业的开发环境如Microchip的Atmel Studio/Microchip MPLAB X IDE中实现从原型到产品的无缝衔接。这或许就是这类“跨界”开发板最大的魅力所在。