你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-U3C5ZI 测评】+ 手写数字识别

[复制链接]
L.先生 发布时间:2026-6-5 13:44

一、 前言

随着边缘计算与微型机器学习的快速发展,在微控制器(MCU)上部署人工智能算法已经成为嵌入式领域的研究热点。本次测评以意法半导体的高性能开发板 NUCLEO-U3C5ZI 为硬件核心,搭建了一套端到端的手写数字识别系统。

传统的人工智能开发往往局限于PC端或云端服务器,而本方案旨在打通从“算法算法设计、模型转换、硬件移植”到“实时通信联调”的全链路闭环。通过将深度学习模型部署在资源受限的微控制器上,不仅能够显著降低系统的功耗与通信带宽需求,还能极大地提升实时响应速度,这对于工业控制、智能穿戴等需要边缘侧智能的场景具有重要意义。

二、 算法研发与模型导出

项目的起点是算法的构建与训练。本方案没有采用常见的 Python 框架,而是选择了工程界同样广泛使用的 MATLAB 及其深度学习工具箱。首先在 MATLAB 环境下导入标准的 MNIST 手写数字数据集,该数据集包含数万张 28*28像素的灰度手写数字图像。

在网络架构上,设计了一个轻量级的卷积神经网络(CNN),包含卷积层、激活层、池化层以及全连接层,在保证识别准确率的同时严格控制参数量。经过数个周期的训练,模型在验证集上达到了理想的准确率。为了将这个在 PC 上运行的模型迁移到嵌入式端,利用 MATLAB 的exportONNXNetwork 函数将训练好的网络导出为通用的 ONNX 格式文件。这一步是跨平台部署的关键,ONNX 格式作为一种开放的模型交换标准,能够被后续的嵌入式优化工具完美解析和重构。

untitled.png

三、 嵌入式端部署与基准测试

3.1 STedgeAi模型转换

在获取到 ONNX 模型后,核心任务是将其“瘦身”并移植到 NUCLEO-U3C5ZI 开发板上。这里借助了意法半导体官方的神经网络优化工具 STedgeAi。通过这个工具能够读取 ONNX 文件的网络拓扑结构和权重参数,并将其转化为高度优化、完全由 C 语言编写的专用推理代码,同时可以无缝调用 ARM 的 CMSIS-NN 库进行底层硬件级加速。

将导出的模型文件上传,选择对应的开发板测试,最后导出c代码即可;

3_1.png

由于 NUCLEO-U3C5ZI 拥有强大的算力和可观的存储资源,在配置过程中,暂时保留了原始的浮点数模型进行推理。在代码生成并导入到集成开发环境(IDE)后,首先进行了“静态固化测试”。即在单片机的 Flash 中预先硬编码存储了几组固定的标准手写数字图像数据,在不依赖任何外部通信的前提下直接调用推理函数。基准测试结果表明,开发板不仅能够百分之百正确识别预设的数字,而且每次推理的实际耗时极短,内存与内核资源的占用也处于非常安全的范围内,这为后续的实时动态联调奠定了扎实的硬件信心。

3.2 STM32CubeMX配置

这部分仅需配置USART1,板载LED即可,最后导出cmake工程。

3_2.png

3.3 测试代码编写

将生成的c代码导入到配置的工程中后,仅需要调用相关的API接口即可。

/**
 * @brief 处理接收到的串口图像数据帧并进行 AI 推理
 */
int AI_Process_UART_Frame(const uint8_t* frame_buf) {
    stai_return_code ret;

    // 1. 严格校验帧头 0xAA 0x55
    if (frame_buf[0] != 0xAA || frame_buf[1] != 0x55) {
        printf("[-] UART Frame Error: Invalid Header (0x%02X 0x%02X)\r\n", frame_buf[0], frame_buf[1]);
        return -1; // 错误码 -1:帧头错误
    }

    // 2. 提取并归一化图像数据
    // 串口接收的是 0~255 的 uint8_t 像素,而 MNIST 模型通常需要 0.0f ~ 1.0f 的 float32 输入
    const uint8_t* raw_pixels = &frame_buf[2]; // 图像数据从第 3 个字节开始

    for (int i = 0; i < STAI_NETWORK_IN_1_SIZE; i++) {
        ai_input_buffer[i] = (float)raw_pixels[i] / 255.0f; // 转换为 float 并缩放到 [0.0, 1.0]
    }

    // 3. 触发 AI 硬件推理
    // 第二个参数模式在 U3 轻量运行时中填 0 即可
    ret = stai_network_run(network_handle, 0);
    if (ret != STAI_SUCCESS) {
        printf("[-] AI Inference Failed! Code: %d\r\n", ret);
        return -2; // 错误码 -2:模型推理失败
    }

    // 4. 解析 Softmax 输出,寻找概率最大的分类
    int predicted_digit = 0;
    float max_prob = ai_output_buffer[0];

    for (int i = 1; i < STAI_NETWORK_OUT_1_SIZE; i++) {
        if (ai_output_buffer[i] > max_prob) {
            max_prob = ai_output_buffer[i];
            predicted_digit = i;
        }
    }

    // 5. 打印最终识别结果(便于在串口助手观察)
    printf("[AI Result] Predicted: %d (Confidence: %.2f%%)\r\n", predicted_digit, max_prob * 100.0f);

    // 返回识别出的数字
    return predicted_digit;
}

四、 Python 上位机联调与通信协议设计

为了让测试更加方便,随后开发了一款基于 Python 的 GUI 上位机软件。上位机与MCU通过串口通讯。当在上位机按下“发送”按钮时,程序会将画布数据展开为 784 字节的单维数组并在数据包的头部加入了两个固定字节作为帧头,分别为 0xAA 和 0x55。因此,上位机每次向 NUCLEO-U3C5ZI 发送的数据帧总长度固定为 786 字节。

4.png

五、效果展示

写数字7,点击发送,MCU接收到数据包后LED点亮,开始进行模型推理,推理结束将结果返回至上位机。可以看到接收到MCU返回数据为7,置信度62.34%。

5.png

收藏 评论0 发布时间:2026-6-5 13:44

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版