USMAR是一个调试工具。
一。USMART调试组件的基本过程
     USMART 是由 ALIENTEK 开发的一个灵巧的串口调试互交组件,通过它你可以通过串口助手调用程序里面的任何函数,并执行。

1. 什么是USMART
USMART调试组件的实验
        通过串口调试助手给单片机发送命令,单片机收到命令后调用相应的函数,这样可以加快程序的调试进度,更加方便。
    如果没有USMART调试工具,我们在开发板上调试某一个函数,有可能会测试很多次,一般的方式是用Jlink调试,比较麻烦,如果通过串口让开发板执行命令,可以加快开发进度。

USMART调试组件的实验
USMART调试工具的应用场景:
比如要调试某一个函数,这个函数有入口参数,如果需要设置不同的入口参数来调试,就需要频繁去下载执行,
而用USMART调试工具调试的话就很方便。

2. USMART的特点
比如在原有工程上添加了USMART调试工具,然后把需要调试的函数注册到USMART里面,大部分函数都支持。

USMART调试组件的实验

3. USMART的文件组
一共有6个文件,在任意一个开发板都有一个USMART调试实验,里面都有USMART文件夹。
USMART调试组件的实验


USMART调试组件的实验
要使用USMART要用到串口,还有定时器,这里用定时器可以统计函数的执行时间,还要去扫描接收到的数据,然后分析出来去执行,战舰版用到的是定时器3.

需要用USMART调试的函数需要在usmart_config.c中注册。

例:
//函数名列表初始化(用户自己添加)
//用户直接在这里输入要执行的函数名及其查找串
struct _m_usmart_nametab usmart_nametab[]=
{
#if USMART_USE_WRFUNS==1 //如果使能了读写操作
(void*)read_addr,"u32 read_addr(u32 addr)",
(void*)write_addr,"void write_addr(u32 addr,u32 val)",  
#endif
(void*)delay_ms,"void delay_ms(u16 nms)",   //需要调试的函数在这里注册
(void*)delay_us,"void delay_us(u32 nus)",
(void*)LCD_Clear,"void LCD_Clear(u16 Color)",
(void*)LCD_Fill,"void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)",
(void*)LCD_DrawLine,"void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)",
(void*)LCD_DrawRectangle,"void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)",
(void*)LCD_Draw_Circle,"void Draw_Circle(u16 x0,u16 y0,u8 r)",
(void*)LCD_ShowNum,"void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)",
(void*)LCD_ShowString,"void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)",
(void*)led_set,"void led_set(u8 sta)",
(void*)test_fun,"void test_fun(void(*ledset)(u8),u8 sta)",      
(void*)LCD_ReadPoint,"u16 LCD_ReadPoint(u16 x,u16 y)",
};   

二。USMART的配置
USMART调试组件的实验
注:各种不同的平台用的USMART包不同,比如战舰版不能用到Mini版上。

以LCD实验为例:
1. 复制USMART文件夹到LCD实验中。
2.打开LCD工程,在Groups中新建一个USMART分组,然后把USMART中的3个.c文件添加进来,并加入头文件的路径到工程的path。
USMART调试组件的实验

3. 注册要调试的函数
注意要把原来里面有2个外部声明注释掉已经声明的2个函数。
4. main()函数中对USMART进行初始化
现在编译不通过。

因为USMART中用到了定时器,所以要把定时器的库函数添加到工程中。

添加进来后进行编译通过。
初始化USMART
usmart_dev.init(72);    //入口参数是系统时钟。init函数放在了usmart_dev结构体中,这里调用结构体就是调用                                       了init函数指针

在main()函数中要包含USMART的头文件。#include "usmart.h"

4. 然后在usmart_config.c中注册要调用的函数

例如:
(void*)LCD_Clear,"void LCD_Clear(u16 Color)",
注意注册时书写的格式。
用到哪个函数要把该函数所在的头文件包含进来。

三。 USMART调试工具的使用方法

USMART调试组件的实验
runtime使用时后面没有冒号
runtime 1   //开启计时
runtime 0   //关闭计时


三。USMART调试实验
打开串口助手,注意波特率为115200,勾选“发送新行”

1. 发送?获得帮助信息
USMART调试组件的实验

2. 发送list列出可用的函数清单
USMART调试组件的实验

在串口调试助手中输入函数,观察现象。
可以通过串口调试助手调试函数,不必每次重新刷写新的程序到单片机中,非常方便。

USMART的工作原理
单片机通过串口接收命令,把命令存在一个buffer数组中,然后开启一个定时器计时,每隔很小的时间在定时器中断服务函数中去检测收到的字符串,然后根据命令去调用相应的函数,所以整个程序的执行过程最终是定时器在中断里面去检测收到的数据,然后去执行相应的函数。在函数执行完成后定时器的中断也结束了,程序又恢复到执行中断之前的地方。
所以USMART发送命令给单片机去执行某个函数实际上是在定时器中断里面去执行,比如要设置某个IO口的状态,设置为1,函数执行后IO口为1,如果在主程序中不停的刷屏,而如果你通过命令在屏幕上画一个圆圈,命令执行完后,也就是定时器中断执行完成后又恢复到之前的程序,因为是不停的刷屏,所以你会发现命令是画一个圆圈,等到下一次刷屏的时候液晶屏的显示数据又变了,这个圆圈就消失了。

实验
发送Draw_Circle(100,100,100)指令
USMART调试组件的实验
USMART调试组件的实验

注意:因为主函数是在不停的刷屏,所以下一次刷屏圆圈就消失了。

相关文章:

  • 2022-12-23
  • 2021-05-26
  • 2021-11-27
  • 2021-07-17
  • 2021-11-12
  • 2021-11-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-07-31
  • 2021-11-14
  • 2021-10-17
  • 2021-09-03
  • 2021-04-09
  • 2021-10-24
  • 2021-07-29
相关资源
相似解决方案