生态系统

Cube概览 STM32CubeMonitor STM32CubeIDE STM32CubeMX STM32CubeProg

STM32CubeMonitor 介绍(二)

例程二:实时波形检测




STM32CubeMonitor介绍(一)

STM32CubeMonitor介绍(三)



在第一个例程中,我们了解了CubeMonitor的基本用法,包括如何监测/修改变量,如何导入/保存流文件,如何使用debug节点等。


接下来我们通过第二个例程来理解direct和snapshot这两种不同的采样模式,并学习更多的节点的使用。



这个例程的MCU要完成的工作就是通过GPIO口输出一个PWM波,而我们将用CubeMonitor来实时监控这个PWM波,并且可以调节PWM波的频率和占空比。


在这一部分,我们将学习以下内容:

1.直接读写寄存器

2.对读出的变量值进行后处理

3.添加switch节点过滤输出到chart节点的变量

4.在dashboard中添加文字显示框

5.如何使用snapshot模式进行采样

6.如何保存波形




PWM波输出



可以通过CubeMX来初始化MCU输出PWM波,上图是例程中使用的配置,如果你使用的是其他的开发板则根据实际使用的定时器和GPIO口进行配置。



在CubeMX生成的初始化工程代码里面,还需要添加启动PWM波输出的代码,见上图。





变量节点配置



CubeMonitor部分,我们在第一个例程的基础上进行修改。首先先来修改myVariables变量节点的配置。


这次我们要监测的是PB14引脚输出的PWM波以及PWM波的周期和占空比寄存器配置。而当GPIO口输出PWM波的时候,从它的输入数据寄存器中,可以读到当前的高低电平值,所以这里要输入的监测变量是三个寄存器。


先删除之前添加的变量,再按照图中的步骤修改myVariables变量组,逐个添加要监控的变量地址:

 添加变量PB14,地址为GPIOB_IDR寄存器的地址0x48000410

 添加变量Period,地址为TIM15_ARR寄存器的地址0x4001402C

 添加变量Duty,地址为TIM15_CCR1寄存器的地址0x40014034




我们还要在程序运行的过程中实时修改PWM波的频率和占空比,也就是TIMER15的自动重载寄存器的值和捕获/比较寄存器的值。所以在myWriteVariables变量节点中,删除之前添加的变量,再修改myWriteVariables变量组,按照图中步骤添加这两个寄存器的地址。


 添加变量Period,地址为TIM15_ARR寄存器的地址0x4001402C

 添加变量Duty,地址为TIM15_CCR1寄存器的地址0x40014034





因为PB14这个变量读出来的是Port B端口所有引脚的状态,而我们只想监测PB14这一个引脚的状态,就需要在PB14这个变量中将bit14的值提取出来。在processing节点中,利用post-processing功能,将变量PB14右移14位,其结果定义为一个新的变量PWM1,这个就是我们最终要监测的PWM波的输出。




变量输出配置




现在Processing节点一共有4组变量输出,但我们只想在最终的点线图上输出PWM1一路变量的实时值。这时就可以利用switch节点来对processing节点的输出进行过滤了。如图在processing节点和chart节点之间添加一个switch节点。在switch节点中配置过滤条件:只有payload的variablename等于PWM1的消息才输出。







对于processing节点输出中的Period和Duty这两个变量,我们希望在dashboard上显示它们当前的值,所以需要再添加两个”text”文字框节点。文字框节点的输入只需要变量的值,不需要时间戳值。Processing节点输出的消息结构不满足文字框节点的要求,所以我们还需要用”single value”子流程来进行处理,输出单个的数值到文字框节点。在“single value”子流程的配置中指定要输出的变量名就可以了。“single value”子流程实际是由多个节点组成,在编辑窗口点击”编辑流程模板“就可以看到。在CubeMonitor里面,你也可以编辑自己的子流程来实现特定的功能。 





调整dashboard的布局如图所示。





重新部署运行。






在Dashboard,点击START按键启动采样。这时就可以看到实时显示的PWM波和自动重载寄存器以及捕获/比较寄存器所配置的值。


在输入框中,可以实时修改自动重载寄存器以及捕获/比较寄存器的值来改变PWM波的周期和占空比。





snapshot


前面采样使用的是direct模式,这种模式下每次采样由PC触发,受PC上其他程序的影响,采样的时间间隔可能会不均匀,有延时。而snapshot模式,是通过运行在MCU的代码进行采样,可以通过定时器中断来保证采样的精确性。采样数据先保存在MCU的内存,再由 CubeMonitor 读出。但snapshot模式需要添加特定的代码到用户程序,这段特定的代码已经包含在CubeMonitor 的安装包中。snapshot模式下的采样频率由调用采样函数的频率决定,但建议不要超过1KHz。



STM32CubeMonitor安装包中有一个snapshot_embedded_SW.zip文件,里面包含了使用snapshot模式时需要用到的MCU代码。


使用snapshot模式时,需要对用户工程做以下修改:

1.将该压缩文件中的C文件和头文件拷贝到用户工程路径下,并将其中的acqTrigger.c和dataAcq.c文件添加到用户工程。

2.在代码中调用DumpTrace函数进行采样,可用timer中断设置需要的采样频率。

3.根据实际设置的采样频率,修改dataAcq.c中的SNP_TRC_TIMESTAMP_BASE_UNIT,SNP_TRC_TIMESTAMP_VALUE和SNP_TRC_BUFFER_SIZE等参数。代码默认每次最多可以采集10个32位的变量。如果需要采集更多的变量,可以调整SNP_TRC_NB_MAX_WORD_VAR的值。

snapshot代码大约需要使用3KB的Flash, 使用SRAM的大小跟采样频率和采样的变量个数有关。





在该例程中,我们使用TIM16产生定时中断,来调用采样函数Dumptrace。TIM16的初始化代码可以通过CubeMX生成。具体配置见上图。





然后手动添加启动TIM16的代码,TIM16中断的回调函数以及在主循环中调用采样函数的代码。




在CubeMonitor上需要做的配置如下:

1.因为snapshot模式下,CubeMonitor需要知道g_traceHeader变量的起始地址,所以需要在variables节点中导入添加了snapshot代码后的可执行文件。这样当选择了snapshot模式后,CubeMonitor就会自动从其中提取出该变量的起始地址。

2.在variables变量节点的配置中,选择snapshot变量采集模式。





我们还可以利用processing节点中的log功能,将采集的波形数据保存到本地文件。而后在Dashboard中可以随时导入log文件,在图表中显示波形。


这里还有一个小小的诀窍可以在snapshot模式下提高采样频率。在snapshot模式下关闭实时图形显示功能(断开processing节点与chart节点的连接),只开启log功能记录采集的数据。数据采集结束后再在dashboard的chart中导入log文件进行显示。实验下来,采用这种方式使用ST-LINK v2可以到2KHz的采样速度,使用ST-LINK v3可以到4KHz的采样速度。但需要注意的是,当使用超过1KHz的采样速度时,CubeMonitor的点线图中显示的每次采样的时间间隔还是由SNP_TRC_TIMESTAMP_BASE_UNIT 和SNP_TRC_TIMESTAMP_VALUE这两个宏定义决定,最小的时间间隔是1ms,所以这时波形图上显示的时间值是不对的。两个采样点之间的实际时间间隔应根据设定的采样频率计算。





分别在direct模式和snapshot模式下对同样的PWM波进行采样,从采样结果可以看到,direct模式下每次采样由电脑触发,但受PC端运行的其他程序的影响,每次采样的时间间隔不确定,会有延时。snapshot模式下由运行在MCU上的代码进行采样,可以做到很精确。所以如果对采样的精度有要求,建议使用snapshot模式。