0%

STM32CubeMonitor使用

关于STM32CubeMonitor

STM32CubeMonitor主页

CubeMonitor帮助文档

采集数据并显示波形

打开后官方提供了一个Basic Flow给我们使用,通过Deploy后打开Dashboard可以看到我们流程生成的程序

img

在使用前需要修改myVariables(variable节点)的二进制文件及其变量。双击myVariables,在窗口中选中“添加新的exe-config节点”,点右侧的编辑

img

在新的窗口中输入自定的名称,编译后axf文件所在路径以及文件名称,加载二进制文件后会显示其中的全局静态变量,在右下角可以搜索。在想要显示的变量前面打勾即可

img

点添加后再点击完成,即完成变量设置。另外还需要指定调试器,在myProbe_Out和myProbe_In(两个Probe节点)上选择对应的调试器,如果没有的话在下拉列表里选“添加新的Probe节点”,选择调试器。

img

接下来点Deploy再打开Dashboard即可启动程序,按下Start Acquisition可开始采集数据

img

在线修改变量值

img

如图,在原来的Basic Flow的基础上添加红色框内方块并连线,variable节点(红框内左一)按照之前读取变量设置的办法,再新建一个变量组用于写入,变量的选择即为想要写入的变量。probe节点(红框内右一)也设置为当前用的调试器。部署之后打开,如下图所示

img

如图,勾选变量并在框内输入值,点击Write即可在线写入变量值

导出数据

方法一:如图,添加两个Single value节点和file节点(由于有两组数据),Single value节点的varfilter设置为文字列,框内写对应的变量名。

img

img

file节点需要写输出的文件名,可以为相对路径或者绝对路径。相对路径的情况下最后文件会保存在CubeMonitor程序的目录下。另外需要修改行为为“追加至文件”

img

启动后点Start Acquisition,数据就会写入对应的文件中。这个方法虽然能够导出数据,但是从数据数量上来看采样频率明显变低。即使在没有记录对应时间戳的情况下也可以得出数据丢失的结论。为了解决这个问题,需要用方法二。

方法二:在输出数据的processing节点的设置中将Log option改为Log all values,启动程序并采集数据。

img

%USERPROFILE%/log 路径下会生成.stcm文件,这些为图表的数据来源。在主界面中点下方的Import Data可以导入上一次采集的记录,查看对应的波形

img

但是这些数据是以json格式储存的,为了后续处理方便要将其转为csv。编写一个Python脚本可实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import json,csv
import sys,os
import glob


def stcm2csv(filename):
timestamp=[]
dict_data={}
f = open(filename,'r')

for line in f.readlines():
j=json.loads(line)
if not dict_data.has_key(j["variablename"]):
dict_data[j["variablename"]]=[]
var_data=j["variabledata"]
for i in range(len(var_data)):
if len(timestamp)==0 or var_data[i]["x"] > timestamp[-1]:
timestamp.append(var_data[i]["x"])
dict_data[j["variablename"]].append(var_data[i]["y"])

f.close()

for i in range(len(dict_data.values())-1):
assert(len(dict_data.values()[i])==len(dict_data.values()[i+1]))

csvfilename = filename.replace(".stcm","")+".csv"
f = open(csvfilename,'w')
writer = csv.writer(f)

header = dict_data.keys()
header.insert(0,"timestamp")
writer.writerow(header)

length = len(timestamp)

for i in range(length):
single_line=[timestamp[i]]
for array in dict_data.values():
single_line.append(array[i])
writer.writerow(single_line)

f.close()
avg=(timestamp[-1]-timestamp[0])/len(timestamp)
print("total %d record in file:%s,delta_time=%d,avg_sample_time=%dms" %(len(timestamp),filename,timestamp[-1]-timestamp[0],avg))
return csvfilename
pass

def find_step_response(filename,input_col,output_col):
THRESHOLD=30
MAX_SILCE_SIZE=200

step_start=[]
export_num=1

if not os.path.exists(".\\step_responses"):
os.mkdir(".\\step_responses")

f=open(filename,'r')
csv_data=list(csv.reader(f))
for i in range(1,len(csv_data)-1):
current_val=float(csv_data[i][input_col])
next_val=float(csv_data[i+1][input_col])
if (next_val-current_val) > THRESHOLD:
f_out=open(".\\step_responses\\"+ str(export_num)+"_"+filename,'w')
writer = csv.writer(f_out)
writer.writerow(["input","output"])
for j in range(1,MAX_SILCE_SIZE+1):
#for j in range(0,MAX_SILCE_SIZE):
if csv_data[i+j][input_col]==csv_data[i+j+1][input_col] or j==0:
writer.writerow([csv_data[i+j][input_col],csv_data[i+j][output_col]])
else:
break
export_num+=1
f_out.close()
step_start.append(i)
f.close()
return step_start
pass

if __name__ == '__main__':
INPUT_COL=3
OUTPUT_COL=4

if len(sys.argv)==2:
stcm2csv(str(sys.argv[1]))
else:
all_file_list=glob.glob("*.stcm")
if len(all_file_list)!=0:
for file in all_file_list:
stcm2csv(file)


脚本有两种用法,在参数中指定文件则转换该文件,不指定则将当前目录下的所有stcm文件转换为csv