技术交流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的功能.