Keil uVision5+Proteus STM32 开发仿真调试一条龙服务
- 2021-6-6
- 嵌入式
调试技巧
Source Code Debugging (源码联调)
首先 Keil 端,输出二进制文件格式选择 elf
格式,而不是 hex
或者 axf
(axf
其实就是 elf
格式,但是后缀名不一样),因为 elf
格式的二进制文件是带有调试信息的,包含C代码和编译后的汇编代码的映射。这样我们可以直接在更具有可读性的 C 代码上打断点和调试,而不是直接怼汇编代码。
生成好 elf 文件后,我们打开 Proteus 双击 CMU 导入 elf 文件。点击 Start VSM Debugging
可以直接在 C 代码中打断点单步调试。在进入调试模式后,点击菜单栏 Debug
按钮,弹出的列表最下面几项会显示原理图中主要元件的调试选项,如 CM3 -> Source Code - U1
可以进入源代码调试、CM3 -> Registers - U1
可以查看 Cortex-M3 处理器的各个寄存器的状态、SSD1306 LCD Controller RAM - LCD
可以查看 LCD 控制器 SSD1306 内存状态。
Design Explorer
画好原理图后,如果不确定连线是不是都连接上了,可以打开 Design Explorer
视图查看元件各个端口的网络标号 (Net),以此判断是否已连接上。
Probes (探针)
其次,我们可以使用 Proteus 提供的 Probes (探针) 元件 (在左侧工具栏中可以找到),给待测试的线路标上电压探针会电流探针来方便我们判断电路状态。
Terminal Voltages & Terminal Logic States
除了使用探针,在 Proteus 进入单步调试后,我们可以点击各个元件,此时会显示该元件的各个端口电压 (Terminal Voltages) 和各个端口逻辑状态 (Terminal Logic States),也可以方便我们调试。
其中,Proteus 逻辑状态表如下:
逻辑状态 | 说明 | 数字逻辑 |
---|---|---|
FLT | 悬空态,高阻态 | - |
WUD | 未定义态,与模拟电压混联 | - |
CON | 竞争态,与数字电压冲突 | - |
SHI | 主动输出高逻辑 | 1 |
SLO | 强电低态,主动输出低逻辑 | 0 |
PHI | 电源高态,电源高逻辑 | 1 |
PLO | 电源低态,电源低逻辑 | 0 |
WHI | 弱电高态,被动输出高逻辑 | 1 |
WLO | 弱电低态,被动输出低逻辑 | 0 |
(非常好用) Diagnostics Configuration
Proteus 还提供一个杀手级的功能,Configure Diagnostics
可以在 Debug
菜单列表中找到或选中元件后右键菜单中找到。通过这个功能,我们可以配置各个元件在日志中输出各种事件,比如我们需要查看 UG-2864HSWEG01 (LCD, SSD1306 Controller included)
关于 Contoller Diagnostics
的 Trace Information
,我们可以把这个 Diagnostics 的 Trace Information Level
改成 Debug
级别。这样我们就可以根据这些事件有没有发生,来判断我们的代码有没有生效。
如通过下面这条日志,我们可以知道 SSD1306 此时使用的是 8080 并行接口的连接方式:
Animation Circuits Configuration
进入 System -> Set Animation Options
,Proteus 默认只启用了显示引脚的逻辑状态动画,进入该项设置页后,我们可以把:
- Show Voltage & Current on Probes 在探针上显示电压和电流
- Show Logic State of Pins 在引脚上显示逻辑状态 (默认开启)
- Show Wire Voltage by Color 用颜色标注导线的电压
- Show Wire Current With Arrows 在导线上标注电流的方向
这些设置项全部开启,这些动画信息可以有效地帮助我们进行调试。
问题排查思路
如果使用了上诉调试技巧还是找不到问题所在,但是日志中显示 proteus simulation is not running in real time due to excessive cpu load
警告,提示你 由于 CPU 超负荷了 Proteus 的仿真不能实时进行。这个警告⚠️很有可能是导致仿真失败、无法复现在真实硬件上的效果的真正原因,建议解决方案如下:
- 调低 CMU 的晶振频率,如
STM32F103RCT6
的实际晶振频率为 72M,你可以根据你电脑性能的实际情况调整至 比如 1M。双击 CMU 后在Crystal Frequency
输入框中填写 1M 即可 - Proteus 进入
System -> Set Simulation Options
调低仿真精度,但是作用其实有限 - 打开
任务管理器
,选中Proteus
进程右键转置详细信息
,选中进程PDS.EXE
右键设置设置优先级实时
。这样可以让该进程可以分到更多的 CPU 计算资源,但是作用有限 - 换一台高性能的设备 /狗头