Android TODO App Learning Routing
STM32Cube 高效开发教程(基础篇)· 每日学习计划
对应教材:《STM32Cube高效开发教程(基础篇)》王维波、鄢志丹、王钊 著
硬件:STM32F407 开发板 + ST-Link 仿真器
总时长:40 天 · 每天 1.5–2 小时
原则:每天结束前对照「通过标准」自测,全部通过再进入下一天
使用说明
- ✅ 完成后打勾
- ❌ 通过标准未达到 → 当天重做,不强行推进
- 🔁 卡超过 1 小时 → 把报错/现象截图发给 AI,不要死磕
- 📌 书中每章都有完整示例项目,一定要自己手动跑通,不要只看不做
第一部分:软硬件基础(第 1–5 章)
Day 1 · 第1章 概述 + 环境准备
对应章节
第1章:STM32系列单片机、器件驱动库、STM32Cube生态系统介绍
今天做什么
- 通读第1章,建立整体认知框架
- 下载并安装 STM32CubeMX(ST官网免费)
- 下载并安装 STM32CubeIDE(ST官网免费)
- 安装 STM32F4 固件包(在 CubeMX 内 Help → Manage Embedded Software Packages 安装)
- 整理一张对比表:HAL库 vs 标准外设库 vs LL库的区别
通过标准
- CubeMX 和 CubeIDE 均安装成功,能正常打开
- STM32F4 固件包安装完成(CubeMX 中显示已安装)
- 能用自己的话解释:什么是 HAL 库,为什么 ST 推荐用它替代标准外设库
- 能说出 STM32Cube 生态系统的三个核心工具是什么
Day 2 · 第2章 STM32F407 和开发板
对应章节
第2章:STM32F407简介、开发板介绍、仿真器
今天做什么
- 阅读第2章,了解 STM32F407 的核心架构
- 对照手中的开发板,找出以下硬件位置:
- 主芯片(STM32F407)
- LED 指示灯(记录连接的 GPIO 引脚号)
- 按键(记录连接的 GPIO 引脚号)
- USB 接口、串口接口
- ST-Link 仿真器接口(JTAG/SWD)
- 将 ST-Link 连接开发板,确认驱动安装正常
通过标准
- 能在开发板上找到并标注上述所有硬件位置
- 记录下你的开发板上 LED 连接的具体引脚(如 PF9、PF10)
- ST-Link 连接后 CubeIDE 能识别到目标设备(Device 显示 STM32F407)
- 能解释 SWD 和 JTAG 的区别,知道为什么日常用 SWD
Day 3 · 第3章 STM32CubeMX 的使用(上)
对应章节
第3章:安装 CubeMX、安装固件包、软件功能和基本使用(前半)
今天做什么
- 跟着书第3章,在 CubeMX 中新建一个 STM32F407 项目
- 完成以下 CubeMX 操作练习:
- 选择芯片型号
- 配置时钟树(使用外部晶振 HSE,主频设为 168MHz)
- 配置一个 GPIO 输出引脚(LED 所在引脚,设为 Output)
- 生成代码(选择 STM32CubeIDE 格式)
通过标准
- CubeMX 能成功新建 STM32F407 项目,不报错
- 时钟树配置完成,HCLK 显示为 168MHz
- GPIO 引脚在芯片图上显示为绿色(已配置)
- 点击「Generate Code」后,CubeIDE 中能看到生成的项目文件结构
Day 4 · 第3章 STM32CubeMX(下)+ 第一个 LED 示例
对应章节
第3章:项目示例——LED 初始输出(书中第3.4节)
今天做什么
- 完成书中 LED 示例:
- 在 CubeMX 中配置 LED 引脚
- 生成代码
- 在
main.c的 while 循环中添加 LED 翻转代码:HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9); HAL_Delay(500);
- 编译、下载到开发板,观察 LED 闪烁
- 修改延时参数,验证闪烁频率变化
通过标准
- 代码编译无错误(Errors: 0)
- 下载成功,开发板 LED 以约 1 秒为周期闪烁
- 修改
HAL_Delay(500)为HAL_Delay(100),LED 闪烁明显加快 - 能找到 CubeMX 生成的初始化代码在哪个文件里(
MX_GPIO_Init())
Day 5 · 第4章 STM32CubeIDE 的使用(上)
对应章节
第4章:安装 CubeIDE、基本概念、C/C++ 界面功能
今天做什么
- 阅读第4章前半部分(4.1–4.3节)
- 熟悉 CubeIDE 界面:
- 找到 Project Explorer、Console、Problems 视图
- 设置断点(在
HAL_Delay前打断点),运行调试模式 - 观察变量值(添加 Watch 表达式)
- 练习:在调试模式下,用单步执行观察 LED 引脚状态变化
通过标准
- 能在 CubeIDE 中设置断点并进入调试模式,不崩溃
- 单步执行时,能看到程序在断点处暂停
- 能在 Registers 视图中找到 GPIOF 的 ODR 寄存器,观察到引脚电平变化
- 知道 Debug 配置和 Release 配置的区别
Day 6 · 第4章 STM32CubeIDE(下)
对应章节
第4章:CubeMX 生成项目的文件组成、HAL 库基本问题(4.4–4.8节)
今天做什么
- 阅读 4.4–4.8 节
- 分析 CubeMX 生成的项目结构,回答以下问题:
main.c里用户代码应该写在哪些区域(USER CODE BEGIN/END)?stm32f4xx_hal_gpio.c在哪个目录?- 如果重新用 CubeMX 生成代码,用户写的代码会不会被覆盖?
- 故意在
USER CODE BEGIN外面写一行代码,再重新生成,观察结果
通过标准
- 能说出用户代码必须写在
USER CODE BEGIN xxx和USER CODE END xxx之间的原因 - 知道 HAL 库文件在项目中的位置(
Drivers/STM32F4xx_HAL_Driver/) - 验证了重新生成代码后,
USER CODE BEGIN内的代码被保留,外面的被覆盖 - 能解释
HAL_Init()、SystemClock_Config()各自的作用
Day 7 · 第5章 STM32CubeMonitor + 第一阶段复习
对应章节
第5章:CubeMonitor 功能简介和基本使用
今天做什么
- 阅读第5章,了解 CubeMonitor 的用途
- 安装 STM32CubeMonitor(ST官网免费)
- 跟着书中示例,用 CubeMonitor 实时监测一个变量(如 LED 翻转计数器)
- 复习第1–5章:用自己的话写一段「STM32Cube 开发流程」说明,包含:建立CubeMX项目 → 配置外设 → 生成代码 → CubeIDE编写用户代码 → 编译下载 → 调试监测
通过标准
- CubeMonitor 能成功连接开发板并显示变量实时波形
- 能画出或描述 STM32Cube 完整开发流程图,不遗漏关键步骤
- 能独立完成「新建项目 → LED 闪烁」全流程,不看书,耗时 < 15 分钟
- 知道什么时候用 CubeMonitor(实时监测,不需要暂停程序)
✅ 第一部分完成!从明天起进入外设编程核心内容。
第二部分:系统功能和常用外设(第 6–22 章)
Day 8 · 第6章 GPIO 输入/输出(上)
对应章节
第6章:GPIO 功能概述、HAL 驱动程序(6.1–6.2节)
今天做什么
- 阅读 6.1–6.2 节,记录以下 HAL 函数的作用和参数:
HAL_GPIO_WritePin()HAL_GPIO_ReadPin()HAL_GPIO_TogglePin()
- 手写(不复制粘贴)一个程序:读取按键状态,按下时 LED 亮,松开时 LED 灭
- 在 CubeMX 中配置按键引脚为 Input,上拉模式
通过标准
- 能默写
HAL_GPIO_ReadPin()的函数签名和返回值类型 - 按键控制 LED 功能正常(硬件验证)
- 理解 GPIO 输入模式中「上拉」和「下拉」的区别,知道何时用哪个
- 能解释为什么按键需要消抖(虽然本章暂时不实现)
Day 9 · 第6章 GPIO(下)+ 公共驱动程序
对应章节
第6章:GPIO 使用示例(6.3节)、作为公共驱动程序(6.4节)
今天做什么
- 完成书中全部 GPIO 示例(流水灯、按键扫描等)
- 学习附录 A:了解书中「公共驱动程序」的目录结构和使用方式
- 挑战:不用 HAL_Delay,用计数器方式实现 LED 闪烁(模拟消抖逻辑)
通过标准
- 书中 GPIO 示例全部在开发板上跑通
- 理解公共驱动程序的作用,知道如何在新项目中导入
- 能解释轮询方式的局限性(主循环被阻塞)
- 软件消抖逻辑能正确过滤按键抖动(连续按 10 次无误触发)
Day 10 · 第7章 中断系统和外部中断(上)
对应章节
第7章:STM32F407 的中断、中断向量表、中断优先级(7.1节)
今天做什么
- 阅读 7.1 节,理解中断向量表和优先级分组
- 在纸上画出 NVIC 优先级分组的逻辑(抢占优先级 vs 响应优先级)
- 在 CubeMX 中查看 NVIC 配置界面,了解优先级分组设置方式
- 思考题:如果两个中断同时发生,STM32 如何决定先执行哪个?
通过标准
- 能解释「抢占优先级」和「响应优先级」的区别
- 知道 STM32F407 默认的优先级分组是哪种
- 能在 CubeMX 的 NVIC 界面中正确设置一个外设的中断优先级
- 回答思考题:优先级数字越小优先级越高,抢占优先级决定是否可打断
Day 11 · 第7章 外部中断(下)
对应章节
第7章:外部中断 EXTI、外部中断示例(7.2–7.3节)
今天做什么
- 用外部中断方式重写按键控制 LED 的程序(替代第8-9天的轮询方式):
- 在 CubeMX 中配置按键引脚为 EXTI 下降沿触发
- 实现中断回调函数
HAL_GPIO_EXTI_Callback()
- 测试中断优先级:添加两个按键中断,验证高优先级能打断低优先级
- 对比体验:中断方式 vs 轮询方式,主循环的占用情况
通过标准
- 外部中断触发 LED 翻转功能正常,主循环可以做其他事情
- 能找到 CubeMX 生成的中断服务函数在哪个文件(
stm32f4xx_it.c) - 能解释为什么中断回调函数里不应该执行耗时操作
- 优先级测试验证正确:高优先级中断能打断正在执行的低优先级中断
Day 12 · 第8章 FSMC 连接 TFT LCD(上)
对应章节
第8章:FSMC 原理、TFT LCD 接口电路(前半)
今天做什么
- 阅读第8章前半部分,理解 FSMC 的作用
- 在 CubeMX 中配置 FSMC,生成初始化代码
- 分析 LCD 驱动程序的结构(书中提供的公共驱动代码)
- 如果有 LCD 屏:在屏幕上显示「Hello STM32」
通过标准
- 能解释 FSMC 是什么,为什么用它连接 LCD 而不是普通 GPIO
- CubeMX 中 FSMC 配置完成,代码生成无报错
- 能说出 LCD 驱动中「写命令」和「写数据」的区别(地址线 A 的作用)
- (有屏幕者)LCD 屏成功点亮,显示文字或颜色
Day 13 · 第8章 TFT LCD(下)
对应章节
第8章:LCD 编程示例,绘图、显示文字等
今天做什么
- 完成书中 LCD 所有示例(画点、画线、画矩形、显示字符串)
- 自己写一个程序:在 LCD 上显示一个随时间变化的计数器(每秒 +1)
- 思考:LCD 刷新频率受什么限制?如何提高
通过标准
- 书中 LCD 示例全部跑通(或理解代码逻辑,如无屏幕则看懂代码)
- 计数器程序运行正常,每秒更新一次显示内容
- 能解释 FSMC 的时序参数(ADDSET、DATAST)对刷新速度的影响
- 知道 LCD 驱动芯片型号(如 ILI9341),了解其基本命令集
Day 14 · 第9章 DMA(上)
对应章节
第9章:DMA 功能概述、DMA 的 HAL 驱动程序(9.1–9.2节)
今天做什么
- 阅读 9.1–9.2 节,理解 DMA 的工作原理
- 画图:DMA 传输 vs CPU 搬运数据的对比示意图
- 在 CubeMX 中找到 DMA 配置界面,了解:
- DMA1 和 DMA2 的区别
- 通道/流的概念
- 传输方向:内存→外设 / 外设→内存 / 内存→内存
通过标准
- 能用一句话解释 DMA 的核心价值:「让外设自行搬运数据,CPU 去干别的事」
- 能说出 STM32F407 有几个 DMA 控制器,各有几个流
- 理解 DMA 传输完成中断的作用
- 能解释「循环模式」和「普通模式」的区别
Day 15 · 第9章 DMA(下)
对应章节
第9章:DMA 使用示例(9.3节及后续)
今天做什么
- 完成书中 DMA 示例:用 DMA 方式从内存传输数据到另一块内存
- 进阶:用 DMA + 串口(USART)发送一段字符串(比较 DMA 方式和轮询方式的 CPU 占用)
- 测量:发送 1000 字节时,轮询方式主循环被阻塞的时间 vs DMA 方式
通过标准
- DMA 内存到内存示例跑通,传输数据正确
- DMA + USART 发送示例跑通,串口助手收到正确数据
- 能解释为什么 DMA 传输时 CPU 可以做其他事情
- 理解
HAL_DMA_Start_IT()和HAL_DMA_Start()的区别
Day 16 · 第10章 定时器基础
对应章节
第10章:STM32F407 的定时器资源、基本定时器使用
今天做什么
- 阅读第10章,理清 STM32F407 定时器类型:
- 基本定时器(TIM6/TIM7)
- 通用定时器(TIM2–TIM5、TIM9–TIM14)
- 高级定时器(TIM1/TIM8)
- 用定时器中断替代
HAL_Delay()实现 LED 闪烁(1秒周期) - 计算定时器参数:主频 168MHz,目标 1 秒溢出,填写 PSC 和 ARR
通过标准
- 定时器中断 1 秒触发,LED 按 1 秒闪烁(验证频率准确)
- 能手动计算
PSC=8399,ARR=9999对应 1 秒溢出(168MHz / (8400×10000) = 2Hz) - 理解为什么用定时器比
HAL_Delay()更好(不阻塞主循环) - 能在 CubeMX 中正确配置定时器并使能中断
Day 17 · 第10章 定时器进阶(PWM 输出)
对应章节
第10章:PWM 输出功能和示例
今天做什么
- 配置通用定时器输出 PWM,控制 LED 亮度(呼吸灯效果):
- 频率:1kHz
- 占空比从 0% 到 100% 渐变
- 用
__HAL_TIM_SET_COMPARE()动态修改占空比 - 思考:PWM 如何控制电机转速?和控制 LED 亮度的原理一样吗?
通过标准
- LED 呼吸灯效果正常(亮度平滑渐变,周期约 2 秒)
- 能解释 PWM 的占空比概念,50% 占空比意味着什么
- 知道 PWM 的频率如何计算(
f = TIM_CLK / (PSC+1) / (ARR+1)) - 能说出 PWM 在实际项目中的 3 种常见应用
Day 18 · 第10章 定时器进阶(输入捕获)
对应章节
第10章:输入捕获功能和示例
今天做什么
- 配置定时器输入捕获,测量外部信号频率(可用另一个定时器产生测试信号)
- 完整流程:信号输入 → 捕获上升沿 → 计算两次捕获的时间差 → 得到频率
- 验证:被测信号 1kHz,测量结果误差 < 1%
通过标准
- 输入捕获程序跑通,能正确测量 1kHz 信号
- 能解释「上升沿捕获」和「下降沿捕获」的区别
- 理解溢出处理逻辑(被测信号频率很低时,计数器可能溢出)
- 知道输入捕获在实际项目中的应用(如编码器测速、脉冲宽度测量)
Day 19 · 第11章 RTC 实时时钟
对应章节
第11章:RTC 工作原理、HAL 驱动程序和使用示例
今天做什么
- 配置 RTC:使用 LSE 外部低速晶振(32.768kHz)
- 设置当前日期时间,在串口每秒打印当前时间
- 测试掉电保留:给 VBAT 引脚供电,断开主电源,再上电后时间是否继续走
通过标准
- RTC 配置成功,串口每秒打印正确时间(格式:YYYY-MM-DD HH:MM:SS)
- 能解释为什么 RTC 需要独立供电(VBAT)
- 知道 LSE(外部低速晶振)和 LSI(内部低速振荡器)的精度差异
- 理解 RTC 的「后备域」机制,断电后时间为何能保持
Day 20 · 第12章 ADC(上)
对应章节
第12章:ADC 工作原理、HAL 驱动程序(前半)
今天做什么
- 阅读前半部分,理解 ADC 的基本参数:
- 分辨率(12位 = 4096级)
- 采样时间
- 参考电压
- 配置 ADC1,轮询方式读取一个模拟量(可用电位器或内部温度传感器)
- 将 ADC 原始值转换为实际电压:
V = adc_val * 3.3 / 4095
通过标准
- ADC 轮询读取正常,串口打印原始值和换算后的电压
- 旋转电位器时,电压值在 0–3.3V 之间线性变化
- 能解释 ADC 采样时间对精度的影响(采样时间越长,精度越高)
- 知道 STM32F407 有几个 ADC,最多支持多少通道
Day 21 · 第12章 ADC(下)+ DMA 连续采样
对应章节
第12章:ADC 使用示例,DMA 连续采样(后半)
今天做什么
- 配置 ADC + DMA,连续采集多通道数据(至少 2 个通道)
- 对采集到的数据做滑动平均滤波(窗口大小 8)
- 在 LCD 或串口上显示滤波后的结果
通过标准
- DMA 多通道 ADC 采集正常,两个通道数据不混乱
- 滑动平均滤波后,信号抖动明显减小(肉眼可见)
- 理解「规则组」和「注入组」的区别
- 能解释为什么 DMA 方式适合连续 ADC 采集(CPU 零参与数据搬运)
Day 22 · 第13章 USART 串口(上)
对应章节
第13章:USART 工作原理、HAL 驱动程序(前半)
今天做什么
- 配置 USART1,波特率 115200
- 实现 printf 重定向到串口(重写
fputc函数) - 用串口助手发数据给开发板,开发板收到后原样回传(Echo)
- 测试中断方式接收:
HAL_UART_Receive_IT()
通过标准
-
printf("Hello STM32\r\n")在串口助手中正确显示 - Echo 功能正常,发什么回什么,无乱码
- 中断接收方式正常,不会因等待数据而阻塞主循环
- 理解波特率误差的概念,知道为什么高波特率时需要更精确的时钟
Day 23 · 第13章 USART(下)+ DMA 收发
对应章节
第13章:USART 使用示例,DMA 收发(后半)
今天做什么
- 实现 DMA 方式发送大量数据(如 1000 字节)
- 实现一个简单的串口命令解析器:
- 收到「LED ON」→ 点亮 LED
- 收到「LED OFF」→ 熄灭 LED
- 收到「STATUS」→ 回复当前 LED 状态
- 测试空闲中断(IDLE)方式接收不定长数据
通过标准
- DMA 发送 1000 字节,串口助手收到完整数据,无丢失
- 命令解析器正常工作,响应 3 条命令
- IDLE 中断接收方式正常,能接收任意长度的字符串
- 能解释 IDLE 中断的触发条件(总线空闲超过 1 个字符时间)
Day 24 · 第14章 SPI 通信(上)
对应章节
第14章:SPI 原理、HAL 驱动程序(前半)
今天做什么
- 阅读 SPI 原理,理解 4 根信号线(MOSI/MISO/SCK/CS)
- 配置 SPI1,连接一个 SPI 设备(如 W25Q64 Flash 芯片,书中有示例)
- 发送读取芯片 ID 的命令,验证通信正常
通过标准
- SPI 初始化完成,能正确读取外部 Flash 的芯片 ID(如 W25Q64 返回 0xEF4017)
- 能解释 SPI 的 4 种模式(CPOL/CPHA 组合)
- 理解 CS(片选)引脚的作用,知道为什么 CS 是主机控制的
- 能用示波器或逻辑分析仪观察 SPI 时序(如有条件)
Day 25 · 第14章 SPI(下)+ Flash 读写
对应章节
第14章:SPI 使用示例,外部 Flash 读写
今天做什么
- 实现 W25Q64 Flash 的完整读写流程:
- 擦除扇区
- 写入 256 字节
- 读出并验证数据
- 计算实际读写速度(字节数 / 耗时)
- 断电后重新上电,验证 Flash 数据持久保存
通过标准
- 擦除→写入→读出全流程正常,数据一致(逐字节比对)
- 断电后上电,数据仍然存在(非易失性验证)
- 理解 Flash 「写前必须先擦除」的原因
- 能解释 Flash 最小擦除单位(扇区 4KB)和最小写入单位(页 256B)
Day 26 · 第15章 I2C 通信
对应章节
第15章:I2C 原理、HAL 驱动程序、使用示例
今天做什么
- 阅读 I2C 原理,理解开漏输出、上拉电阻、从机地址
- 配置 I2C,连接 EEPROM(AT24C02)或其他 I2C 传感器
- 实现读写 EEPROM:写入 10 字节,读出验证
通过标准
- I2C 通信正常,EEPROM 读写数据一致
- 能解释 I2C 的 7 位地址格式,AT24C02 的地址如何由硬件引脚决定
- 理解 I2C 的 ACK/NACK 机制
- 知道 I2C 和 SPI 的典型应用场景区别(I2C 适合低速、多从机;SPI 适合高速)
Day 27 · 第16章 SPI + I2C 综合复习日
今天做什么
综合练习:不看书,独立完成以下任务:
- 用 SPI 读取 Flash 的最后一次写入时间(存储为字符串)
- 用 I2C 读取温度传感器(或 EEPROM 中存储的模拟温度)
- 把两个数据拼成一行,通过串口打印
通过标准
- 全程不翻书,独立完成,最多查 1 次 HAL 函数参数
- 程序一次编译通过(Errors: 0)
- 串口输出格式正确:
Flash时间: 2026-04-11 温度: 25.3°C - 能解释如果 I2C 通信失败会返回什么错误码(
HAL_ERROR/HAL_TIMEOUT)
Day 28 · 第17章 CAN 总线
对应章节
第17章/第18章(不同版本章节号可能不同):CAN 总线通信
今天做什么
- 阅读 CAN 总线原理:帧格式、仲裁、过滤器
- 配置 CAN1,两个节点互发消息(可用回环模式测试)
- 配置过滤器:只接收特定 ID 的消息
通过标准
- CAN 回环模式测试通过,发送的帧能正确接收
- 过滤器配置正确,非目标 ID 的消息被过滤掉
- 能解释 CAN 的「位仲裁」机制(显性位 0 赢得总线)
- 理解标准帧(11位ID)和扩展帧(29位ID)的区别
Day 29 · 第19章 FSMC 外部 SRAM
对应章节
第19章:FSMC 连接外部 SRAM
今天做什么
- 配置 FSMC 连接外部 SRAM(如 IS62WV51216)
- 实现读写测试:向 SRAM 写入 1024 字节随机数据,读出并全部验证
- 测试 DMA 方式读写 SRAM 的速度
通过标准
- SRAM 读写测试 1024 字节全部正确
- 能直接用指针访问 SRAM(
uint8_t *p = (uint8_t*)0x68000000) - DMA 读写 SRAM 速度 > 轮询方式
- 能解释外部 SRAM 的地址映射原理(FSMC 的 Bank 划分)
Day 30 · 第20–21章 看门狗
对应章节
第20章:独立看门狗(IWDG) 第21章:窗口看门狗(WWDG)
今天做什么
- 配置独立看门狗(IWDG):超时时间 2 秒
- 正常喂狗:系统稳定运行
- 故意不喂狗:2秒后系统复位,观察 LED 行为
- 配置窗口看门狗(WWDG):
- 测试在窗口外喂狗(触发复位)
- 测试在窗口内喂狗(正常运行)
通过标准
- IWDG 超时复位验证通过(故意不喂狗 2 秒后系统重启)
- 正常喂狗时系统持续稳定运行 60 秒以上
- 能解释 IWDG 和 WWDG 的核心区别
- 理解窗口看门狗的「窗口」概念:太早喂狗和太晚喂狗都会复位
- 知道在实际项目中,喂狗应该放在哪里(主循环固定位置,而非中断里)
Day 31 · 第22章 电源管理和低功耗(上)
对应章节
第22章:电源系统、低功耗模式概述、睡眠模式
今天做什么
- 阅读 22.1–22.3 节
- 用 CubeMonitor 的功耗计算器(PCC)分析一个配置下的理论功耗
- 实现睡眠模式:
- 按下按键进入睡眠(
HAL_PWR_EnterSLEEPMode()) - 任意中断唤醒
- 按下按键进入睡眠(
通过标准
- 进入睡眠模式后,LED 停止闪烁(主循环停止执行)
- 按键中断能正确唤醒,LED 恢复闪烁
- 能解释睡眠模式下哪些模块仍在工作(外设时钟、内存内容保持)
- CubeMonitor PCC 界面能正常使用,能读懂功耗分析结果
Day 32 · 第22章 低功耗(下)+ 停止/待机模式
对应章节
第22章:停止模式、待机模式(22.4–22.5节)
今天做什么
- 实现停止模式:用 RTC 闹钟定时 5 秒后唤醒,唤醒后打印「已唤醒」
- 实现待机模式:进入后只有 WKUP 引脚或 RTC 能唤醒
- 测量三种低功耗模式的差异(通过串口打印唤醒后的系统状态)
通过标准
- 停止模式 5 秒后由 RTC 正确唤醒,功能恢复正常
- 待机模式进入成功,唤醒后系统完整复位(注意:待机后程序从头执行)
- 能说出三种低功耗模式的功耗由高到低排列:睡眠 > 停止 > 待机
- 理解待机模式与停止模式的关键区别(待机模式 RAM 内容丢失)
综合实战阶段(第 33–40 天)
Day 33 · 综合项目设计
今天做什么
设计一个综合实战项目,整合前面学过的外设。推荐选题(选一个):
选题 A:数据采集仪
- ADC 采集温度/电压
- LCD 显示实时曲线
- 串口发送到上位机
- 按键控制采样频率
选题 B:简易示波器
- ADC 高速采样(DMA)
- LCD 波形显示
- 定时器控制采样率
- 串口上传数据
选题 C:智能定时插座控制器
- RTC 定时功能
- LCD 显示当前时间和定时设置
- 按键设置定时参数
- GPIO 控制继电器输出
通过标准
- 选定项目,写出功能列表和模块划分
- 画出系统框图(各模块关系)
- 列出需要用到的外设和对应的书章节
- 确认开发板上有对应硬件(或准备好需要的额外器件)
Day 34–35 · 综合项目开发(基础功能)
今天做什么
用 2 天完成项目核心功能:
- Day 34:完成硬件初始化和各模块基础功能(能单独运行)
- Day 35:整合各模块,主循环调度
通过标准(Day 35 结束时)
- 各模块单独测试均正常
- 主循环整合后系统稳定运行,不死机
- 串口打印系统状态,能看到各模块运行正常的日志
- 代码写在
USER CODE BEGIN区域内,重新生成代码后功能不丢失
Day 36–37 · 综合项目开发(完善功能)
今天做什么
- Day 36:添加错误处理和异常保护(看门狗、通信超时重试)
- Day 37:添加低功耗策略(无操作 30 秒后进入睡眠)
通过标准(Day 37 结束时)
- 故意拔掉一个外设,系统不死机,有错误提示
- 看门狗正常工作,异常时能自动复位恢复
- 低功耗模式正确进入和退出,功能恢复完整
- 代码中无
while(1)死等,所有等待均有超时保护
Day 38 · 代码整理和注释
今天做什么
- 为所有关键函数添加注释(功能、参数、返回值)
- 把可复用的功能提取为独立函数
- 删除调试用的
printf,保留有意义的日志 - 检查是否有硬编码的数字(替换为宏定义)
通过标准
- 每个自定义函数有注释说明其作用
- 所有魔法数字改为有名称的宏(如
#define LED_PIN GPIO_PIN_9) - 代码能让第一次看的人在 10 分钟内理解整体结构
- 项目能正常编译,功能与整理前一致
Day 39 · 性能测试和优化
今天做什么
- 用 CubeIDE 的 SWV(Serial Wire Viewer)功能测量主循环执行时间
- 找出耗时最长的操作,尝试优化(如用 DMA 替代轮询)
- 测试极端情况:所有中断同时触发时系统是否稳定
通过标准
- 能用 SWV 或 DWT 周期计数器测量代码段执行时间
- 找到至少一个可优化的耗时点并完成优化,执行时间缩短 > 20%
- 极端压力测试下系统稳定运行 10 分钟以上无死机
- 知道 CPU 占用率的估算方法(空闲任务时间/总时间)
Day 40 · 最终验收
今天做什么
按以下清单逐项验收,全部通过即完成本书学习。
最终通过标准
工具掌握
- 能在 CubeMX 中独立完成任意外设配置,不需要查书
- 能在 CubeIDE 中熟练调试(断点、Watch、Registers)
- 能用 CubeMonitor 实时监测变量
外设掌握(每项能不看书独立实现)
- GPIO:输入输出、外部中断
- 定时器:基本定时、PWM 输出、输入捕获
- USART:轮询/中断/DMA 收发,printf 重定向
- SPI:读写外部 Flash
- I2C:读写 EEPROM 或传感器
- ADC:单通道轮询、多通道 DMA 连续采样
- DMA:内存到内存,配合 USART/ADC 使用
- RTC:日期时间读写,闹钟功能
- 看门狗:IWDG 基本使用
- 低功耗:睡眠模式进入和唤醒
综合能力
- 完成一个整合 3 种以上外设的综合项目
- 项目代码结构清晰,有注释,可维护
- 遇到外设问题,知道如何查 Reference Manual 定位原因
最终验收动作:录一段 1 分钟的综合项目演示视频,覆盖主要功能。能流畅讲解系统架构和每个模块的作用,即为通过。
🎉 恭喜完成基础篇全部学习!
接下来可以进入高级篇:
- FreeRTOS 多任务操作系统
- FatFS 文件系统(SPI Flash / SD 卡 / U 盘)
- 触摸屏、摄像头(DCMI)
- USB Host / Device
教材:《STM32Cube高效开发教程(基础篇)》王维波、鄢志丹、王钊 著,人民邮电出版社
生成日期:2026 年 4 月