2. MCU上运行第一个TensorFlow Lite Micro示例

任务目标

在MCU上实现LED周期性闪烁控制,通过GPIO输出高低电平驱动LED,验证GPIO基本输出功能与延时逻辑的正确性。本案例以STM32F103系列为主控芯片,使用标准外设库完成寄存器级配置。

硬件连接

  • LED正极串联330Ω限流电阻接至PC13(STM32F103最小系统板载LED)
  • LED负极接GND
  • 若使用其他GPIO引脚,需对应修改代码中的端口和引脚宏定义

完整实现代码

#include "stm32f10x.h"

#define LED_GPIO_PORT     GPIOC
#define LED_GPIO_PIN      GPIO_Pin_13
#define LED_GPIO_CLK      RCC_APB2Periph_GPIOC

// 简单延时函数(约1ms @ 72MHz系统时钟)
void Delay_ms(uint32_t ms) {
    uint32_t i, j;
    for (i = 0; i < ms; i++) {
        for (j = 0; j < 7200; j++) {
            __NOP();
        }
    }
}

void LED_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 使能GPIOC时钟
    RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);
    
    // 配置PC13为推挽输出,最大翻转速度2MHz
    GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);
}

int main(void) {
    LED_Init();
    
    while (1) {
        GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN);   // LED灭(高电平)
        Delay_ms(500);
        GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN); // LED亮(低电平)
        Delay_ms(500);
    }
}

编译与烧录

  1. 工程配置:使用Keil MDK或IAR创建STM32F103C8工程,添加上述代码及标准外设库文件(stm32f10x_gpio.c、stm32f10x_rcc.c)。
  2. 编译:选择芯片型号STM32F103C8,勾选"Use MicroLIB"以减少代码体积,编译生成HEX文件。
  3. 烧录:通过ST-Link或串口ISP将HEX文件下载至MCU。

验证方法

  • 观察现象:上电后板载LED应以约1Hz频率(每500ms翻转一次)持续闪烁。
  • 逻辑分析仪验证(可选):将探头接至PC13,应测得周期为1s、占空比50%的方波信号。
  • 通过标准:LED闪烁周期误差在±20%以内(即0.8s~1.2s),且持续运行无异常,即可判定GPIO输出功能正常。

常见问题

  • LED不亮:检查LED极性是否接反,或GPIO配置是否与硬件连接一致。
  • 闪烁频率异常:若系统时钟不是72MHz,需调整Delay_ms中的内层循环次数(7200 ≈ 72MHz/10kHz)。
  • 编译报错:确认已包含标准外设库头文件路径,并正确添加对应.c源文件。
高电平 (LED灭) 低电平 (LED亮) 500ms 500ms 周期 = 1s

上图展示了PC13引脚输出波形的时序关系:高电平期间LED熄灭,低电平期间LED点亮,每个状态持续500ms,形成周期为1s的闪烁效果。