打印
[STM32F4]

【正点原子探索者STM32F407开发板例程】第19章USMART调试组件实

[复制链接]
3436|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangyang86|  楼主 | 2014-12-16 18:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第十九章 USMART调试组件实验
实验14 USMART实验.zip (541.62 KB)



1.硬件平台:正点原子探索者STM32F407开发板2.软件平台:MDK5.13.固件库版本:V1.4.0


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

19.1 USMART调试组件简介
USMART是由ALIENTEK开发的一个灵巧的串口调试互交组件,通过它你可以通过串口助手调用程序里面的任何函数,并执行。因此,你可以随意更改函数的输入参数(支持数字(10/16进制,支持负数)、字符串、函数入口地址等作为参数),单个函数最多支持10个输入参数,并支持函数返回值显示,目前最新版本为V3.2。
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组件的移植。
USMART组件总共包含6文件如图19.1.1所示:



图19.1.1 USMART组件代码
       其中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字节,用于从串口接收函数名和参数等。大家如果在其他平台移植,请参考SYSTEM文件夹串口接收的实现方式进行移植。
第二个是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)
{
       TIM_ClearFlag(TIM4,TIM_FLAG_Update);//清除中断标志位
       TIM_SetAutoreload(TIM4,0XFFFF);//将重装载值设置到最大
       TIM_SetCounter(TIM4,0);           //清空定时器的CNT
       usmart_dev.runtime=0;
} //获得runtime时间
//返回值:执行时间,单位:0.1ms,最大延时时间为定时器CNT值的2倍*0.1ms
//需要根据所移植到的MCU的定时器参数进行修改
u32 usmart_get_runtime(void)
{
if(TIM_GetFlagStatus(TIM4,TIM_FLAG_Update)==SET)//在运行期间,产生了定时器溢出
       {
              usmart_dev.runtime+=0XFFFF;
       }
       usmart_dev.runtime+=TIM_GetCounter(TIM4);
       return usmart_dev.runtime;           //返回计数值
}
这里我们利用定时器4来做执行时间计算,usmart_reset_runtime函数在每次USMART调用函数之前执行,清除计数器,然后在函数执行完之后,调用usmart_get_runtime获取整个函数的运行时间。由于usmart调用的函数,都是在中断里面执行的,所以我们不太方便再用定时器的中断功能来实现定时器溢出统计,因此,USMART的函数执行时间统计功能,最多可以统计定时器溢出1次的时间,对STM32F4的定时器4,该定时器是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的使用。

19.2 硬件设计
本实验用到的硬件资源有:
1)  指示灯DS0和DS1
2)  串口
3)  TFTLCD模块
这三个硬件在前面章节均有介绍,本章不再介绍。
19.3 软件设计
此部分代码请下载附件学习

实验详细手册和源码下载地址:http://www.openedv.com/posts/list/41586.htm


正点原子探索者STM32F407开发板购买地址:http://item.taobao.com/item.htm?id=41855882779
  





沙发
mmuuss586| | 2014-12-16 21:06 | 只看该作者

支持下楼主;

使用特权

评论回复
板凳
SLHSu37| | 2014-12-17 09:20 | 只看该作者
厉害!

使用特权

评论回复
地板
小班儿| | 2014-12-17 09:38 | 只看该作者
版主总是第一个支持!:funk:

使用特权

评论回复
5
zhangyang86|  楼主 | 2014-12-17 12:00 | 只看该作者
mmuuss586 发表于 2014-12-16 21:06
支持下楼主;

多谢支持 :handshake

使用特权

评论回复
6
mmuuss586| | 2014-12-17 12:12 | 只看该作者
小班儿 发表于 2014-12-17 09:38
版主总是第一个支持!

凑巧而已;

使用特权

评论回复
7
搞IT的| | 2014-12-17 18:52 | 只看该作者
好东西,定一个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:正点原子STM32开发板购买单击这里

80

主题

916

帖子

51

粉丝