1. 环境搭建与工具链验证

任务目标

本案例完成嵌入式AI开发的最小可复现环境搭建:安装STM32CubeMX(用于生成初始化代码)、ARM Compiler(用于编译)、CMSIS-NN库(用于神经网络推理),并通过一个LED闪烁程序验证编译与烧录链路通畅。最终判定标准:程序烧录后开发板LED以1Hz频率闪烁。

环境依赖

  • 硬件:STM32F407G-DISC1开发板(板载ST-Link调试器)
  • 软件:STM32CubeMX 6.x、STM32CubeIDE 1.15+(内置ARM Compiler 6)、CMSIS-NN库(随CubeMX或从GitHub获取)
  • CMSIS-NN接入:本案例仅验证编译链路,不实际调用推理函数。CMSIS-NN头文件路径需加入编译器Include路径,具体接入位置在工程属性 → C/C++ Build → Settings → Tool Settings → Include Paths中确认包含CMSIS/NN/Include目录。

实现步骤

  1. 打开STM32CubeMX,新建工程,选择MCU为STM32F407VGT6。
  2. 配置引脚:PD12设为GPIO_Output(板载绿色LED)。
  3. 配置时钟:HSE晶振8MHz,SYSCLK设为168MHz。
  4. Project Manager中Toolchain选择STM32CubeIDE,生成代码。
  5. 在生成的工程中,将CMSIS-NN库的Include目录加入编译路径。
  6. 在main.c的while循环中编写LED翻转逻辑。

关键完整代码

在main.c的用户代码区(/* USER CODE BEGIN WHILE */与/* USER CODE END WHILE */之间)添加以下代码:

/* USER CODE BEGIN WHILE */
uint32_t last_tick = HAL_GetTick();
while (1)
{
    // 1Hz闪烁:每500ms翻转一次LED状态
    if (HAL_GetTick() - last_tick >= 500)
    {
        HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);
        last_tick = HAL_GetTick();
    }

    // 验证CMSIS-NN头文件路径正确(仅编译期检查,不实际调用)
    #ifdef ARM_NN_TRUNCATE
        // 宏存在表示CMSIS-NN头文件已被预处理器找到
        __NOP();
    #endif

    /* USER CODE END WHILE */
}

在文件顶部添加CMSIS-NN头文件包含(放在/* USER CODE BEGIN Includes */区域):

/* USER CODE BEGIN Includes */
#include "arm_nnfunctions.h"
/* USER CODE END Includes */

编译与烧录

  1. 在STM32CubeIDE中,右键工程选择Build Project。编译成功应生成.elf文件,且无未定义引用错误。
  2. 将开发板通过USB连接PC,确认ST-Link驱动已识别。
  3. 点击Run(或Debug),IDE自动通过ST-Link烧录并复位运行。

验证方法与判定标准

  • 编译验证:编译日志中无error,且arm_nnfunctions.h被成功解析(若头文件路径错误,编译器会报file not found)。
  • 烧录验证:烧录完成后,程序自动开始运行。
  • 功能验证:观察开发板上的绿色LED(PD12),应持续以约1Hz频率闪烁(亮500ms,灭500ms)。若LED不闪烁,检查时钟配置或GPIO引脚是否正确。

常见问题

  • 编译报错找不到arm_nnfunctions.h:确认CMSIS-NN的Include路径已加入工程设置,且路径指向包含arm_nnfunctions.h的目录。
  • 烧录失败:检查ST-Link驱动是否安装,确认开发板连接正常,尝试按下板上的复位键后重新烧录。
  • LED不闪烁:确认PD12引脚配置为输出模式,且时钟树中GPIOD的时钟已使能(CubeMX默认会正确配置)。