从零开始,纯手敲标准库代码,10天掌握嵌入式开发核心技能,完成具有传感器感知、PWM控制、串口通信的智能垃圾桶项目。
LED 驱动、按键消抖、模块化驱动架构
EXTI 外部中断、TIM6 定时中断、NVIC 配置
USART 收发、printf 重定向、命令解析
硬件 PWM、舵机控制、蜂鸣器
PIR 人体感应、HC-SR04 超声波测距
| 模块 | 用途 |
|---|---|
| STM32F407ZET6 | 主控芯片 |
| LED × 4 | 状态指示灯 |
| 轻触按键 × 4 | 手动控制输入 |
| SG90 舵机 | 桶盖开关 |
| HC-SR04 | 超声波测距(满桶检测) |
| HC-SR501 PIR | 人体红外感应 |
| 蜂鸣器 | 满桶报警 |
| USB-TTL 模块 | 串口调试 |
| 时段 | 内容 |
|---|---|
| 上午 2h | STM32 简介、芯片命名、Keil 工程创建全流程 |
| 上午 2h | RCC 时钟系统、GPIO 工作模式讲解 |
| 下午 2h | 手敲 LED 闪烁代码、编译下载、排查错误 |
| 下午 2h | 课堂练习 + 讲解常见错误 |
STM32F40_41xxx 漏写 → 头文件找不到| 时段 | 内容 |
|---|---|
| 上午 2h | 工程分层思想,创建 LED.c / LED.h 文件 |
| 上午 2h | 宏定义引脚、操作宏 LED1(x) 讲解 |
| 下午 2h | 流水灯函数实现,软件延时分析 |
| 下午 2h | 练习:跑马灯 + 讨论软件延时的缺点 |
LED1(x) 是三目运算符的应用:x ? SetBits : ResetBits。调用时 LED1(1) 亮、LED1(0) 灭,像控制一个开关一样直观。
| 时段 | 内容 |
|---|---|
| 上午 2h | GPIO 输入模式、上拉/下拉原理、读引脚函数 |
| 上午 2h | 按键抖动演示(示波器/逻辑分析仪),消抖原理 |
| 下午 2h | KEY_init() + KEY_scan() 驱动手敲 |
| 下午 2h | 4键4灯练习,排查接线问题 |
| 时段 | 内容 |
|---|---|
| 上午 2h | SysTick 原理、delay_us / delay_ms 实现 |
| 上午 2h | 用数组存密码序列、逐位收集输入 |
| 下午 2h | 密码验证逻辑 + LED 反馈效果 |
| 下午 2h | 练习 + BUG 修复讨论 |
| 时段 | 内容 |
|---|---|
| 上午 2h | 中断概念、NVIC 优先级组讲解 |
| 上午 2h | EXTI 四步配置手敲 |
| 下午 2h | ISR 编写、volatile 关键字讲解 |
| 下午 2h | 练习:中断驱动 LED,对比轮询方式 |
g_flag = 1,并在 main 循环中检测 flag 响应。
| 时段 | 内容 |
|---|---|
| 上午 2h | UART 协议讲解,GPIO 复用模式,printf 重定向 |
| 上午 2h | Usart1_init() 手敲,串口助手联调 |
| 下午 2h | USART 中断接收,缓冲区字符串收集 |
| 下午 2h | 命令解析函数,串口控制 LED 练习 |
| 时段 | 内容 |
|---|---|
| 上午 2h | 定时器原理、PSC/ARR 计算公式推导 |
| 上午 2h | TIM6_init() 手敲,NVIC 配置 |
| 下午 2h | TIM6_DAC_IRQHandler 编写,1Hz LED 验证 |
| 下午 2h | 练习:非阻塞多任务(定时器灯 + 串口同时工作) |
| 时段 | 内容 |
|---|---|
| 上午 2h | PWM 原理、TIM 输出比较模式讲解 |
| 上午 2h | 舵机参数计算、Servo_init() 手敲 |
| 下午 2h | 舵机角度控制验证,调 CCR 值看舵机转动 |
| 下午 2h | 蜂鸣器 PWM 配置,练习 |
| 时段 | 内容 |
|---|---|
| 上午 2h | PIR 传感器讲解接线,超声波时序讲解 |
| 上午 2h | HC-SR04 驱动实现,距离测试验证 |
| 下午 3h | 状态机设计 + 系统集成联调 |
| 下午 1h | 功能测试、BUG 修复、串口输出完善 |
[状态:IDLE] [距离:12cm] [LED:呼吸灯] [蜂鸣器:OFF]接好线、烧录程序、串口助手打开,确认系统正常启动
现场逐项演示:人感开盖→超声波测距→满桶报警→按键手动控制→串口输出
选 2~3 个核心模块,讲清初始化逻辑、关键参数含义、状态机设计
每位同学至少回答 1 个问题(见右侧常见问题准备)
| 时段 | 内容 |
|---|---|
| 上午 | 各组自由调试,老师巡回指导 |
| 下午 1~5 点 | 按组顺序答辩(每组约 15 分钟) |
| 模块 | 模块引脚 | STM32 引脚 | 说明 |
|---|---|---|---|
| LED × 4 | LED1 阳极 | PG14 | 阴极接 GND,串 330Ω 限流电阻 |
| LED2 阳极 | PG13 | ||
| LED3 阳极 | PG6 | ||
| LED4 阳极 | PG11 | ||
| 按键 × 4 | KEY1 一端 | PG2 | 另一端接 GND,GPIO 配置上拉输入 |
| KEY2 一端 | PG3 | ||
| KEY3 一端 | PG4 | ||
| KEY4 一端 | PG5 | ||
| SG90 舵机 | 棕色(GND) | GND | 信号线接 TIM3_CH1 复用引脚 |
| 红色(VCC) | 5V | ||
| 橙色(信号) | PA6(TIM3_CH1) | ||
| HC-SR04 超声波 | VCC | 5V | ⚠️ ECHO 输出 5V,需分压到 3.3V(2KΩ+1KΩ)再接 STM32 |
| GND | GND | ||
| TRIG(触发) | PB9(输出) | ||
| ECHO(回波) | PB10(输入)⚠️分压! | ||
| HC-SR501 PIR | VCC | 5V | GPIO 配置下拉输入,HIGH = 检测到人 |
| GND | GND | ||
| OUT(信号) | PB8(输入) | ||
| 蜂鸣器 | 正极(+) | PB6(TIM4_CH1) | 无源蜂鸣器用 PWM;有源蜂鸣器直接 GPIO 高电平 |
| 负极(-) | GND | ||
| USB-TTL 串口 | TX(模块发) | PA10(USART1_RX) | 波特率 115200,TX/RX 交叉连接 |
| RX(模块收) | PA9(USART1_TX) | ||
| GND | GND |
| 文件夹 | 文件 | 职责 |
|---|---|---|
| User/ | main.c | 主程序,状态机逻辑 |
| Drivers/ | LED.c / LED.h | LED 驱动 |
| KEY.c / KEY.h | 按键驱动 | |
| USART.c / USART.h | 串口驱动 | |
| SERVO.c / SERVO.h | 舵机 PWM 驱动 | |
| PIR.c / PIR.h | 人体传感器 | |
| HCSR04.c / HCSR04.h | 超声波驱动 | |
| System/ | delay.c / delay.h | SysTick 延时 |
| TIM.c / TIM.h | TIM6 定时中断 |
| # | 功能 | 涉及技术 | 难度 | 分值 |
|---|---|---|---|---|
| 1 | 🧍 人体感应自动开盖 | PIR 传感器 + 舵机 PWM | 基础 | 8分 |
| 2 | 📏 超声波满桶检测 | HC-SR04 时序测距 | 基础 | 8分 |
| 3 | 🔔 满桶蜂鸣器报警 | GPIO / PWM 蜂鸣器 | 基础 | 6分 |
| 4 | 💡 LED 状态指示 | GPIO 输出,多种模式 | 基础 | 6分 |
| 5 | 🎮 按键手动控制 | GPIO 输入 + 消抖 | 基础 | 6分 |
| 6 | 📡 串口实时状态输出 | USART printf | 进阶 | 8分 |
| 7 | 🌬️ LED 呼吸灯空闲效果 | 硬件 PWM / 软件模拟 | 进阶 | 6分 |
| 8 | ⌨️ 串口命令控制 LED 模式 | USART 接收 + 字符串解析 | 挑战 | 6分 |
| 9 | ⏱️ 定时器驱动 LED 动效 | TIM6 中断,非阻塞 | 挑战 | 6分 |
| 10 | 🔒 满桶时禁止人感开盖 | 状态机逻辑设计 | 挑战 | 6分 |
| 状态 | 条件(进入) | 执行动作 | 条件(退出) |
|---|---|---|---|
| IDLE 空闲 | 系统启动 / 垃圾清空后 | LED 呼吸灯效果,等待事件 | 检测到人 或 KEY1 手动 |
| OPEN 已开盖 | PIR 检测到人 或 KEY1 | 舵机转 180°,LED 全亮 | 等待 3 秒后自动 |
| CHECKING 检测中 | OPEN 状态 3 秒后 | 舵机关盖,超声波测距 | 测距完成后进入 IDLE 或 FULL |
| FULL 满桶 | 超声波距离 < 5cm | 蜂鸣器报警,LED 快闪,锁定开盖 | KEY3 按下确认清空 |
| 维度 | 分值 | 评分细则 |
|---|---|---|
| 功能完整性 | 40分 | 基础功能每项 6~8 分,进阶每项 6~8 分,满分 40 |
| 代码质量 | 25分 | 模块化架构 10 分,命名规范 5 分,注释 5 分,无明显 BUG 5 分 |
| 演示效果 | 20分 | 功能稳定运行 10 分,串口输出清晰 5 分,接线整洁 5 分 |
| 个人答辩 | 15分 | 能讲清自己负责模块 10 分,回答老师提问 5 分 |
每天设置抢答和最快完成练习积分,黑板实时更新排名,前 3 名给予实物奖励
开课前 5 分钟出一道用已学知识修改代码的小任务,比赛谁先在板子上跑通,第一名得积分
下午拿出一段故意写错的代码投影,让全班找 BUG,第一个找到的得分。培养主动看代码的习惯
每实现一个功能,让学生把串口输出截图发到群里。老师点评,好的截图被展示,形成正向竞争
设计任务卡:LED → 按键 → USART → PWM → 传感器,每解锁一个打印一张"勋章卡"发给学生