辅助调试工具—USMART调试组件

培养解决问题意识和能力,培养创新意识和能力……    受之以鱼,不如受之渔         学习策略:问题+解决方案    

问题(机遇)来源:

什么意思呢?就是为什么会提出上面那个东西?这个东西是怎么来的?是在什么情况下遇到什么问题才想出这个解决方案的!这里要阐述的问题就是这个意思!

比如你调试一个摄像头模块,需要修改其中的几个参数来得到最佳的效果,普通的做法:写函数—修改参数—下载—看结果—不满意—修改参数—下载—看结果—不满意….

不停的循环,直到满意为止。这样做很麻烦不说,单片机也是有寿命的啊,老这样不停的刷,很折寿的。


解决方案:

针对上面遇到的问题,如何解决掉这问题的,具体的解决方案:


USMART调试组件,一个灵巧的串口调试交互组件,一个十分重要的辅助调试工具,是由ALINENTEK开发提供,功能类似于Linux的shell(RTT的finish也属于此类)<其实这里说了关于该问题的解决方案思路>。其最主要的功能就是通过调用单片机里面程序的任何函数<类似于串口接收中断之类的?!>,并执行。 

USMART 的特点如下:
1, 可以调用绝大部分用户直接编写的函数。对于不能直接调用的,你只需要重写一个函数,把影响调用的参数去掉即可,这个重写后的函数,即可以被USMART调用了。
2, 资源占用极少(最少情况: FLASH:4KSRAM:72B)。
3, 支持参数类型多(数字(包含 10或16 进制,支持负数)、字符串指针(如果该参数用作参数返回的话可能会有问题!)、函数指针等)。
4, 支持函数返回值显示。
5, 支持参数及返回值格式设置。
6, 支持函数执行时间计算( V3.1 版本新特性)。
有了USMART,你可以轻易的修改函数参数、查看函数运行结果,从而快速解决问题。
针对上面的问题,利用USMART,则只需要在串口调试助手里面输入函数及参数,然后直接串口发送给单片机,就执行了一次参数调整,不满意的话,你在串口调试助手修改参数在发送就可以了,直到你满意为止。这样,修改参数十分方便,不需要编译、不需要下载、不会让单片机折寿。


USMART的具体实现流程就是:

1、将官方USMART文件夹复制到你的工程文件夹下

2、新建USAMRT组,添加USMART组件代码。同时把USAMRT文件夹添加到头文件包含路径,在主函数里面加入include "usmart.h",如下:

辅助调试工具—USMART调试组件

3、由于 USMART 默认提供了 STM32F4 TIM4 中断初始化设置代码,我们只需要在 usmart.h里面设置 USMART_ENTIMX_SCAN 1,即可完成 TIM4 的设置,通过 TIM4 的中断服务函数,调用 usmart_dev.scan()(就是 usmart_scan 函数),实现 usmart 的扫描

4、在主程序里面害的执行usamrt的初始化

辅助调试工具—USMART调试组件

5、需要针对你自己的想要被usamrt调用的函数在usamart_config.c里面进行添加。打开usmart_config.c,把想要添加函数所在头文件添加进来,并把函数名按照下图所示方式增加即可。另外,read_addr和write_addr属于usamrt自带的函数,用于读写指定地址的数据,通过配置USAMRT_USE_WRFUNS可以使能或者禁止这两个函数。

辅助调试工具—USMART调试组件

如果需要添加一些自定义的函数,可以在main.c里面实现,函数名同样添加到刚刚函数列表中。


USMART的实现流程简单概括就是:

第一步,添加需要调用的函数(在 usmart_config.c里面的usmart_nametab数组里面添加);

第二步,初始化串口;

第三步,初始化 USMART(通过usmart_init函数实现);

第四步,轮询 usmart_scan 函数,处理串口数据。


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里面,另外一个是串口接收函数,必须由用户自己实现,用于接收串口发送过来的数据。

第一个函数:串口接收函数

通过SYSTERM文件夹默认的串口接受来实现的。SYSTERM文件夹里面的串口接收函数最大可以一次接收200字节,用于从串口接收函数名和参数等。(如果在其他平台移植请参考SYSTERM文件夹串口接收的实现方式)

第二个是 void usmart_init(void)函数

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

第三和第四个函数仅用于服务USMART的函数执行时间统计功能(串口指令:runtime 1),分别是:usmart_reset_runtimeusmart_get_runtime
usmart_reset_runtime: 复位runtime(需要根据所移植的MCU的定时器参数进行修改), 在每次USMART调用函数之前执行,清除计数器,然后在函数执行完之后,调用usmart_get_runtime获取整个函数的运行时间。
usmart_get_runtime:    获得runtime时间, 单位:0.1ms,最大延时时间为定时器CNT值的2*0.1ms (需要根据所移植的MCU的定时器参数进行修改). 由于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调试组件


参考文献:

正点原子—STM32F4开发指南—第十九章 USMART调试组件实验