您现在的位置是:首页 >技术杂谈 >STM32F4_USMART调试组件网站首页技术杂谈
STM32F4_USMART调试组件
目录
5. 在usmart_config.c中添加想要被USMART调用的函数
1. USMART是什么?
USMART 是 ALIENTEK 开发的一种十分重要的辅助调试工具。功能类似于 Linux 中的 shell(RTT 的 finsh)。USMART 是一种灵巧的串口调试互交组件,所以使用该功能必须搭配 usart 串口,通过 USMART,我们借助串口助手可以调用程序中的任何函数,并执行。因此,我们可以随意的更改函数输入参数(支持数字(10/16进制),支持负数、字符串、函数入口地址等作为参数),单个函数最多支持 10 个输入参数,并支持函数返回值显示。
2. USMART的特点
1. 可以调用绝大部分用户直接编写的函数
2. 资源占用极少(最少情况下:Flash:4K,SRAM:72B)
3. 支持参数类型多(数字(包含10/16进制,支持负数)、字符串、函数指针)
4. 支持函数返回值显示
5. 支持函数及返回值格式设置
6. 支持函数执行时间计算
7. 使用方便
总之: 有了USMART,我们可以轻易的修改参数,查看函数运行结果,从而快速的解决问题。
比如说:我们通常写完一个程序,需要在MDK中编译,查看编译是否有错误,然后DowmLoad下载到单片机,如果现象不符合我们的预期,那么就需要一次一次的重复上述步骤,直到单片机显示出我们预期的现象;我们都知道,单片机也是有其使用寿命的,这样一次又一次的编译,下载,非常损耗单片机的寿命;此时我们可以借助USMART,通过串口将函数及参数发送给单片机,要知道,这样通过串口发送给单片机,是不用进行编译和下载的,现象不符合预期,直接在串口修改参数即可,这样一来,对单片机来说是非常友好的。
3. USMART实现流程
USMART的实现流程简单来说包括以下4步:
1. 添加需要调用的函数(在usmart_config.c里面的usmart_nametab数组里面添加)
2. 初始化串口
3. 初始化USMART(通过usmart_init函数实现)
4. 借助usmart_scan函数,处理串口数据
4. USMART组件
USMART文件共包含以下6个文件;其中 readme.txt 是一个说明文件;
usmart.c负责与外部互交; usmart.h是usmart.c的头文件。该文件中含有几个用户配置宏定义,可以用来配置usmart的功能及总参数长度(直接和SRAM占用挂钩)、是否使能定时器扫描、是否使用读写函数等。
usmart_str.c主要负责命令和参数解析;usmart_str.h是usmart_str.c的头文件;
根据USMART实现流程中的第一步可知:usmart_config主要由用户添加需要由usmart管理的函数;
USMART的移植需要5个函数来实现。其中4个函数位于usmart.c中,另外一个串口接收函数,必须用户自己定义实现。
一、串口接收函数;最大可以一次接收200个字节,用于从串口接收函数名和参数。
二、初始化串口控制器;
//sysclk:系统时钟Mhz void usmart_init(u8 sysclk)// 初始化串口控制器 { #if USMART_ENTIMX_SCAN==1 //是否使能定时器中断扫描,如果USMART_ENTIMX_SCAN为1,则使能定时器中断 //扫描;如果为0,则需要用户自行间隔一段时间调用usmart_scan函数 Timer4_Init(1000,(u32)sysclk*100-1);//初始化定时器4,设置自动重装载值和预分频值,保证时间为0.1ms #endif usmart_dev.sptype=1; //十六进制显示参数 } //如果要使用函数执行时间统计功能(runtime 1),则必须设置USMART_ENTIMX_SCAN为1。 //为了让时间精确到0.1ms,定时器的计数时钟频率必须设置10Khz
三(四)、用于服务函数USMART的函数执行时间统计功能(串口指令:runtime 1);
//复位runtime void usmart_reset_runtime(void) { TIM_ClearFlag(TIM4,TIM_FLAG_Updata); //清空中断标志位 TIM_SetAutorload(TIM4,0xFFFF);//将重装载值设置到最大 TIM_SetCounter(TIM4,0); //清空定时器的计数值CNT usmart_dev.runtime=0; }
//获得runtime时间 //返回值:执行时间,单位:0.1ms,最大延迟时间为定时器CNT值的2倍*0.1ms 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; }
五、usmart扫描函数;usmart_scan函数,该函数用于执行usmart扫描;函数的第一个参数是从串口接收到的数组USART_RX_BUF,第二个参数是串口接收的状态USART_RX_STA
//usmart扫描函数 //通过调用该函数,实现usmart的各个控制,该函数每隔一段时间需要被调用一次 void usmart_scan(void) { u8 sta,len; if(USART_RX_STA&0x8000) //串口接收完成? { len=USART_RX_STA&0x3fff; //得到此次接收到的数据长度 USART_RX_BUF[len]='