9. 项目经验汇总

📌 本节学习目标
  • 了解 STM32 项目开发中的常见问题与解决方案
  • 掌握嵌入式调试技巧和方法
  • 学习提高代码稳定性和可维护性的经验
  • 了解 PCB 设计和硬件调试要点

9.1 常见调试问题

问题现象可能原因解决方法
程序下载失败ST-Link 连接不良 / 供电不足检查接线、重新插拔、检查 Boot 设置
程序跑飞堆栈溢出 / 数组越界 / 中断冲突加大堆栈、检查数组边界、优化优先级
GPIO 输出异常时钟未开启 / 模式配置错误检查 RCC 时钟使能、核对 GPIO 模式
串口数据乱码波特率不匹配 / 时钟不准核对波特率设置、检查晶振频率
定时器不工作预分频系数过大 / 中断未使能检查 PSC/ARR 值、确认 NVIC 配置

9.2 嵌入式调试技巧

软件调试

  • 串口 printf:最常用的调试手段,输出变量值和运行状态
  • GPIO 示波法:用 GPIO 翻转配合示波器测量代码执行时间
  • 断点调试:Keil 的断点 + Watch 窗口观察变量
  • Call Stack:查看函数调用栈,追踪程序执行路径

硬件调试

  • 万用表:测量电源电压、引脚电平、通断
  • 示波器:查看波形质量,测量频率、占空比
  • 逻辑分析仪:分析 I2C、SPI、UART 等数字通信协议

9.3 代码规范建议

推荐代码风格
// 1. 使用有意义的变量名
// ❌ unsigned char a;
// ✅ unsigned char led_status;

// 2. 常量用宏定义或枚举
#define LED_ON  1
#define LED_OFF 0

// 3. 函数模块化
void GPIO_Config(void);    // 配置函数
void delay_ms(uint32_t);   // 功能函数

// 4. 添加必要的注释,解释目的而非代码本身
// "等待数据发送完成" 优于 "while(!TI);"

// 5. 使用头文件分离声明与实现
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
void LED_Toggle(void);
#endif
💡 代码规范为什么重要?
  1. 命名清晰、常量用宏、函数模块化、头文件隔离——这些规范直接决定课设评分「软件设计」项
  2. #ifndef 头文件保护防止重复包含,是多人协作和大工程的底线
  3. 注释解释「目的」而非「语法」(写「等待发送完成」而不是「while(!TI);」),让代码自述

9.4 经验要点汇总

类别经验要点
时钟使用外设前必须先使能对应时钟;APB1(36MHz) vs APB2(72MHz) 不能弄混
GPIO输出用推挽、输入看上下拉需求、ADC 用模拟输入、外设用复用功能
中断中断函数要短小、ISR 中避免延时、注意变量加 volatile
定时器先算好 PSC 和 ARR 再编程;PWM 看 CHx 对应的引脚是否正确
串口确认 USART 在哪个 APB 总线上;波特率由外设时钟和分频共同决定
ADC转换时间要足够;多通道可用 DMA 传输
PCB电源去耦电容要靠近 IC;信号线远离电源线
🎉 恭喜完成全部课程!你已经系统学习了 STM32 嵌入式开发的核心知识。本课程的大课(理论)+ 小课(实验)模式为你打下了扎实的基础。后续建议对照 资源中心 中的开源项目和社区资料继续深入学习。
📎 配套资料课件:9.项目经验汇总.pptx