Android TODO App Learning Routing

2025-04-11 · 作者:JerryMain
The word astro against an illustration of planets and stars.

STM32Cube 高效开发教程(基础篇)· 每日学习计划

对应教材:《STM32Cube高效开发教程(基础篇)》王维波、鄢志丹、王钊 著
硬件:STM32F407 开发板 + ST-Link 仿真器
总时长:40 天 · 每天 1.5–2 小时
原则:每天结束前对照「通过标准」自测,全部通过再进入下一天


使用说明

  • ✅ 完成后打勾
  • ❌ 通过标准未达到 → 当天重做,不强行推进
  • 🔁 卡超过 1 小时 → 把报错/现象截图发给 AI,不要死磕
  • 📌 书中每章都有完整示例项目,一定要自己手动跑通,不要只看不做

第一部分:软硬件基础(第 1–5 章)


Day 1 · 第1章 概述 + 环境准备

对应章节

第1章:STM32系列单片机、器件驱动库、STM32Cube生态系统介绍

今天做什么

  1. 通读第1章,建立整体认知框架
  2. 下载并安装 STM32CubeMX(ST官网免费)
  3. 下载并安装 STM32CubeIDE(ST官网免费)
  4. 安装 STM32F4 固件包(在 CubeMX 内 Help → Manage Embedded Software Packages 安装)
  5. 整理一张对比表:HAL库 vs 标准外设库 vs LL库的区别

通过标准

  • CubeMX 和 CubeIDE 均安装成功,能正常打开
  • STM32F4 固件包安装完成(CubeMX 中显示已安装)
  • 能用自己的话解释:什么是 HAL 库,为什么 ST 推荐用它替代标准外设库
  • 能说出 STM32Cube 生态系统的三个核心工具是什么

Day 2 · 第2章 STM32F407 和开发板

对应章节

第2章:STM32F407简介、开发板介绍、仿真器

今天做什么

  1. 阅读第2章,了解 STM32F407 的核心架构
  2. 对照手中的开发板,找出以下硬件位置:
    • 主芯片(STM32F407)
    • LED 指示灯(记录连接的 GPIO 引脚号)
    • 按键(记录连接的 GPIO 引脚号)
    • USB 接口、串口接口
    • ST-Link 仿真器接口(JTAG/SWD)
  3. 将 ST-Link 连接开发板,确认驱动安装正常

通过标准

  • 能在开发板上找到并标注上述所有硬件位置
  • 记录下你的开发板上 LED 连接的具体引脚(如 PF9、PF10)
  • ST-Link 连接后 CubeIDE 能识别到目标设备(Device 显示 STM32F407)
  • 能解释 SWD 和 JTAG 的区别,知道为什么日常用 SWD

Day 3 · 第3章 STM32CubeMX 的使用(上)

对应章节

第3章:安装 CubeMX、安装固件包、软件功能和基本使用(前半)

今天做什么

  1. 跟着书第3章,在 CubeMX 中新建一个 STM32F407 项目
  2. 完成以下 CubeMX 操作练习:
    • 选择芯片型号
    • 配置时钟树(使用外部晶振 HSE,主频设为 168MHz)
    • 配置一个 GPIO 输出引脚(LED 所在引脚,设为 Output)
  3. 生成代码(选择 STM32CubeIDE 格式)

通过标准

  • CubeMX 能成功新建 STM32F407 项目,不报错
  • 时钟树配置完成,HCLK 显示为 168MHz
  • GPIO 引脚在芯片图上显示为绿色(已配置)
  • 点击「Generate Code」后,CubeIDE 中能看到生成的项目文件结构

Day 4 · 第3章 STM32CubeMX(下)+ 第一个 LED 示例

对应章节

第3章:项目示例——LED 初始输出(书中第3.4节)

今天做什么

  1. 完成书中 LED 示例:
    • 在 CubeMX 中配置 LED 引脚
    • 生成代码
    • 在 main.c 的 while 循环中添加 LED 翻转代码:
      HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
      HAL_Delay(500);
  2. 编译、下载到开发板,观察 LED 闪烁
  3. 修改延时参数,验证闪烁频率变化

通过标准

  • 代码编译无错误(Errors: 0)
  • 下载成功,开发板 LED 以约 1 秒为周期闪烁
  • 修改 HAL_Delay(500) 为 HAL_Delay(100),LED 闪烁明显加快
  • 能找到 CubeMX 生成的初始化代码在哪个文件里(MX_GPIO_Init())

Day 5 · 第4章 STM32CubeIDE 的使用(上)

对应章节

第4章:安装 CubeIDE、基本概念、C/C++ 界面功能

今天做什么

  1. 阅读第4章前半部分(4.1–4.3节)
  2. 熟悉 CubeIDE 界面:
    • 找到 Project Explorer、Console、Problems 视图
    • 设置断点(在 HAL_Delay 前打断点),运行调试模式
    • 观察变量值(添加 Watch 表达式)
  3. 练习:在调试模式下,用单步执行观察 LED 引脚状态变化

通过标准

  • 能在 CubeIDE 中设置断点并进入调试模式,不崩溃
  • 单步执行时,能看到程序在断点处暂停
  • 能在 Registers 视图中找到 GPIOF 的 ODR 寄存器,观察到引脚电平变化
  • 知道 Debug 配置和 Release 配置的区别

Day 6 · 第4章 STM32CubeIDE(下)

对应章节

第4章:CubeMX 生成项目的文件组成、HAL 库基本问题(4.4–4.8节)

今天做什么

  1. 阅读 4.4–4.8 节
  2. 分析 CubeMX 生成的项目结构,回答以下问题:
    • main.c 里用户代码应该写在哪些区域(USER CODE BEGIN/END)?
    • stm32f4xx_hal_gpio.c 在哪个目录?
    • 如果重新用 CubeMX 生成代码,用户写的代码会不会被覆盖?
  3. 故意在 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 功能简介和基本使用

今天做什么

  1. 阅读第5章,了解 CubeMonitor 的用途
  2. 安装 STM32CubeMonitor(ST官网免费)
  3. 跟着书中示例,用 CubeMonitor 实时监测一个变量(如 LED 翻转计数器)
  4. 复习第1–5章:用自己的话写一段「STM32Cube 开发流程」说明,包含:建立CubeMX项目 → 配置外设 → 生成代码 → CubeIDE编写用户代码 → 编译下载 → 调试监测

通过标准

  • CubeMonitor 能成功连接开发板并显示变量实时波形
  • 能画出或描述 STM32Cube 完整开发流程图,不遗漏关键步骤
  • 能独立完成「新建项目 → LED 闪烁」全流程,不看书,耗时 < 15 分钟
  • 知道什么时候用 CubeMonitor(实时监测,不需要暂停程序)

✅ 第一部分完成!从明天起进入外设编程核心内容。


第二部分:系统功能和常用外设(第 6–22 章)


Day 8 · 第6章 GPIO 输入/输出(上)

对应章节

第6章:GPIO 功能概述、HAL 驱动程序(6.1–6.2节)

今天做什么

  1. 阅读 6.1–6.2 节,记录以下 HAL 函数的作用和参数:
    • HAL_GPIO_WritePin()
    • HAL_GPIO_ReadPin()
    • HAL_GPIO_TogglePin()
  2. 手写(不复制粘贴)一个程序:读取按键状态,按下时 LED 亮,松开时 LED 灭
  3. 在 CubeMX 中配置按键引脚为 Input,上拉模式

通过标准

  • 能默写 HAL_GPIO_ReadPin() 的函数签名和返回值类型
  • 按键控制 LED 功能正常(硬件验证)
  • 理解 GPIO 输入模式中「上拉」和「下拉」的区别,知道何时用哪个
  • 能解释为什么按键需要消抖(虽然本章暂时不实现)

Day 9 · 第6章 GPIO(下)+ 公共驱动程序

对应章节

第6章:GPIO 使用示例(6.3节)、作为公共驱动程序(6.4节)

今天做什么

  1. 完成书中全部 GPIO 示例(流水灯、按键扫描等)
  2. 学习附录 A:了解书中「公共驱动程序」的目录结构和使用方式
  3. 挑战:不用 HAL_Delay,用计数器方式实现 LED 闪烁(模拟消抖逻辑)

通过标准

  • 书中 GPIO 示例全部在开发板上跑通
  • 理解公共驱动程序的作用,知道如何在新项目中导入
  • 能解释轮询方式的局限性(主循环被阻塞)
  • 软件消抖逻辑能正确过滤按键抖动(连续按 10 次无误触发)

Day 10 · 第7章 中断系统和外部中断(上)

对应章节

第7章:STM32F407 的中断、中断向量表、中断优先级(7.1节)

今天做什么

  1. 阅读 7.1 节,理解中断向量表和优先级分组
  2. 在纸上画出 NVIC 优先级分组的逻辑(抢占优先级 vs 响应优先级)
  3. 在 CubeMX 中查看 NVIC 配置界面,了解优先级分组设置方式
  4. 思考题:如果两个中断同时发生,STM32 如何决定先执行哪个?

通过标准

  • 能解释「抢占优先级」和「响应优先级」的区别
  • 知道 STM32F407 默认的优先级分组是哪种
  • 能在 CubeMX 的 NVIC 界面中正确设置一个外设的中断优先级
  • 回答思考题:优先级数字越小优先级越高,抢占优先级决定是否可打断

Day 11 · 第7章 外部中断(下)

对应章节

第7章:外部中断 EXTI、外部中断示例(7.2–7.3节)

今天做什么

  1. 用外部中断方式重写按键控制 LED 的程序(替代第8-9天的轮询方式):
    • 在 CubeMX 中配置按键引脚为 EXTI 下降沿触发
    • 实现中断回调函数 HAL_GPIO_EXTI_Callback()
  2. 测试中断优先级:添加两个按键中断,验证高优先级能打断低优先级
  3. 对比体验:中断方式 vs 轮询方式,主循环的占用情况

通过标准

  • 外部中断触发 LED 翻转功能正常,主循环可以做其他事情
  • 能找到 CubeMX 生成的中断服务函数在哪个文件(stm32f4xx_it.c)
  • 能解释为什么中断回调函数里不应该执行耗时操作
  • 优先级测试验证正确:高优先级中断能打断正在执行的低优先级中断

Day 12 · 第8章 FSMC 连接 TFT LCD(上)

对应章节

第8章:FSMC 原理、TFT LCD 接口电路(前半)

今天做什么

  1. 阅读第8章前半部分,理解 FSMC 的作用
  2. 在 CubeMX 中配置 FSMC,生成初始化代码
  3. 分析 LCD 驱动程序的结构(书中提供的公共驱动代码)
  4. 如果有 LCD 屏:在屏幕上显示「Hello STM32」

通过标准

  • 能解释 FSMC 是什么,为什么用它连接 LCD 而不是普通 GPIO
  • CubeMX 中 FSMC 配置完成,代码生成无报错
  • 能说出 LCD 驱动中「写命令」和「写数据」的区别(地址线 A 的作用)
  • (有屏幕者)LCD 屏成功点亮,显示文字或颜色

Day 13 · 第8章 TFT LCD(下)

对应章节

第8章:LCD 编程示例,绘图、显示文字等

今天做什么

  1. 完成书中 LCD 所有示例(画点、画线、画矩形、显示字符串)
  2. 自己写一个程序:在 LCD 上显示一个随时间变化的计数器(每秒 +1)
  3. 思考:LCD 刷新频率受什么限制?如何提高

通过标准

  • 书中 LCD 示例全部跑通(或理解代码逻辑,如无屏幕则看懂代码)
  • 计数器程序运行正常,每秒更新一次显示内容
  • 能解释 FSMC 的时序参数(ADDSET、DATAST)对刷新速度的影响
  • 知道 LCD 驱动芯片型号(如 ILI9341),了解其基本命令集

Day 14 · 第9章 DMA(上)

对应章节

第9章:DMA 功能概述、DMA 的 HAL 驱动程序(9.1–9.2节)

今天做什么

  1. 阅读 9.1–9.2 节,理解 DMA 的工作原理
  2. 画图:DMA 传输 vs CPU 搬运数据的对比示意图
  3. 在 CubeMX 中找到 DMA 配置界面,了解:
    • DMA1 和 DMA2 的区别
    • 通道/流的概念
    • 传输方向:内存→外设 / 外设→内存 / 内存→内存

通过标准

  • 能用一句话解释 DMA 的核心价值:「让外设自行搬运数据,CPU 去干别的事」
  • 能说出 STM32F407 有几个 DMA 控制器,各有几个流
  • 理解 DMA 传输完成中断的作用
  • 能解释「循环模式」和「普通模式」的区别

Day 15 · 第9章 DMA(下)

对应章节

第9章:DMA 使用示例(9.3节及后续)

今天做什么

  1. 完成书中 DMA 示例:用 DMA 方式从内存传输数据到另一块内存
  2. 进阶:用 DMA + 串口(USART)发送一段字符串(比较 DMA 方式和轮询方式的 CPU 占用)
  3. 测量:发送 1000 字节时,轮询方式主循环被阻塞的时间 vs DMA 方式

通过标准

  • DMA 内存到内存示例跑通,传输数据正确
  • DMA + USART 发送示例跑通,串口助手收到正确数据
  • 能解释为什么 DMA 传输时 CPU 可以做其他事情
  • 理解 HAL_DMA_Start_IT() 和 HAL_DMA_Start() 的区别

Day 16 · 第10章 定时器基础

对应章节

第10章:STM32F407 的定时器资源、基本定时器使用

今天做什么

  1. 阅读第10章,理清 STM32F407 定时器类型:
    • 基本定时器(TIM6/TIM7)
    • 通用定时器(TIM2–TIM5、TIM9–TIM14)
    • 高级定时器(TIM1/TIM8)
  2. 用定时器中断替代 HAL_Delay() 实现 LED 闪烁(1秒周期)
  3. 计算定时器参数:主频 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 输出功能和示例

今天做什么

  1. 配置通用定时器输出 PWM,控制 LED 亮度(呼吸灯效果):
    • 频率:1kHz
    • 占空比从 0% 到 100% 渐变
  2. 用 __HAL_TIM_SET_COMPARE() 动态修改占空比
  3. 思考:PWM 如何控制电机转速?和控制 LED 亮度的原理一样吗?

通过标准

  • LED 呼吸灯效果正常(亮度平滑渐变,周期约 2 秒)
  • 能解释 PWM 的占空比概念,50% 占空比意味着什么
  • 知道 PWM 的频率如何计算(f = TIM_CLK / (PSC+1) / (ARR+1))
  • 能说出 PWM 在实际项目中的 3 种常见应用

Day 18 · 第10章 定时器进阶(输入捕获)

对应章节

第10章:输入捕获功能和示例

今天做什么

  1. 配置定时器输入捕获,测量外部信号频率(可用另一个定时器产生测试信号)
  2. 完整流程:信号输入 → 捕获上升沿 → 计算两次捕获的时间差 → 得到频率
  3. 验证:被测信号 1kHz,测量结果误差 < 1%

通过标准

  • 输入捕获程序跑通,能正确测量 1kHz 信号
  • 能解释「上升沿捕获」和「下降沿捕获」的区别
  • 理解溢出处理逻辑(被测信号频率很低时,计数器可能溢出)
  • 知道输入捕获在实际项目中的应用(如编码器测速、脉冲宽度测量)

Day 19 · 第11章 RTC 实时时钟

对应章节

第11章:RTC 工作原理、HAL 驱动程序和使用示例

今天做什么

  1. 配置 RTC:使用 LSE 外部低速晶振(32.768kHz)
  2. 设置当前日期时间,在串口每秒打印当前时间
  3. 测试掉电保留:给 VBAT 引脚供电,断开主电源,再上电后时间是否继续走

通过标准

  • RTC 配置成功,串口每秒打印正确时间(格式:YYYY-MM-DD HH:MM:SS)
  • 能解释为什么 RTC 需要独立供电(VBAT)
  • 知道 LSE(外部低速晶振)和 LSI(内部低速振荡器)的精度差异
  • 理解 RTC 的「后备域」机制,断电后时间为何能保持

Day 20 · 第12章 ADC(上)

对应章节

第12章:ADC 工作原理、HAL 驱动程序(前半)

今天做什么

  1. 阅读前半部分,理解 ADC 的基本参数:
    • 分辨率(12位 = 4096级)
    • 采样时间
    • 参考电压
  2. 配置 ADC1,轮询方式读取一个模拟量(可用电位器或内部温度传感器)
  3. 将 ADC 原始值转换为实际电压:V = adc_val * 3.3 / 4095

通过标准

  • ADC 轮询读取正常,串口打印原始值和换算后的电压
  • 旋转电位器时,电压值在 0–3.3V 之间线性变化
  • 能解释 ADC 采样时间对精度的影响(采样时间越长,精度越高)
  • 知道 STM32F407 有几个 ADC,最多支持多少通道

Day 21 · 第12章 ADC(下)+ DMA 连续采样

对应章节

第12章:ADC 使用示例,DMA 连续采样(后半)

今天做什么

  1. 配置 ADC + DMA,连续采集多通道数据(至少 2 个通道)
  2. 对采集到的数据做滑动平均滤波(窗口大小 8)
  3. 在 LCD 或串口上显示滤波后的结果

通过标准

  • DMA 多通道 ADC 采集正常,两个通道数据不混乱
  • 滑动平均滤波后,信号抖动明显减小(肉眼可见)
  • 理解「规则组」和「注入组」的区别
  • 能解释为什么 DMA 方式适合连续 ADC 采集(CPU 零参与数据搬运)

Day 22 · 第13章 USART 串口(上)

对应章节

第13章:USART 工作原理、HAL 驱动程序(前半)

今天做什么

  1. 配置 USART1,波特率 115200
  2. 实现 printf 重定向到串口(重写 fputc 函数)
  3. 用串口助手发数据给开发板,开发板收到后原样回传(Echo)
  4. 测试中断方式接收:HAL_UART_Receive_IT()

通过标准

  • printf("Hello STM32\r\n") 在串口助手中正确显示
  • Echo 功能正常,发什么回什么,无乱码
  • 中断接收方式正常,不会因等待数据而阻塞主循环
  • 理解波特率误差的概念,知道为什么高波特率时需要更精确的时钟

Day 23 · 第13章 USART(下)+ DMA 收发

对应章节

第13章:USART 使用示例,DMA 收发(后半)

今天做什么

  1. 实现 DMA 方式发送大量数据(如 1000 字节)
  2. 实现一个简单的串口命令解析器:
    • 收到「LED ON」→ 点亮 LED
    • 收到「LED OFF」→ 熄灭 LED
    • 收到「STATUS」→ 回复当前 LED 状态
  3. 测试空闲中断(IDLE)方式接收不定长数据

通过标准

  • DMA 发送 1000 字节,串口助手收到完整数据,无丢失
  • 命令解析器正常工作,响应 3 条命令
  • IDLE 中断接收方式正常,能接收任意长度的字符串
  • 能解释 IDLE 中断的触发条件(总线空闲超过 1 个字符时间)

Day 24 · 第14章 SPI 通信(上)

对应章节

第14章:SPI 原理、HAL 驱动程序(前半)

今天做什么

  1. 阅读 SPI 原理,理解 4 根信号线(MOSI/MISO/SCK/CS)
  2. 配置 SPI1,连接一个 SPI 设备(如 W25Q64 Flash 芯片,书中有示例)
  3. 发送读取芯片 ID 的命令,验证通信正常

通过标准

  • SPI 初始化完成,能正确读取外部 Flash 的芯片 ID(如 W25Q64 返回 0xEF4017)
  • 能解释 SPI 的 4 种模式(CPOL/CPHA 组合)
  • 理解 CS(片选)引脚的作用,知道为什么 CS 是主机控制的
  • 能用示波器或逻辑分析仪观察 SPI 时序(如有条件)

Day 25 · 第14章 SPI(下)+ Flash 读写

对应章节

第14章:SPI 使用示例,外部 Flash 读写

今天做什么

  1. 实现 W25Q64 Flash 的完整读写流程:
    • 擦除扇区
    • 写入 256 字节
    • 读出并验证数据
  2. 计算实际读写速度(字节数 / 耗时)
  3. 断电后重新上电,验证 Flash 数据持久保存

通过标准

  • 擦除→写入→读出全流程正常,数据一致(逐字节比对)
  • 断电后上电,数据仍然存在(非易失性验证)
  • 理解 Flash 「写前必须先擦除」的原因
  • 能解释 Flash 最小擦除单位(扇区 4KB)和最小写入单位(页 256B)

Day 26 · 第15章 I2C 通信

对应章节

第15章:I2C 原理、HAL 驱动程序、使用示例

今天做什么

  1. 阅读 I2C 原理,理解开漏输出、上拉电阻、从机地址
  2. 配置 I2C,连接 EEPROM(AT24C02)或其他 I2C 传感器
  3. 实现读写 EEPROM:写入 10 字节,读出验证

通过标准

  • I2C 通信正常,EEPROM 读写数据一致
  • 能解释 I2C 的 7 位地址格式,AT24C02 的地址如何由硬件引脚决定
  • 理解 I2C 的 ACK/NACK 机制
  • 知道 I2C 和 SPI 的典型应用场景区别(I2C 适合低速、多从机;SPI 适合高速)

Day 27 · 第16章 SPI + I2C 综合复习日

今天做什么

综合练习:不看书,独立完成以下任务:

  1. 用 SPI 读取 Flash 的最后一次写入时间(存储为字符串)
  2. 用 I2C 读取温度传感器(或 EEPROM 中存储的模拟温度)
  3. 把两个数据拼成一行,通过串口打印

通过标准

  • 全程不翻书,独立完成,最多查 1 次 HAL 函数参数
  • 程序一次编译通过(Errors: 0)
  • 串口输出格式正确:Flash时间: 2026-04-11 温度: 25.3°C
  • 能解释如果 I2C 通信失败会返回什么错误码(HAL_ERROR / HAL_TIMEOUT)

Day 28 · 第17章 CAN 总线

对应章节

第17章/第18章(不同版本章节号可能不同):CAN 总线通信

今天做什么

  1. 阅读 CAN 总线原理:帧格式、仲裁、过滤器
  2. 配置 CAN1,两个节点互发消息(可用回环模式测试)
  3. 配置过滤器:只接收特定 ID 的消息

通过标准

  • CAN 回环模式测试通过,发送的帧能正确接收
  • 过滤器配置正确,非目标 ID 的消息被过滤掉
  • 能解释 CAN 的「位仲裁」机制(显性位 0 赢得总线)
  • 理解标准帧(11位ID)和扩展帧(29位ID)的区别

Day 29 · 第19章 FSMC 外部 SRAM

对应章节

第19章:FSMC 连接外部 SRAM

今天做什么

  1. 配置 FSMC 连接外部 SRAM(如 IS62WV51216)
  2. 实现读写测试:向 SRAM 写入 1024 字节随机数据,读出并全部验证
  3. 测试 DMA 方式读写 SRAM 的速度

通过标准

  • SRAM 读写测试 1024 字节全部正确
  • 能直接用指针访问 SRAM(uint8_t *p = (uint8_t*)0x68000000)
  • DMA 读写 SRAM 速度 > 轮询方式
  • 能解释外部 SRAM 的地址映射原理(FSMC 的 Bank 划分)

Day 30 · 第20–21章 看门狗

对应章节

第20章:独立看门狗(IWDG) 第21章:窗口看门狗(WWDG)

今天做什么

  1. 配置独立看门狗(IWDG):超时时间 2 秒
    • 正常喂狗:系统稳定运行
    • 故意不喂狗:2秒后系统复位,观察 LED 行为
  2. 配置窗口看门狗(WWDG):
    • 测试在窗口外喂狗(触发复位)
    • 测试在窗口内喂狗(正常运行)

通过标准

  • IWDG 超时复位验证通过(故意不喂狗 2 秒后系统重启)
  • 正常喂狗时系统持续稳定运行 60 秒以上
  • 能解释 IWDG 和 WWDG 的核心区别
  • 理解窗口看门狗的「窗口」概念:太早喂狗和太晚喂狗都会复位
  • 知道在实际项目中,喂狗应该放在哪里(主循环固定位置,而非中断里)

Day 31 · 第22章 电源管理和低功耗(上)

对应章节

第22章:电源系统、低功耗模式概述、睡眠模式

今天做什么

  1. 阅读 22.1–22.3 节
  2. 用 CubeMonitor 的功耗计算器(PCC)分析一个配置下的理论功耗
  3. 实现睡眠模式:
    • 按下按键进入睡眠(HAL_PWR_EnterSLEEPMode())
    • 任意中断唤醒

通过标准

  • 进入睡眠模式后,LED 停止闪烁(主循环停止执行)
  • 按键中断能正确唤醒,LED 恢复闪烁
  • 能解释睡眠模式下哪些模块仍在工作(外设时钟、内存内容保持)
  • CubeMonitor PCC 界面能正常使用,能读懂功耗分析结果

Day 32 · 第22章 低功耗(下)+ 停止/待机模式

对应章节

第22章:停止模式、待机模式(22.4–22.5节)

今天做什么

  1. 实现停止模式:用 RTC 闹钟定时 5 秒后唤醒,唤醒后打印「已唤醒」
  2. 实现待机模式:进入后只有 WKUP 引脚或 RTC 能唤醒
  3. 测量三种低功耗模式的差异(通过串口打印唤醒后的系统状态)

通过标准

  • 停止模式 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 · 代码整理和注释

今天做什么

  1. 为所有关键函数添加注释(功能、参数、返回值)
  2. 把可复用的功能提取为独立函数
  3. 删除调试用的 printf,保留有意义的日志
  4. 检查是否有硬编码的数字(替换为宏定义)

通过标准

  • 每个自定义函数有注释说明其作用
  • 所有魔法数字改为有名称的宏(如 #define LED_PIN GPIO_PIN_9)
  • 代码能让第一次看的人在 10 分钟内理解整体结构
  • 项目能正常编译,功能与整理前一致

Day 39 · 性能测试和优化

今天做什么

  1. 用 CubeIDE 的 SWV(Serial Wire Viewer)功能测量主循环执行时间
  2. 找出耗时最长的操作,尝试优化(如用 DMA 替代轮询)
  3. 测试极端情况:所有中断同时触发时系统是否稳定

通过标准

  • 能用 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 月