USMART概述
USMRT是正点原子开发的一种类似linux的shell的调试工具,具体的过程是通过串口发送命令给单片机,然后单片机收到命令之后调用单片机里面对应的相关函数,并执行,同时支持返回结果。
USMART应用场景
开发过程中经常需要修改函数入口函数,查看运行效果的情况下应用非常方便。不用多次下载代码,或者多次使用JLINK调试。
USMART特点
1, 可以调用绝大部分用户直接编写的函数。
2, 资源占用极少(最少情况:FLASH:4K;SRAM:72B)。
3, 支持参数类型多(数字(包含 10/16 进制)、字符串、函数指针等)。
4, 支持函数返回值显示。
5, 支持参数及返回值格式设置。
6, 支持函数执行时间计算(V3.1 版本新特性)。
7, 使用方便。
用USMART的主要优点是轻易的修改函数参数、查看函数运行结果,从而快速分析解决问题,只需要在串口调试助手里面输入函数及参数,然后直接串口发送给单片机,就执行了一次参数调整,修改参数直到得到满意值,不需要编译下载,延长单片机寿命。
USMART配置步骤
将USMART包添加到工程中,头文件要包含到path
添加需要调用的函数到usmart_config.c文件中(也就是注册函数)
主函数中调用usmart_dev.init函数初始化usmart
即可通过助手发送命令,调用usmart注册过的函数
USMART文件组(调用即可)
USMART函数介绍
USMART函数结构体
//usmart控制管理器
struct _m_usmart_dev
{
struct _m_usmart_nametab *funs; //函数名指针
void (*init)(u8); //初始化
u8 (*cmd_rec)(u8*str); //识别函数名及参数
void (*exe)(void); //执行
void (*scan)(void); //扫描
u8 fnum; //函数数量
u8 pnum; //参数数量
u8 id; //函数id
u8 sptype; //参数显示类型(非字符串参数):0,10进制;1,16进制;
u16 parmtype; //参数的类型
u8 plentbl[MAX_PARM]; //每个参数的长度暂存表
u8 parm[PARM_LEN]; //函数的参数
u8 runtimeflag; //0,不统计函数执行时间;1,统计函数执行时间,注意:此功能必须在USMART_ENTIMX_SCAN使能的时候,才有用
u32 runtime; //运行时间,单位:0.1ms,最大延时时间为定时器CNT值的2倍*0.1ms
};
//函数控制管理器初始化
//得到各个受控函数的名字
//得到函数总数量
struct _m_usmart_dev usmart_dev=
{
usmart_nametab,
usmart_init,
usmart_cmd_rec,
usmart_exe,
usmart_scan,
sizeof(usmart_nametab)/sizeof(struct _m_usmart_nametab),//函数数量
0, //参数数量
0, //函数ID
1, //参数显示类型,0,10进制;1,16进制
0, //参数类型.bitx:,0,数字;1,字符串
0, //每个参数的长度暂存表,需要MAX_PARM个0初始化
0, //函数的参数,需要PARM_LEN个0初始化
};
usamrt初始化
usmart_dev.init(84); //初始化USMART 直接调用结构体
usmart注册函数
//函数名列表初始化(用户自己添加)
//用户直接在这里输入要执行的函数名及其查找串
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*)LCD_Fast_DrawPoint,"void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)",
(void*)LCD_ReadPoint,"u16 LCD_ReadPoint(u16 x,u16 y)",
(void*)LCD_Display_Dir,"void LCD_Display_Dir(u8 dir)",
(void*)LCD_ShowxNum,"void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode)",
(void*)led_set,"void led_set(u8 sta)",
(void*)test_fun,"void test_fun(void(*ledset)(u8),u8 sta)",
};
格式是(void*)函数,“void 函数(参数)”,
按照程序编写格式输入函数名及参数并以回车键结束
USMART系统命令
1,?:获取帮助信息
2,help:获取帮助信息
3,list: 可用的函数列表
4,id:可用函数的ID列表
5,hex:参数16进制显示,后跟空格+数字即执行进制转换
6,dec:参数10进制显示,后跟空格+数字即执行进制转换
7,runtime:1,开启函数运行计时;0,关闭函数运行计时
在串口助手里面发送就可以用了
ps: 发送函数,是在定时器中断里面执行的。