keil利用debug和数组获取稳定调试数据

title: keil的debug小技巧

date: 2020-07-21 19:28:12

tags:

categories: STM32学习记录


背景

调robomaster的6020电机时,需要把pid的数据导出来进行matlab仿真,那么问题就来了,该怎么导出呢,我当时立刻想到的方法是用串口打印数据,利用sprintf把pid的输入输出转成字符串,然后HAL_UART_Transmit()阻塞发送,在定时器中进行pid的计算以及数据的发送,但是效果却不尽人意。

因为电机是通过can总线协议,获取的是电压信息,-30000~30000范围,返回的数据是转速,角度,转矩和温度,调速度环,要看从精致到稳定的输入输出曲线,所以需要打印速度的pid三个信息,再来一个当前速度更加直观。但是,经过调试发现,频率过低,不能很好的与仿真的拟合曲线进行比较,而频率过高,串口发送会出现断层和乱码的情况。这时我就想到一个办法,那就是把数据保存在数组里,然后在线仿真,利用MDK的debug的功能,实现对数组内存的方便的访问。

这个方法不在于有多方便操作,而在于能够非常高频率的获取一些数据,而不会有通信问题而失去一些数据,或者因为系统外干扰而出现大量异常数据。

操作流程

废话不多说,开始走流程。首先保证你的keil版本至少是5以上,低版本的keil操作我不太清楚。
为了防止爆栈,把用于存数据的大数组放在函数外:

int16_t buff[10000]={0};	//int16_t取决于你的数据类型,这里也可以是包含多种信息结构体
uint32_t rxtx_p1 = 0; 		//uint32_t取决于你的数组大小,比如8位的uint8_t就只能计数到255

在循环或者中断中获取需要的数据并保存在这个数组中,比如我就交替保存速度和pid控制器输出:

buff[rxtx_p1] = velocity;
rxtx_p1++;
buff[rxtx_p1] = output;
rxtx_p1++;

然后进入仿真,注意是连接硬件的在线仿真 ,不是虚拟仿真哟,选择J-link或者 ST-link进行仿真:
keil利用debug和数组获取稳定调试数据_第1张图片
进入仿真界面后应该是下面这样,你的可能跟我的不一样,一般默认是不打开command和watchwindows视图的,在这里需要开启相应的视图,我们点击总菜单的view开启这两个视图:
keil利用debug和数组获取稳定调试数据_第2张图片
然后在watchwindows中输入你定/义的存入数据的数组首地址,其实就z是数组名,我这里填buff,就出现了这个数组的具体数据,因为我开始初始化的是{0},所以在开始仿真前数组元素都应该是0:
keil利用debug和数组获取稳定调试数据_第3张图片
然后开始仿真,不要设置断点,就让程序正常跑起来,不出意外的话,定义的数组会慢慢被填满,当数组都存入数据后,或者你认为数据足够多了,停止运行,就可以看到数组内存入了你想要的数据,在我这里是pid的比例项和控制器输出:
keil利用debug和数组获取稳定调试数据_第4张图片
之后就是想办法导出着一些数据了,利用KEIL自己的debug命令行和编译器,打开菜单栏debug中的Function Editor:
keil利用debug和数组获取稳定调试数据_第5张图片
然后新建一个文件,它是空的,然后输入下面的代码:

FUNC void displayvalues(void) {
  int idx;
 
  exec("log > MyValues.log");
  for (idx = 0; idx < 2000; idx++) {					//2000是你的数组长度,这种方法最多导出2000个,后面自动省略了
    printf ("testarray[%d] = %u\n", idx, buff[idx]);	//buff改成你自己的数组名
  }
  exec("log off");
}

然后保存,保存你知道的地方,通常是工程目录或者KEIL的安装目录,然后打开它,点击编译,注意是这个Function Editor上面的编译,不是退出仿真去编译代码哦。
keil利用debug和数组获取稳定调试数据_第6张图片
然后在command命令行输入这个函数:
keil利用debug和数组获取稳定调试数据_第7张图片
然后回车,就发现这一串数组就全部打印到命令行窗口了,直接选择复制就OK了。
keil利用debug和数组获取稳定调试数据_第8张图片

你可能感兴趣的:(STM32学习)