Keil uVision5+Proteus STM32 开发仿真调试一条龙服务

Keil uVision5+Proteus STM32 开发仿真调试一条龙服务

调试技巧

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 DiagnosticsTrace 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 计算资源,但是作用有限
  • 换一台高性能的设备 /狗头