0%

如何优雅地进行单片机调试

需求

在我们早期调试里,通常用一个如Jlink或者STLink调试器就可以完成功能调试。但是后期比如说要进行参数调节(PID)或者单片机想要报告数据给上位机就有些麻烦,主要遇到的问题是

  • 写死参数的话,改参数再烧录程序费时费力
  • 目前所有的有线调试器都不可能在机器人快速运动的时候调试,最好是有无线的方案
  • 我们没有合适的工具连续采集机器人的数据,包括静止的和运动

可选方案

以前调参数的方法是插着有线调试器在Keil里面开Watch修改变量,显然这样的方法能用但不可靠。于是在网上找了一圈后,解决方案无非以下两种:

  • 串口采集:这种办法看上去是最可靠了,并且买一个无线串口模块就可以解决刚才运动中采集数据的问题,唯一的不足是,我们需要耗费更多精力自己写一个调试工具并且维护它。

  • 调试器采集:原理是和Keil的Watch一样,通过调试器直接访问单片机内存实时读取变量数据。这种办法不是十分流行,但比起串口我认为更加通用。这种办法不用修改原来的代码,调试器读取不会耗费单片机过多的资源,并且很轻易就可以做到高采样率。

    至于无线的问题,在某宝上有无线调试器卖,所以这也不是问题

调试器采集非常依赖于上位机的工具,以下是我能找到在STM32上用的:

  • STM32CubeMonitor

    ST家的调试工具,只要你用的是STLink就是真香。波形和读写变量都可以配置,并且支持网络远程访问,采样率算是比较高的。而且可以提供了大量后续数据处理方法。

  • Jscope

    Jlink家的调试工具,也只有Jlink能用,而且据说某些型号可以做到10kHz以上的采样率,具体的我没有用过

  • STM Studio

    算是CubeMonitor的前身,感觉是ST为了对标Jscope做的,也是只支持STLink,如果仅仅是一般采集数据的话基本也够用了

  • Freemaster

    Freemaster原本是NXP的调试工具,由于通用性太强(各种常用调试器的插件都有,包括CMSIS-DAP也就是无线调试器的接口,当然肯定没有STLink)导致本来只能调试NXP芯片的工具竟然可以调试STM32。而且让我最喜欢的一点是,一旦我配置好了各种变量和面板,以后调大量参数基本上不用再修改配置,非常舒服。

  • 自己编写

    实际上根据网上的开源,只要我有CMSIS-DAP的驱动我就可以自己编写上位机,不过就跟串口一样麻烦就是了。当然中间可以套一个OpenOCD解决不同调试器之间的兼容问题。

由于无线调试器的接口是CMSIS-DAP的,这几个工具能实用的也就Freemaster一个,并且目前看来这种可以配置的调参面板+波形显示的界面对于调参数相当好用,虽然采样速度最高也就大概1kHz不如Jscope,但是对于机器人上大部分信号而言已经足够了(再高频就可以上示波器了,逃)