STM32工作笔记0065---USMART调试组件实验

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152

 

因为STM32中没有这种开发工具,可以直接方便的调试对应的函数,所以

开发了这款工具.

比如说,有个函数要调试,每次都修改以后,然后再下载到开发版,再去调试,非常麻烦,用这个

USMART这个工具,就可以实现,实时的调试,直接发送命令就可以了,方便一些.

USMART的一些特点,这里支持函数执行时间计算,比如这里我们要解析一张图片,我们想知道解析图片花费的时间

就可以通过USMART来获取函数执行的时间.

USMART相关的,一共有上面的一些文件.

不同的开发版,战舰版,精英版,mini版都有上面的这个文件,用来支持USMART的,这个文件夹中就是.

这个USMART用到了定时器这个硬件资源,用这个来进行,统计函数的执行时间.

这里主要的核心文件是usmart.c这个文件,

这个文件中定义了一些函数,来获取串口的一些数据

然后usmart_str.c这个主要用来和串口进行交互的,和外部的一些设备交互.

实际上这个文件就是去分析接收到的命令,去解析接收到的字符串然后去执行.

这里重点看一下这个usmart_config.c这个文件,这个文件中需要配置对应的要让USMART管理的函数,

比如这里配置LCD相关的函数的话,就需要这样配置.

类似于上面这样配置.

然后另外的两个文件,看看就好了.

然后这个USMART.H这个文件中,定义了一些宏定义,都是有用的.

可以看看,

然后来看看如何使用USMART

看看使用步骤:

注意战舰版和精英版和mini版这个USMART的代码都是不一样的.

首先他们使用的定时器就不一样.

然后这里打开LCD显示实验,然后来调试这里面的函数,那么

首先要把USMART实验中的USMART这个文件夹copy过来.

把文件copy过来以后,需要把这几个文件,添加到工程中去,然后

把路径也要添加过去.

首先下面的两个外部函数要注释掉,要不会报错

然后编译 一下工程,没有编译通过,看提示,是因为没有定时器

所以这里要把定时器的库函数要添加进来.

也就是把stm32f10x_tim.c这个文件添加进来.

然后看看如何来初始化这个usmart.

可以看到再usmart.h中有定义的结构体,这个结构体中有个

init这个函数指针,这个就是他的初始化.

然后在main.c中调用这个初始化函数

 这里传入一个时钟

可以看到需要传入一个系统时钟.

这里咱们知道是72,就填写上72了.

当然:

这样也可以,如果这里,不知道系统时钟是多少的话也可以这样写,

这里/1000 000,因为是Mhz单位.

然后引入头文件

然后去配置相应的函数就可以了,这个还是比较简单的.

这里要重点说一下,还可以用另一种方法配置函数.

也就说可以这样:

比如这里,从这里定义一个函数,然后下面

注意这个extern指的是,在别的地方定义的这个函数

然后再main.c中定义这个函数,并且实现这个函数就可以了.

然后再看一下这个USMART有7个系统命令.

这里的7个命令,这个id的意思,就是比如有10个函数,那么每个函数的地址是什么,这里列出了函数的地址.

然后编译这个程序,然后把程序下载到开发版

然后打开xcom来测试一下

比如我发送?就可以获取对应的帮助.

然后这里

发送help,也可以获得帮助,发送list可以获取函数清单,然后发送id可以看到每个函数对应的地址.

注意这里0x08开头的实际上就是flash

比如上图是个flash,那么,里面有个函数段,那么这个地址就是这个函数段的起始地址.

比如这里输入runtime 1,这个意思就是打开计时功能.

runtime 0就是就是关闭计时功能.

然后咱们来说一下,这个执行函数命令.

说之前,先看一下这个USMART的执行过程.

这里比如说,中间是MCU,那么左边是连接的串口,那么通过左边的串口,连接过来的命令,

先会把命令,放到这个串口有个buf,把命令放到这个buf以后,然后这个时候定时器开启定时,并且

接收命令后会产生中断,然后,中断以后就会,在中断函数中去执行,对应命令的函数,执行以后,如果

runtime 1的话,就返回花费的时间.

这里通过USMART执行的时候,实际上对应的命令是在定时器的中断执行的,这样比如有个状态通过

IO口设置为1了,那么执行以后,IO口的状态还是1,那么比如如果我执行一个命令要在屏幕上画一个圆圈,

那么每次画之前会刷屏,那么当程序第二次执行的时候会刷屏,这个时候屏幕之前画的圈就没有了,需要理解这个

USMART的工作原理,后面出现了现象就能想通了,是不是正确就能明白了.

这里测试一下.

把这里延时3秒,然后编译程序,下载程序到开发版.

这里比如我们要调用一下这个画圆的函数,那么

Draw_Circle(100,100,100)
前两个参数是圆心,后一个参数是半径.

点击发送以后,可以看到有个圆圈的.

当然下次刷屏的时候,

圆圈就自然消失了.

然后

再来执行一个LED_SET函数,

注意执行这个函数的时候,如果参数设置为0,那么LED就亮了.

led_set(1)的时候,led就灭了.

然后如果,之前设置了runtime 1的话,那么也就是设置了这里开启函数执行计时的话.

那么

执行函数以后就可以看到,下面有个执行的时间是2.9ms

这个就是runtime 1的功能.

猜你喜欢

转载自blog.csdn.net/lidew521/article/details/108338099