02 调试与常见问题
1 ⭐️先确认程序走到了哪里
“灯不亮”和“程序没运行”不是同一个问题。我们可以在main入口、外设初始化之后、主循环三个位置设置断点,先确认停在哪一步,再去查电路。
| 现象 | 检查顺序 |
|---|---|
| ST-Link找不到芯片 | 板上3.3 V → 共地 → SWDIO/PA13与SWCLK/PA14 → 下载接口选SWD |
| 程序下载后不运行 | 复位 → main断点 → 看看程序停留在哪里 |
| 重新生成代码后功能消失 | 用户代码是否放在USER CODE区域,在生成代码前是否保存 |
| 一进中断就不再返回 | 中断源是否真的在工作、中断是否使能 |
2 ➡️volatile解决什么
我们在实验中通常通过设立标志位的方式,也就是通过一个简单的变量
- 中断会修改、主循环会读取的简单标志
- 内核有时会将变量缓存到内核里,当再次用到这个变量的时候,内核就不用去
RAM里面读 - 为了不让内核偷懒,真真实实地去访问RAM里地变量,通常应声明为
volatile
3 看波形,才知道外设有没有工作
GPIO先用万用表测静态电平;定时器、UART、IIC用示波器或逻辑分析仪看时序。仪器与开发板共地,先确认电压量程。
- PWM:量周期和高电平时间,分别对应频率和占空比;
- UART:确认空闲为高、波特率和数据帧格式,再看字节;
- IIC:看空闲高电平、START、地址和第9位ACK;
- ADC:先接一个已知直流电压,再接复杂传感器;