使用STM32做机器人相关的应用,很经常遇到的一个情况就是希望能够实时的观察单片机中的变量,从而更直观的判断数据或算法的正确性,例如使用STM32+IMU做小车或四轴飞行器的姿态估计。
一个被广泛使用的方法是利用串口:串口数据输出到PC->在PC端接收或存储数据->进一步的数据处理及可视化。你还可以利用JLink的RTT功能把数据输出到PC,从而避免额外配置和占用STM32的一个串口,更进一步你可以直接使用JScope绘制曲线。部分商业IDE也支持类似的功能,这里就不一一列举。
STM32CubeMonitor简介
上面提到的方法都有各自的局限性,使用串口通用性很好但是串口传输数据会占用CPU资源,编写上位机绘制曲线往往也耗时耗力,而商业IDE和JLink严格意义上说并不是免费的,那么有没有免费而且好用的选择呢?ST前不久刚刚发布了一个系列的STM32CubeMonitor程序,针对的正是这一使用场景,这个系列由以下几个软件组成[1]:
STM32CMonPwr: Graphical tool displaying on PC power data coming from X-NUCLEO-LPM01A
STM32CMonRF: Software tool to test the RF performance of STM32-based hardware devices
STM32CMonUCPD: Monitoring and configuration software tool for STM32 USB-C and Power Delivery 3.0 applications
STM32CubeMon-Lin/Mac/Win: STM32CubeMonitor runtime variable monitoring and visualization tool on Linux for STM32 products
其中前三个针对X-Nucelo-LPM01A,RF设备和USB-C Power Delivery这三类特殊应用,后面的STM32CubeMon则提供了相对通用的变量观测和计算功能,而且支持Linux, Mac和Windows三个平台。这篇应用笔记简要的介绍STM32CubeMon的使用方法。
STM32CubeMonitor有以下功能和特点:
使用SWD/JTAG接口获取数据,无须配置额外通讯接口
允许在单片机程序运行的同时进行数据检测,对单片机应用程序的实时性影响很小
除了基本的数据绘图,还允许对数据做函数运算、存储、网络传输等等
使用图形化的编程方法完成所有功能,在达到根据具体应用自定义上位机这个目的的同时尽可能简化了上位机开发的繁琐过程
STM32CubeMonitor基本使用
我们通过一个简单的程序介绍STM32CubeMonitor的基本用法。假设我们在单片机的main()函数里运行这么一段程序:
float var;
// 其他函数及变量
int main(void)
{
// 初始化函数
// 用户算法
uint32_t cnt = 0;
for (;;) {
var = 100 * sin(cnt++ / 150.0 * M_PI);
delay(20);
}
}
可以看到这个程序就是简单的进行正弦函数计算,假设这是我们在调试的“复杂”算法,而我们希望观察变量var的变化过程。
使用STM32CubeMonitor自带的模板可以很方便的构建以下示例程序:
很容易看出来,这个程序由上下两部分组成:
上面的四个blocks用于获取数据
下面的四个blocks用于处理数据
上半部分的前两个浅青色模块相当于两个按钮,START Acquisition用于启动数据获取过程,另一个STOP Acquision用于停止数据获取。中间的蓝色模块用于配置我们想要监控的程序变量,双击该模块你可以看到以下配置:
你要做的主要就是指定你在单片机上运行的可执行文件(xxx.elf),STM32CubeMonitor会自动分析该可执行文件中可监控的变量,你只需要选中你想要观察的变量即可。实际上这些变量是通过访问地址指定的,例如你有一个变量uint32_t myvar[3],而自动分析出来的变量列表里可能只列出了my_var[0],那么你只需要手动添加my_var[1]和my_var[2]并且在my_var[0]地址的基础上分别偏移4个byte和8个byte即可。
上半部分的最后一个block则是用于配置调试器,作为ST生态的一部分,STM32CubeMonitor只支持STLink。在这里我用的是ST-Link V3。
至此数据获取的配置就完成了。
下半部的四个blocks则是在获取的数据的基础上进行加工和处理。myProbein模块实质上跟上半部分的myProbe_out是同一个东西,都是利用ST-Link读取单片机的变量值:
在这里更多是从功能逻辑的角度考虑把二者割裂为in和out两部分了,你只需要从下拉列表里选中你使用的stlink即可。接下来我们就可以从myProbe_in里“拿”数据了。在Group Name一栏里选中你在上面的stm32cube_monitor模块里定义的变量组名称,你能看到var会在下面的Outputs里列出来。
最后你可以在myChart模块里选择将数据绘成曲线。这里我用了默认的Line chart。剩下的最后一个Clear Graph模块从名字就可以看出来是用来把曲线图表里的内容清空。
这样经过以上步骤一个简单的监控程序就完成了,你只需要点击右上角的deploy按钮然后通过dashboard就可以看到你刚刚配置的图表。在图标界面里记得点START ACQUISITION,你就可以看到曲线了。
以上例子是结合官方的basic模板所得到的一个最最基础的例子。在STM32CubeMonitor的左侧你还可以找到很多其他的功能模块,只要按照上面的思路就可以很方便的“拖拽”出你需要的上位机监控程序。 |