您现在的位置是:首页 >技术杂谈 >【正点原子STM32连载】 第二十六章 USMART调试组件实验摘自【正点原子】STM32F103 战舰开发指南V1.2网站首页技术杂谈
【正点原子STM32连载】 第二十六章 USMART调试组件实验摘自【正点原子】STM32F103 战舰开发指南V1.2
1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html
第二十六章 USMART调试组件实验
本章,我们将向大家介绍一个十分重要的辅助调试工具:USMART调试组件。该组件由正点原子开发提供,功能类似linux的shell(RTT的finsh也属于此类)。USMART最主要的功能就是通过串口调用单片机里面的函数,并执行,对我们调试代码是很有帮助的。
本章分为如下几个小节:
26.1 USMART调试组件简介
26.2 硬件设计
26.3 程序设计
26.4 下载验证
26.1 USMART调试组件简介
USMART是由正点原子开发的一个灵巧的串口调试互交组件,通过它你可以通过串口助手调用程序里面的任何函数,并执行。因此,你可以随意更改函数的输入参数(支持数字(10/16进制,支持负数)、字符串、函数入口地址等作为参数),单个函数最多支持10个输入参数,并支持函数返回值显示,目前最新版本为V3.5。
USMART的特点如下:
1,可以调用绝大部分用户直接编写的函数。
2,资源占用极少(最少情况:FLASH:4K;SRAM:72B)。
3,支持参数类型多(数字(包含10/16进制,支持负数)、字符串、函数指针等)。
4,支持函数返回值显示。
5,支持参数及返回值格式设置。
6,支持函数执行时间计算(V3.1及以后的版本新特性)。
7,使用方便。
有了USMART,你可以轻易的修改函数参数、查看函数运行结果,从而快速解决问题。比如你调试一个摄像头模块,需要修改其中的几个参数来得到最佳的效果,普通的做法:写函数修改参数下载看结果不满意修改参数下载看结果不满意….不停的循环,直到满意为止。这样做很麻烦不说,单片机也是有寿命的啊,老这样不停的刷,很折寿的。而利用USMART,则只需要在串口调试助手里面输入函数及参数,然后直接串口发送给单片机,就执行了一次参数调整,不满意的话,你在串口调试助手修改参数在发送就可以了,直到你满意为止。这样,修改参数十分方便,不需要编译、不需要下载、不会让单片机折寿。
USMART支持的参数类型基本满足任何调试了,支持的类型有:10或者16进制数字、字符串指针(如果该参数是用作参数返回的话,可能会有问题!)、函数指针等。因此绝大部分函数,可以直接被USMART调用,对于不能直接调用的,你只需要重写一个函数,把影响调用的参数去掉即可,这个重写后的函数,即可以被USMART调用了。
USMART的实现流程简单概括就是:第一步,添加需要调用的函数(在usmart_config.c里面的usmart_nametab数组里面添加);第二步,初始化串口;第三步,初始化USMART(通过usmart_init函数实现);第四步,轮询usmart_scan函数,处理串口数据。
接下来我们看下USMART的组成,USMART组件总共包含8个文件,如图26.1.1.所示:
图26.1.1 USMART组件代码
USMART每个文件的作用如表26.1.1所示:
表26.1.1 USMART文件介绍
经过以上简单介绍,我们对USMART有了个大概了解,接下来我们将在下一小节给大家介绍USMART组件的移植和使用。
26.2 硬件设计
- 例程功能
本实验通过usmart调用单片机里面的函数,实现对LCD显示和LED以及延时的控制。LED0闪烁用于提示程序正在运行。 - 硬件资源
1)LED灯
LED0 – PB5
LED1 – PE5
1)串口1(PA9/PA10连接在板载USB转串口芯片CH340上面)
2)定时器4
3)正点原子2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
26.3 程序设计
26.3.1 程序流程图
图26.3.1.1 USMART调试组件实验程序流程图
26.3.2 程序解析
- USMART驱动代码
要使用USMART,我们先得进行代码移植,USMART的移植非常简单,我们只需要修改usmart_port.c里面的5个函数即可完成移植。
第一个函数,USMART输入数据流获取函数,该函数的实现代码如下:
/**
* @brief 获取输入数据流(字符串)
* @note USMART通过解析该函数返回的字符串以获取函数名及参数等信息
* @param 无
* @retval
* @arg 0, 没有接收到数据
* @arg 其他,数据流首地址(不能是0)
*/
char *usmart_get_input_string(void)
{
uint8_t len;
char *pbuf = 0;
if (g_usart_rx_sta & 0x8000) /* 串口接收完成? */
{
len = g_usart_rx_sta & 0x3fff; /* 得到此次接收到的数据长度 */
g_usart_rx_buf[len] = '