1. 环境搭建与工程模板

任务目标

在STM32CubeIDE中创建一个空工程,集成TFLite Micro静态库,编译一个调用TensorFlow Lite for Microcontrollers运行时版本号接口的最小示例,并烧录至开发板通过串口打印验证环境可用。

环境依赖

  • STM32CubeIDE 1.13+(含GCC arm-none-eabi工具链)
  • STM32F407G-DISC1开发板(板载ST-Link/V2)
  • TFLite Micro源码(v2.14.0,从GitHub克隆)
  • STM32CubeF4固件包(通过CubeIDE的Embedded Software Packages管理器安装)

工程配置步骤

  1. 新建STM32CubeIDE工程,选择MCU为STM32F407VGT6,初始化时钟为168MHz主频。
  2. 在CubeMX配置USART2(PA2/PA3)为异步模式,波特率115200,8N1。
  3. 将TFLite Micro源码中的tensorflow目录复制到工程根目录下。
  4. 在工程属性 → C/C++ Build → Settings → Tool Settings → MCU GCC Compiler → Include paths中添加:${workspace_loc:/${ProjName}/tensorflow}
  5. 在MCU GCC Linker → Libraries中添加:tensorflow-microlib(若需自行编译静态库,见下文说明)。

关键完整代码

以下代码为main.c中用户代码区的完整实现(替换自动生成的/* USER CODE BEGIN 0 */至/* USER CODE END 4 */之间的内容):

/* USER CODE BEGIN 0 */
#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/micro/micro_mutable_op_resolver.h"
#include "tensorflow/lite/version.h"
#include <stdio.h>
#include <string.h>

static void USART2_Print(const char* str) {
    HAL_UART_Transmit(&huart2, (uint8_t*)str, strlen(str), HAL_MAX_DELAY);
}

static char print_buf[64];

int tflite_env_check_main(void) {
    // 获取TFLite Micro运行时版本字符串
    const char* version = TFLITE_VERSION_STRING;  // 来自 version.h

    // 构造输出信息
    snprintf(print_buf, sizeof(print_buf), "TFLite Micro Version: %s\r\n", version);
    USART2_Print(print_buf);

    // 验证MicroInterpreter基本类型可用(编译期验证)
    tflite::MicroInterpreter* interpreter = nullptr;
    USART2_Print("MicroInterpreter type OK\r\n");
    (void)interpreter;

    // 验证MicroMutableOpResolver可用
    tflite::MicroMutableOpResolver<10> resolver;
    USART2_Print("MicroMutableOpResolver type OK\r\n");

    USART2_Print("Env check PASSED\r\n");
    return 0;
}
/* USER CODE END 0 */

/* USER CODE BEGIN 4 */
/* 在main()的while(1)之前调用一次 */
/* USER CODE END 4 */

在main()函数的/* USER CODE BEGIN 2 */区域添加调用:

/* USER CODE BEGIN 2 */
tflite_env_check_main();
/* USER CODE END 2 */

编译与烧录

  1. 若尚未编译TFLite Micro静态库,需先进入源码目录执行:make -f tensorflow/lite/micro/tools/make/Makefile TARGET=stm32f4 OPTIMIZED_KERNEL_DIR=cmsis_nn,生成libtensorflow-microlib.a后手动添加到工程链接器库路径。
  2. 点击锤子图标编译工程,确认无错误。
  3. 使用ST-Link调试器烧录程序(CubeIDE默认F11启动调试即自动烧录)。

验证方法与通过条件

  • 打开串口助手(如PuTTY或CubeIDE内置终端),连接USART2对应USB转串口(PA2/PA3需外接USB-TTL模块),波特率115200。
  • 复位开发板,观察串口输出。预期输出(与代码逻辑严格一致):
TFLite Micro Version: 2.14.0
MicroInterpreter type OK
MicroMutableOpResolver type OK
Env check PASSED

若看到上述四行输出,说明TFLite Micro库已正确链接、头文件路径配置无误、运行时版本接口可调用,部署环境验证通过。

常见问题

  • 编译报找不到头文件:检查Include paths是否指向tensorflow根目录(而非tensorflow/lite)。
  • 链接错误undefined reference:确认静态库路径已添加,且库文件名与添加的-l参数匹配(去掉lib前缀和.a后缀)。
  • 串口无输出:检查USART2引脚是否复用为AF7,以及USB-TTL模块的TX/RX是否与PA2/PA3交叉连接。