一、 前言
很荣幸能入围【你晒单,我买单,DigiKey带您畅享好物】第三期活动,非常感谢Digikey和EEWORLD的大力支持。我在这次活动中选择了两件物料,其中有ST的NUCLEO-U385RG-Q,我打算拿来尝试制作一个生理信号采集装置,采集PPG信号,这次来分享一下NUCLEO-U385RG-Q的开发体验。
二、 开发环境与官方示例代码
我本来开始想尝试一下使用我更熟悉的probe-rs加embassy开发,然而尽管probe-rs有U385的pull request,但embassy还没有支持u3系列,故我们还是使用CubeMX和Cubeide。
在MX选择该开发板后,勾选“Generate demostration code”,生成代码前记得选择stm32cubeide,生成官方示例,也就是按按钮切换LED状态的示例。得益于板子有板载的ST-Link和虚拟串口,我们插上USB线就可以烧录了。
图1 LED灯亮
三、 配置I2C
既然是采集PPG信号,常用相关模块一般都使用I2C,故我先尝试配置I2C,在这其中还出现了一些小插曲,但我们暂且按下不表。
首先我选择了I2C2这个接口,通过 CubeMX 的引脚重映射将 I2C 功能迁移到了 PB13/PB14,CN10的Pin28(SDA)和30(SCL),并将这两个引脚设置内部上拉,以及速度设为Very High
图2 Pinout配置
我尝试简单扫描了一下I2C设备,结果如图3,其中关键函数如下:
// 硬件I2C扫描函数:用于检测总线上挂载的设备
void I2C2_Hardware_Scan(void) {
printf("\\r\\n--- Starting Hardware I2C Scan ---\\r\\n");
uint8_t devices_found = 0;
for(uint16_t addr = 0; addr < 128; addr++) {
if(HAL_I2C_IsDeviceReady(&hi2c2, (addr << 1), 2, 10) == HAL_OK) {
printf("Device found at 0x%02X\\r\\n", addr);
devices_found++;
}
}
if(devices_found == 0) {
printf("No I2C devices found.\\r\\n");
} else {
printf("Scan done. Found %d devices.\\r\\n", devices_found);
}
}
// 读取MAX30102 ID函数:验证通信是否正常
void Test_MAX30102_ID(void) {
uint8_t dev_addr = 0x57 << 1;
uint8_t reg_addr = 0xFF;
uint8_t data = 0;
if(HAL_I2C_Mem_Read(&hi2c2, dev_addr, reg_addr, I2C_MEMADD_SIZE_8BIT, &data, 1, 100) == HAL_OK) {
printf("Read Register 0xFF: 0x%02X\\r\\n", data);
if(data == 0x15) {
printf("SUCCESS! Hardware I2C is working perfectly!\\r\\n");
}
}
}
图3 搜索到Max30102模块
四、总结
这次 NUCLEO-U385RG 的上手体验让我印象深刻,尤其是在解决 I2C 通讯问题的过程中,我对 STM32U385 的特性有了更直观的理解。首先,STM32U385可以通过CubeMX 可以轻松地将 I2C2 映射到 CN10 接口的 PB13/PB14 引脚,这种灵活性极大地提高了硬件调试的容错率,对于原型开发非常友好。其次,尽管U385是一款较新的芯片,但工具链的适配已经非常成熟,大大降低了上手新芯片的学习成本。
总的来说,NUCLEO-U385RG 是一块“下限很低,上限很高”的开发板,非常适合作为高性能低功耗项目的开发平台。
本次评测就先到这里,下次分享我将调试SSD1306屏幕,以及实现读取MAX10302的数据,实现一个生理信息设备。


