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目录。
实现步骤
- 打开STM32CubeMX,新建工程,选择MCU为STM32F407VGT6。
- 配置引脚:PD12设为GPIO_Output(板载绿色LED)。
- 配置时钟:HSE晶振8MHz,SYSCLK设为168MHz。
- Project Manager中Toolchain选择
STM32CubeIDE,生成代码。 - 在生成的工程中,将CMSIS-NN库的
Include目录加入编译路径。 - 在
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 */
编译与烧录
- 在STM32CubeIDE中,右键工程选择Build Project。编译成功应生成
.elf文件,且无未定义引用错误。 - 将开发板通过USB连接PC,确认ST-Link驱动已识别。
- 点击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默认会正确配置)。