USMART 调试组件实验

article/2025/8/30 1:18:58

文章目录

  • 前言
  • 一、USMART调试组件简介
    • USMART组件的移植
  • 二、硬件设计
  • 三、软件设计


前言

本章,我们将向大家介绍一个十分重要的辅助调试工具:USMART 调试组件。该组件由
ALIENTEK 开发提供,功能类似 linux 的 shell(RTT 的 finsh 也属于此类)。USMART 最主要的功能就是通过串口调用单片机里面的函数,并执行,对我们调试代码是很有帮助的。本章分为如下几个部分:
1 USMART 调试组件简介
2 硬件设计
3 软件设计
4 下载验证


一、USMART调试组件简介

USMART 是由 ALIENTEK 开发的一个灵巧的串口调试互交组件,通过它你可以通过串口助手调用程序里面的任何函数,并执行。因此,你可以随意更改函数的输入参数(支持数字(10/16进制)、字符串、函数入口地址等作为参数),单个函数最多支持 10 个输入参数,并支持函数返回值显示 USMART 的特点如下:
1, 可以调用绝大部分用户直接编写的函数;
2, 资源占用极少(最少情况:FLASH:4K;SRAM:72B);
3, 支持参数类型多(数字(包含 10/16 进制)、字符串、函数指针等);
4, 支持函数返回值显示;
5, 支持参数及返回值格式设置;
6, 支持函数执行时间计算;
7, 使用方便。

有了 USMART,你可以轻易的修改函数参数、查看函数运行结果,从而快速分析解决问题。比如你调试一个摄像头模块,需要修改其中的几个参数来得到最佳的效果,普通的做法:写函数→修改参数→下载→看结果→不满意→修改参数→下载→看结果→不满意….不停的循环,直到满意为止。这样做很麻烦不说,单片机也是有寿命的啊,老这样不停的刷,很折寿的。
如果利用 USMART,则只需要在串口调试助手里面输入函数及参数,然后直接串口发送给单片机,就执行了一次参数调整,不满意的话,你在串口调试助手修改参数在发送就可以了,直到你满意为止。这样,修改参数十分方便,不需要编译、不需要下载、不会让单片机折寿。
USMART 支持的参数类型基本满足任何调试了,支持的类型有:10 或者 16 进制数字、字符串指针、函数指针等。因此绝大部分函数,可以直接被 USMART 调用,对于不能直接调用的,你只需要重写一个函数,把影响调用的参数去掉即可,这个重写后的函数,即可以被 USMART 调用了。
USMART 的实现流程简单概括就是:第一步,添加需要调用的函数(在 smart_config.c 里面的 usmart_nametab 数组里面添加);第二步,初始化串口;第三步,初始化 USMART(通过usmart_init 函数实现);第四步,轮询 usmart_scan 函数,处理串口数据。

经过以上简单介绍,我们对 USMART 有了个大概了解,接下来我们来简单介绍下
USMART 组件的移植。

USMART组件的移植

USMART 组件总共包含 6 文件如图所示:
在这里插入图片描述
其中 redeme.txt 是一个说明文件,不参与编译。
其他五个文件,usmart.c 负责与外部互交等。
usmat_str.c 主要负责命令和参数解析。usmart_config.c 主要由用户添加需要由 usmart 管理的函数。
usmart.h 和 usmart_str.h 是两个头文件,其中 usmart.h 里面含有几个用户配置宏定义,可以用来配置 usmart 的功能及总参数长度(直接和 SRAM 占用挂钩)、是否使能定时器扫描、是否使用读写函数等。

USMART 的移植,只需要实现 5 个函数。其中 4 个函数都在 usmart.c 里面,另外一个是串口接收函数,必须由用户自己实现,用于接收串口发送过来的数据。

第一个函数,串口接收函数。该函数,我们是通过 SYSTEM 文件夹默认的串口接收来实现的,该函数在 5.3.1 节有介绍过,我们这里就不列出来了。SYSTEM文件夹里面的串口接收函数,最大可以一次接收 200 字节,用于从串口接收函数名和参数等。

第二个是 void usmart_init(void)函数,该函数的实现代码如下:

//初始化串口控制器
//sysclk:系统时钟(Mhz)
void usmart_init(u8 sysclk)
{
#if USMART_ENTIMX_SCAN==1
Timer4_Init(1000,(u32)sysclk*100-1);//分频,时钟为 10K ,100ms 中断一次
//注意,计数频率必须为 10Khz,以和 runtime 的单位(0.1ms)同步.
#endif
usmart_dev.sptype=1;  //十六进制显示参数
}

该函数有一个参数 sysclk,就是用于定时器初始化。另外 USMART_ENTIMX_SCAN 是在usmart.h 里面定义的一个是否使能定时器中断扫描的宏定义。如果为 1,就初始化定时器中断,并在中断里面调用 usmart_scan 函数。如果为 0,那么需要用户需要自行间隔一定时间(100ms左右为宜)调用一次 usmart_scan 函数,以实现串口数据处理。注意:如果要使用函数执行时间 统计功能( 指令:runtime 1),则必须设置 USMART_ENTIMX_SCAN 为1。 另外,为了让到 统计时间精确到 0.1ms ,定时器的计数时钟频率必须设置为10Khz ,否则时间就不是 0.1ms 了。
第三和第四个函数仅用于服务 USMART 的函数执行时间统计功能(串口指令:runtime 1),分别是:usmart_reset_runtime 和 usmart_get_runtime,这两个函数代码如下:

//复位 runtime
//需要根据所移植到的 MCU 的定时器参数进行修改
void usmart_reset_runtime(void)
{
TIM4->SR&=~(1<<0); //清除中断标志位
TIM4->ARR=0XFFFF; //将重装载值设置到最大
TIM4->CNT=0;  //清空定时器的 CNT
usmart_dev.runtime=0;
}
//获得 runtime 时间
//返回值:执行时间,单位:0.1ms,最大延时时间为定时器 CNT 值的 2 倍*0.1ms
//需要根据所移植到的 MCU 的定时器参数进行修改
u32 usmart_get_runtime(void)
{
if(TIM4->SR&0X0001)//在运行期间,产生了定时器溢出
{
usmart_dev.runtime+=0XFFFF;
}
usmart_dev.runtime+=TIM4->CNT;
return usmart_dev.runtime;  //返回计数值
}

这里我们还是利用定时器 4 来做执行时间计算,usmart_reset_runtime 函数在每次 USMART调用函数之前执行,清除计数器,然后在函数执行完之后,调用 usmart_get_runtime 获取整个函数的运行时间。由于 usmart 调用的函数,都是在中断里面执行的,所以我们不太方便再用定时器的中断功能来实现定时器溢出统计,因此,USMART 的函数执行时间统计功能,最多可以统计定时器溢出 1 次的时间,对 STM32 来说,定时器是 16 位的,最大计数是 65535,而由于我们定时器设置的是 0.1ms 一个计时周期(10Khz),所以最长计时时间是:65535 * 2 * 0.1ms=13.1秒。也就是说,如果函数执行时间超过 13.1 秒,那么计时将不准确。最后一个是 usmart_scan 函数,该函数用于执行 usmart 扫描,该函数需要得到两个参量,第一个是从串口接收到的数组(USART_RX_BUF),第二个是串口接收状态(USART_RX_STA)。
接收状态包括接收到的数组大小,以及接收是否完成。该函数代码如下:

//usmart 扫描函数
//通过调用该函数,实现 usmart 的各个控制.该函数需要每隔一定时间被调用一次
//以及时执行从串口发过来的各个函数.
//本函数可以在中断里面调用,从而实现自动管理.
//非 ALIENTEK 开发板用户,则 USART_RX_STA 和 USART_RX_BUF[]需要用户自己实现
void usmart_scan(void)
{
u8 sta,len;
if(USART_RX_STA&0x8000)//串口接收完成?
{ 
len=USART_RX_STA&0x3fff;  //得到此次接收到的数据长度
USART_RX_BUF[len]='\0'; //在末尾加入结束符.
sta=usmart_dev.cmd_rec(USART_RX_BUF);//得到函数各个信息
if(sta==0)usmart_dev.exe();//执行函数
else
{
len=usmart_sys_cmd_exe(USART_RX_BUF);
if(len!=USMART_FUNCERR)sta=len;
if(sta)
{
switch(sta)
{
case USMART_FUNCERR:
printf("函数错误!\r\n");
break; 
case USMART_PARMERR:
printf("参数错误!\r\n");
break; 
case USMART_PARMOVER:
printf("参数太多!\r\n");
break; 
case USMART_NOFUNCFIND:
printf("未找到匹配的函数!\r\n");
break; 
}
}
}
USART_RX_STA=0;//状态寄存器清空 
}
}

该函数的执行过程:先判断串口接收是否完成(USART_RX_STA 的最高位是否为 1),如果完成,则取得串口接收到的数据长度(USART_RX_STA 的低 14 位),并在末尾增加结束符,再执行解析,解析完之后清空接收标记(USART_RX_STA 置零)。如果没执行完成,则直接跳过,不进行任何处理。
完成这几个函数的移植,你就可以使用 USMART 了。不过,需要注意的是,usmart 同外部的互交,一般是通过 usmart_dev 结构体实现,所以 usmart_init 和 usmart_scan 的调用分别是通过:usmart_dev.init 和 usmart_dev.scan 实现的。
下面我们会移植USMART,并通过USMART调用一些TFTLCD的内部函数,让大家初步了解 USMART 的使用。

二、硬件设计

本实验用到的硬件资源有:
1) 指示灯 DS0 和 DS1
2) 串口
3) TFTLCD 模块

三、软件设计

打开上一章的工程,复制 USMART 文件夹(该文件夹可以在:光盘→标准例程-库函数版本→实验 12 USMART 调试组件实验 里面找到)到本工程文件夹下面,如图所示:

在这里插入图片描述

图中的 keilkill.bat,是一个批处理文件,双击,可以删除 MDK 编译过程中产生的中间文件,从而大大减少整个工程所占用的空间,节省硬盘空间,方便传输。
接着,我们打开工程,并新建 USMART 组,添加 USMART 组件代码,同时把 USMART文件夹添加到头文件包含路径,在主函数里面加入 include“usmart.h”
在这里插入图片描述

由于 USMART 默认提供了 STM32 的 TIM4 中断初始化设置代码,我们只需要在 usmart.h里面设置 USMART_ENTIMX_SCAN 为 1,即可完成 TIM4 的设置,通过 TIM4 的中断服务函数,调用 usmart_dev.scan()(就是 usmart_scan 函数),实现 usmart 的扫描。此部分代码就不列出来了,请参考 usmart.c。

此时,我们就可以使用 USMART 了,不过在主程序里面还得执行 usmart 的初始化,另外还需要针对你自己想要被 USMART 调用的函数在 usmart_config.c 里面进行添加。下面先介绍如何添加自己想要被 USMART 调用的函数,打开 usmart_config.c:

在这里插入图片描述

这里的添加函数很简单,只要把函数所在头文件添加进来,并把函数名按上图所示的方式增加即可,默认我们添加了两个函数:delay_ms 和 delay_us。另外,read_addr 和 write_addr 属于 usmart 自带的函数,用于读写指定地址的数据,通过配置 USMART_USE_WRFUNS,可以使能或者禁止这两个函数。
这里我们根据自己的需要按上图的格式添加其他函数,添加完之后如图所示:
在这里插入图片描述

上图中,我们添加了 lcd.h,并添加了很多 LCD 相关函数,注意,图中左侧有很多 MDK
动态语法检测的警告标志,我们不需要理会,这个编译完全是没有任何问题的。
最后我们还添加了 led_set 和 test_fun 两个函数,这两个函数在 test.c 里面实现,代码如下:

//LED 状态设置函数
void led_set(u8 sta)
{
LED1=sta;
}
//函数参数调用测试函数
void test_fun(void(*ledset)(u8),u8 sta)
{
ledset(sta);
}

led_set 函数,用于设置 LED1 的状态,而第二个函数 test_fun 则是测试 USMART 对函数参数的支持的,test_fun 的第一个参数是函数,在 USMART 里面也是可以被调用的。
在添加完函数之后,我们修改 main 函数,如下:

int main(void)
{ 
delay_init(); //延时函数初始化 
uart_init(9600);  //串口初始化为 9600
LED_Init();  //初始化与 LED 连接的硬件接口
LCD_Init();  //初始化 LCD usmart_dev.init(72); //初始化 USMART
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Mini STM32 ^_^"); 
LCD_ShowString(30,70,200,16,16,"USMART TEST"); 
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2022/4/16");
while(1)
{ 
LED0=!LED0; 
delay_ms(500); 
} 
} 

此代码显示简单的信息后,就是在死循环等待串口数据。至此,整个 usmart 的移植就完成了。编译成功后,就可以下载程序到开发板,开始 USMART 的体验。



http://chatgpt.dhexx.cn/article/dpVfshfb.shtml

相关文章

USMART串口调试

目录 一、USMART简介二、USMART的移植2.1 usmart_str.h头文件2.2 usmart.h头文件2.3 usmat_str.c源文件2.4 usmart.c源文件2.5 usmart_config.c源文件 三、USMART的实现3.1 USMART的实现流程3.2 USMART的调用 一、USMART简介 USMART是由ALIENTEK开发的一个灵巧的串口调试互交组…

USMART

USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具。具体工作过程是通过串口发送命令给单片机,然后单片机收到命令之后调用单片机里面对应的相关函数,并执行,同时支持返回结果。 普通的做法&#xff1a;写函数 ->修改参数->下载->看结果-&…

USMART调试组件

什么是USMART? USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具。具体工作过程是通过串口发送命令给单片机,然后单片机收到命令之后调用单片机里面对应的相关函数,并执行,同时支持返回结果。 USMART调试过程:&#xff1a; USMART应用场景&#x…

2021-07-13 Charles破解

Charles破解码&#xff1a;https://play.golang.org/p/Qtt2CmHbTzU 使用方法&#xff1a;浏览器打开运行代码&#xff0c;复制name和key即可 注&#xff1a;如有侵权请联系删除&#xff01;

charles破解历程

题记 看文章看到javassist可以直接修改java字节码&#xff0c;之前没有尝试过&#xff0c;因为charles是用java写的跨平台抓包工具&#xff0c;之前我也用过&#xff0c;所以拿来进行测试&#xff01; 简介 Javassist是一个开源的分析、编辑和创建Java字节码的类库。 Javas…

Charles4.62破解版本下载

第一种方式&#xff1a; 这种方式下载后&#xff0c;还要自己输入许可证 链接 提取码&#xff1a;2vb0 添用激活码计算器生成激活码 点击这个&#xff0c;把刚才创建的名字和许可证输入进去即可 然后关闭软件&#xff0c;重新打开即可 第二种方式&#xff1a; https://ww…

charles破解 mac

下载charles并安装 https://www.charlesproxy.com/latest-release/download.do 下载charles破解包charles.jar https://www.zzzmode.com/mytools/charles/ 然后用下载的charles.jar替换原先的charles即可 文件路径/contents/java/charles.jar

charles破解https请求

当你的app包从http升级到https的时候&#xff0c;是不是忽然间发现你的请求抓不到了呢&#xff1f;别担心&#xff0c;只是因为你们的app加密升级了&#xff0c;但是我们还是可以正常破解的。接下来直接谈破解步骤啦&#xff1a; 1&#xff1a;首先打开charles,在其主tab栏点击…

Charles破解方法

// Charles Proxy License // 适用于Charles任意版本的注册码&#xff0c;谁还会想要使用破解版呢。 // Charles 4.2目前是最新版&#xff0c;可用。 Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4 本方法通杀charlse系列激活问题。 破解方式&#…

mac抓包工具charles破解版安装及简单使用

在windows上一般使用fiddler进行抓包&#xff0c;但是在mac上就显得很僵硬&#xff0c;所以通过查阅资料&#xff0c;总算安装并且配置好了同样强大的charles&#xff0c;遂在此总结。 首先附上破解版的下载地址 链接:https://pan.baidu.com/s/1yHH-958uLiuXvQbdvGegOQ 密码:y…

Charles破解三十分钟重启

使用charles的用户应该都知道&#xff0c;这个charles是一款收费软件&#xff0c;启动时得等待十秒&#xff0c;然后每过半个小时还会重启&#xff0c;真难受 下面时解决的方法&#xff0c;这个方法不是原厂&#xff0c;指示本人了解到的&#xff0c;一切与本人无关哦&#xf…

MAC安装Charles破解版简易教程

Charles&#xff1a;青花瓷抓包工具。 官网下载&#xff1a;https://www.charlesproxy.com/download/&#xff08;可惜限制了30天的使用期限&#xff09; 破解版下载&#xff1a;https://download.csdn.net/download/fifteen718/10774499 破解版安装方式&#xff1a; 通过上…

MAC Charles 抓包工具安装以及使用方法(带破解)

1.Charles客户端下载&#xff1a; 官网地址&#xff1a;https://www.charlesproxy.com/download/ 选择适合自己的系统版本下载 2.下载安装完成后激活 激活网站地址&#xff1a;https://www.zzzmode.com/mytools/charles/ 打开安装好的Charles&#xff0c;菜单栏 Help->Re…

抓包工具Charles —— 破解、抓包入门

2019独角兽企业重金招聘Python工程师标准>>> Charles工具官网&#xff1a;https://www.charlesproxy.com/ Charles工具下载地址&#xff1a;https://www.charlesproxy.com/download/ Charles破解包下载地址&#xff1a;http://pan.baidu.com/s/1boV4w2r 密码:kqtj 一…

一招破解抓包工具Charles,并进行移动APP抓包分析

一、简介 Charles是目前最强大最流行的http抓包调试工具&#xff0c;Mac、Unix、Windows各个平台都支持。特别是做APP开发&#xff0c;调试与服务端的通信&#xff0c;Charles是必备工具。 目前Charles是收费的&#xff0c;不过可以破解。 1.Charles下载地址&#xff1a; ht…

charles 抓包软件 安装、使用

记录一下charles的简单使用 安装 charles 官网下载&#xff0c;点击跳转到官网下载地址 我使用的是v4.6.3 windows版 破解 链接: 点击跳转到破解页面 在charles里面点击 HELP —>REGISTER 输入名称和生成的密钥即可 安装证书&#xff08;用于抓取https请求&#xff0…

Charles的破解以及Charles乱码问题处理

一. 简介及安装 一、charles的使用 1.1 charles的说明 Charles其实是一款代理服务器&#xff0c;通过过将自己设置成系统&#xff08;电脑或者浏览器&#xff09;的网络访问代理服务器&#xff0c;然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的&#xff0…

串级调节系统参数整定方法(串级调节器参数整定)

串级调节系统参数整定方法&#xff08;串级调节器参数整定&#xff09; 两步法整定串级调节系统PID参数一步整定法整定串级调节系统PID参数 串级控制系统由单回路PID调节器(作为主调节器)和外给定调节器(作为副调节器)彼此串接组成双回路调节系统&#xff0c;主调节器的控制输出…

基于Simulink的Ziegler-Nichols PID参数经验整定法

Ziegler-Nichols整定法适用对象为带纯延迟的一阶惯性环节&#xff0c;即G(s)K*e^(-τs)/(Ts1) 其中&#xff0c;K为比例系数&#xff1b;T为惯性时间常数&#xff1b;τ为纯延迟时间常数。 当被控对象的单位阶跃响应曲线看起来近似一条S形曲线时&#xff0c;可用Ziegler-Nicho…