2025 Make Blocks阶段2 - 基于STM32G431RBT6设计STM32Duino-Uno-R3开发板
本项目基于 STM32G431RBT6 微控制器设计了一款完全兼容 Arduino Uno R3 接口规范的开发板,旨在为开发者提供高性能、低成本且生态兼容的硬件平台。
标签
Arduino
SPI
开发板
PWM
OLED
Make Blocks
UNO
Arduino Uno R3
STM32G431Rx
Keypad
鲜de芒果
更新2025-08-12
310
KiCad文件
全屏

任务介绍

本项目基于 STM32G431RBT6 微控制器设计了一款完全兼容 Arduino Uno R3 接口规范的开发板,旨在为开发者提供高性能、低成本且生态兼容的硬件平台。该开发板保留了 Arduino Uno R3 的经典引脚定义、电压标准和通信协议,同时利用STM32的高性能内核、丰富外设和低功耗特性,扩展了传统 Arduino 的开发边界。


任务要求

设计一款MCU核心板,以核心板 + 扩展板的方式(即把STM32G031的功能独立出来换成其他MCU设计一个核心板,周围其他功能不用设计),这款核心板能够支持硬禾上面这款学习平台的所有功能,具体要求:

  • 使用除STM32G031以外的任何其它MCU芯片来设计
  • 用到的MCU芯片需在DigiKey官网上有货且正常售卖
  • 核心板上的资源以及管脚连接能够支持硬禾这款学习平台上的所有外设功能:
    • 2个按键 + 1个光电旋转编码器用于控制输入
    • 1个SPI接口的OLED显示屏(128*128分辨率)
    • 1路音频放大电路用于产生ADC的测试信号,并可作为测试电路使用
    • 一个蜂鸣器用于音效输出
    • 1路基于PWM的DDS信号输出,用于产生测试信号(任意波形
    • 2路增益可调的模拟信号输入,通过12bits ADC采集2mVpp - 30Vpp,带宽为100KHz的模拟信号
  • 核心板的样式尺寸不做要求,可以自行定义,但要尽可能考虑到其“独立性”(可以单独使用、验证)和“通用性”(方便搭配各种外设扩展板)。

模块介绍

根据任务要求本次我选用的是 STM32G431RBT6 芯片设计了一款MCU核心板,此板卡主要用于示波器开发学习套件的主控,常用于实时信号采集与处理场景,完全兼容 Arduino Uno R3 接口规范的开发板,以及电源供电管脚。


硬件框图

如上图所示,STM32Duino-G431Rb开发板的核心为 STM32G431RBT6 芯片,基于完全兼容 Arduino Uno R3 规范接口最大支持 22 个管脚,其中6个模拟输入管脚,16个数字输入输出管脚。其中 Arduino 接口支持1路硬件SPI总线、1路硬件IIC总线、1路硬件异步串口总线、6路带时钟的PWM、6路ADC输入。此外还额外带有1路硬件IIC总线和1路硬件异步串口总线。完全能满足简易示波器/频谱仪/信号发生器学习平台的功能需求。


性能升级

  • 主控芯片:采用STM32G431RBT6(Cortex-M4F内核,最高170MHz主频),支持浮点运算单元(FPU)和DSP指令集。
  • 资源扩展:内置256KB Flash、64KB RAM,支持更高复杂度的程序和数据处理。
  • 外设丰富:集成12位ADC(2.4MSps)、多通道定时器、USB OTG、I²C/SPI/USART等高速通信接口。


高性价比

相比传统 Arduino(ATmega328P,16MHz),性能提升10倍以上,成本仅小幅增加。支持更复杂的实时控制、信号处理和低功耗应用。


原理图和PCB模块介绍

原理图


PCB


PCB预览图

受 Microchip Curiosity Nano 系列开发板板启发,为了方便使用者扩展,开发板上排针和排母都采用了蛇形孔。可以在不需要焊接的情况下,只需要将排针插入,就可以通过排孔对排针的压力保持较好的电气连接,当使用完扩展板或面包板,只需要将排阵拔出,就可以单独使用核心板。同时,完全兼容 Arduino Uno R3 接口规范也方便使用 Arduino 的扩展板搭配使用。支持 Arduino 开发对于我这类从 Arduino 入坑的业余电子制作爱好者来说是十分友好的了。

为了表达和 Arduino 的不同之处,这里我给这块开发板命名为 STM32Duino-G431Rx。为以后的任务打下基础,后续将围绕 STM32Duino-G431Rx 制作搭配相应功能的扩展板,以方便实现不同的功能。


硬件设计亮点

1. 电源与时钟

  • 输入电压:5 ~ 12V DC(兼容Arduino Uno电源标准)。
  • 稳压电路:高效LDO稳压至3.3V,为STM32及外设供电。
  • 时钟源:8MHz晶振+内部PLL,支持高精度定时和通信。


2. 核心接口

  • USB to UART:集成CH340C芯片,实现USB串口通信(兼容Arduino编程协议)。
  • 数字I/O:14个通用GPIO(兼容Uno的5V TTL电平,支持复用功能如PWM、中断、IIC、SPI、USART等)。
  • 模拟输入:6路12位ADC(兼容Uno的模拟引脚A0-A5)。


3. 增强功能

  • 调试接口:ARM SWD调试接口(支持ST-Link/J-Link等调试器)。同时还将 USB 接口连接到了 Type-C 母座,也就是说 Type-C 母座支持 串口、USB 双模式。
  • LED与按键:板载ON/OFF状态指示灯、复位按钮及一颗板载 5050 WS2812B 灯珠。
  • 蛇形排针孔:可以在不需要焊接的情况下,只需要将排针插入,就可以通过排孔对排针的压力保持较好的电气连接。
  • VIN引脚加强:原版的 Arduino Uno R3 的电源排母 VIN 是接到防反接二极管后面的,该引脚没有防反接功能。在本设计中,我将其接入到防反接二极管之前,使其具有防反接功能。
  • 参考电压加强VREF+ 增加了一个 TL431AIDBZRG4 精密可编程基准,可提供 1% 精度的模拟参考电压。
  • 板载拔码开关: 方便切换烧录模式,支持串口和SWD编程接口烧录切换。


4. 尺寸与封装

  • PCB尺寸:完全匹配 Arduino Uno R3(68.6mm × 53.3mm),支持现有扩展板和外壳。


5. 软件支持

开发环境
  • Arduino IDE:提供STM32G431专用Arduino核心,支持直接编译和下载。
  • HAL库/LL库:开放STM32标准库,支持复杂外设开发(如FreeRTOS、GUI、机器学习)。
混合开发模式
  • 支持Arduino简化编程(快速原型开发)与STM32底层开发(高性能需求)的自由切换。
  • 支持 STM32CubeMX 一键配置工具,简化外设初始化流程。


调试介绍

1. 软件介绍

焊接好的核心板,使用Arduino进行编程,验证软件在硬件电路上的运行是否正常。如上图所示,使用串口进行程序下载,能正常烧录,使用串口输出也能正常接收数据。

根据本次任务要求实现的核心板至少需要支持3路PWM、2路ADC、5路GPIO输入以及1路SPI显示输出电路,包含DC、RESET引脚。核心板一共引出超过22个GPIO引脚,实现本次任务所需的IO引脚完全够用。

2. 实现过程

由于本人对于模拟电路的不了解以及示波器相关工作原理不了解,因此核心板软件方面的验证功能以分拆的形式进行实现并验证硬件电路的正确性。


SPI OLED功能实现

OLED的显示驱动使用 U8g2 库进行驱动,开发板没有适配 Arduino。因此这里只能使用软件形式来定义SPI引脚进行驱动。

// OLED SPI 引脚定义
#define OLED_MOSI D11
#define OLED_CLK D13
#define OLED_DC D5
#define OLED_CS D4
#define OLED_RESET -1

U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ OLED_CLK, /* data=*/ OLED_MOSI, /* cs=*/ OLED_CS, /* dc=*/ OLED_DC, /* reset=*/ OLED_RESET);

u8g2.begin();
u8g2.enableUTF8Print();
u8g2.setFont(u8g2_font_unifont_t_chinese2);

...

u8g2.firstPage();
do {
// u8g2.setCursor(2, 16);
// u8g2.print("Hello World!");
u8g2.setCursor(2, 16);
u8g2.print("STM32Duino"); // Chinese "Hello World"
u8g2.setCursor(2, 32);
u8g2.print(adc[0]);
u8g2.setCursor(66, 32);
u8g2.print(adc[1]);
u8g2.setCursor(2, 48);
u8g2.print(adc[2]);
u8g2.setCursor(66, 48);
u8g2.print(adc[3]);
u8g2.setCursor(2, 64);
u8g2.print(adc[4]);
u8g2.setCursor(66, 64);
u8g2.print(adc[5]);
} while ( u8g2.nextPage() );


ADC采集与PWM输出

核心板上引出了6路ADC输入,以及6路带定时器的硬件PWM输出引脚,用于本次任务的ADC和PWM功能。这里我仅使用扩展板上的1路ADC输出,轮流测试核心板上的ADC输入功能和PWM输出功能,测试代码实现了2路PWM输出,一路用于驱动蜂鸣器发出 do、re、mi、fa、sol、la、si 的音频,另一路根据采集的ADC来调整输出的PWM占空比。

pinMode(BUZZER_PIN, OUTPUT);
pinMode(D9, OUTPUT);

...

// 驱动蜂鸣器发出 do、re、mi、fa、sol、la、si 声音
for (int i = 0; i < 8; i++) {
tone(BUZZER_PIN, notes[i]);
delay(25);
noTone(BUZZER_PIN);
delay(5);
}

...

// 根据 ADC 采集的最大数据调整输出PWM的占空比
uint16_t max = adc[0];
for (uint8_t i = 1; i < ANALOG_PIN_NUMS; i++) {
if (adc[i] > max) {
max = adc[i];
}
}
// Serial.print("The largest number is: ");
Serial.print(",");
Serial.print(max);
uint8_t w = map(max, 0, 1024, 0, 255);
Serial.print(",");
Serial.println(w);
analogWrite(D9, w);


按键矩阵控制

任务要求最大需要用到5个GPIO进行按键输入控制,这里我使用6个GPIO驱动 2 * 4 个按键矩阵来验证硬件功能,每个按键对应一种颜色,按下按键驱动板载WS2812B灯珠切换至相应的颜色。关键代码如下:

#define KEYPAD_ROWS                              2       // 按键矩阵行数
#define KEYPAD_COLS 4 // 按键矩阵列数

char hexaKeys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'8','9','A','B'},
{'C','D','E','F'}
};
byte rowPins[KEYPAD_ROWS] = {D10, D6}; //connect to the row pinouts of the keypad
byte colPins[KEYPAD_COLS] = {D7, D8, SDA, SCL}; //connect to the column pinouts of the keypad

// initialize an instance of class NewKeypad
Adafruit_Keypad customKeypad = Adafruit_Keypad( makeKeymap(hexaKeys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);

customKeypad.begin();

...

customKeypad.tick();
while(customKeypad.available()){
keypadEvent e = customKeypad.read();
Serial2.print((char)e.bit.KEY);
if(e.bit.EVENT == KEY_JUST_PRESSED) {
Serial2.println(" pressed");
switch(e.bit.KEY) {
case '8':
pixels.setPixelColor(0, colors[1]);
break;
case '9':
pixels.setPixelColor(0, colors[2]);
break;
case 'A':
pixels.setPixelColor(0, colors[3]);
break;
case 'B':
pixels.setPixelColor(0, colors[4]);
break;
case 'C':
pixels.setPixelColor(0, colors[5]);
break;
case 'D':
pixels.setPixelColor(0, colors[6]);
break;
case 'E':
pixels.setPixelColor(0, colors[7]);
break;
case 'F':
pixels.setPixelColor(0, colors[0]);
break;
default:
break;
}
pixels.show();
} else if(e.bit.EVENT == KEY_JUST_RELEASED) {
Serial2.println(" released");
// pixels.setPixelColor(0, colors[0]); // Set pixel's color (in RAM)
// pixels.show();
}
}


串口

核心板上有3路硬件串口,可通过以下代码进行初始化并驱动。

HardwareSerial hardwareSerial_1(D0, D1);
HardwareSerial hardwareSerial_2(PA10, PA9);
HardwareSerial hardwareSerial_3(PC11, PC10);


功能展示

核心板介绍

本次硬件制作还算比较顺利,从设计PCB到打板,再到焊接,基本一次成功。本次一共制作了3块电路板,均能正常运行测试程序。

由于手上没有合适的 Arduino UNO R3 系列接口的拓展板,本次功能验证使用一个电赛的底板进行拓展实验。期待后续的活动能有机会制作出相匹配的拓展板。


扩展板介绍

底板也采用Type-C接口供给5V电源,同时为核心板提供电源,并可向外输出5V、3.3V电源电压。底板集成了Debug调试器及虚拟串口,可通过SWD模式进行代码烧录和Debug调试,通过虚拟串口进行通信,集成SPI协议的1.3寸OLED显示屏、FLASH、陀螺仪、IIC协议的EEPROM,以及常见的矩阵键盘、蜂鸣器、8位LED、8位拨码开关等外设,并提供蓝牙、WiFi无线模块二选一接口。此外,还针对MSPM0L系列优秀的ADC和集成OPA运放,底板提供电感电容测量装置单芯片解决方案的基础电路。


板载串口功能展示

下面展示的是使用板载串口进行烧录,以及烧录后的串口输出功能展示。


ADC引脚

板载6通道ADC输入引脚,由于扩展底板上只有一路ADC输出,因此采用轮流插拔的形式展示6个ADC引脚的采集情况。采集的数据通过串口发送至上位机进行可视化展示,同时在扩展底板的OLED展示上实时显示。


PWM展示

为了便于直观地展示PWM的效果,这里我根据采集到的ADC值进行调整PWM输出的占空比。由于我想测试6路ADC通道的有效性,因此这里我只根据6路ADC通道采集到的最高值进行控制。


SPI OLED

扩展底板上有一路SPI总线的OLED屏幕,接入到STM32Duino的硬件SPI接口上进行驱动显示,以下是效果图。


按键矩阵

本次核心开发板的设计主题中有一项要求是需要控制1个编码器和2个按键。这里我利用扩展底板上的按键矩阵,使用2+4个IO口来控制8个按键来控制板载的WS2812B灯珠进行颜色切换,每个按键按下切换为相应的颜色,最后一个关闭灯光。


总结

遇到的问题

  1. 复位按键由于封装的问题,和实际买到的器件相比少了一个焊盘,好在不影响使用。
  2. 焊接PCB时加热台发生故障导致无法作用,使用热风枪焊接始终不得要领,折腾了挺长时间也没焊接好。最好无耐只能等到修复好加热台之后才焊接好。


心得体会

前段时间恰好在使用 Arduino UNO R3 开发板在做一些小实验,由于手上只有一块 Arduino UNO R3 开发板,而且串口功能还有点小问题。因此盟生了自己动手制作一块 Arduino UNO R3 开发板的想法。恰逢硬禾学堂推出的《Make Blocks》活动,活动原计划只有两天的原理图和PCB的绘制时间,这对于我这种业余选手来说过于困难,原来是不打算参加的。后来时间放宽到一周左右,这让我再次想要跃跃欲试。经过前期的知识储备和想法,勉勉强强在活动即将结束之际完成了设计,并成功制作出了本次活动的核心开发板 STM32Duino-G431RxTx

本次活动为一个系列活动,期待后续的活动能有机会在此开发板的基础上制作一些扩展板。最后,感谢硬禾学堂联合 DigiKey 推出的这次活动!此次活动带给我许多宝贵实践经验和机会,我们下期活动再见!


参考资料

附件下载
stm32duino-g431rx-test.zip
硬件功能测试源码
STM32Duino开发板-G431Rx-2025-06-27_173034.zip
KiCAD工程
团队介绍
业余电子爱好者
团队成员
鲜de芒果
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号