2758|4

14

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

ATK-HC05蓝牙串口模块 [复制链接]

ATK-HC05蓝牙串口模块电路图和源程序:

 

 

点赞 关注
 
 

回复
举报

14

帖子

2

TA的资源

一粒金砂(中级)

沙发
 

#include "delay.h"              
#include "usart.h"              
#include "usart2.h"              
#include "hc05.h" 
#include "led.h" 
#include "string.h"     
#include "math.h"
 

//初始化ATK-HC05模块
//返回值:0,成功;1,失败.
u8 HC05_Init(void)
{
    u8 retry=10,t;               
    u8 temp=1;
    RCC->APB2ENR|=1<<2;        //使能PORTA时钟         
    RCC->APB2ENR|=1<<4;        //使能PORTC时钟         
     GPIOA->CRL&=0XFFF0FFFF;    //PA4,输入
     GPIOA->CRL|=0X00080000; 
    GPIOA->ODR|=1<<4;         //PA4上拉 
    GPIOC->CRL&=0XFFF0FFFF;    //PC4,推挽输出
    GPIOC->CRL|=0X00030000; 
    GPIOC->ODR|=1<<4;         //PC4输出1    
    USART2_Init(36,9600);    //初始化串口2为:9600,波特率.
    while(retry--)
    {
        HC05_KEY=1;                    //KEY置高,进入AT模式
        delay_ms(10);
        u2_printf("AT\r\n");        //发送AT测试指令
        HC05_KEY=0;                    //KEY拉低,退出AT模式
        for(t=0;t<10;t++)             //最长等待50ms,来接收HC05模块的回应
        {
            if(USART2_RX_STA&0X8000)break;
            delay_ms(5);
        }        
        if(USART2_RX_STA&0X8000)    //接收到一次数据了
        {
            temp=USART2_RX_STA&0X7FFF;    //得到数据长度
            USART2_RX_STA=0;             
            if(temp==4&&USART2_RX_BUF[0]=='O'&&USART2_RX_BUF[1]=='K')
            {
                temp=0;//接收到OK响应
                break;
            }
        }                        
    }            
    if(retry==0)temp=1;    //检测失败
    return temp;     
}     
//获取ATK-HC05模块的角色
//返回值:0,从机;1,主机;0XFF,获取失败.                              
u8 HC05_Get_Role(void)
{                 
    u8 retry=0X0F;
    u8 temp,t;
    while(retry--)
    {
        HC05_KEY=1;                    //KEY置高,进入AT模式
        delay_ms(10);
        u2_printf("AT+ROLE?\r\n");    //查询角色
        for(t=0;t<20;t++)             //最长等待200ms,来接收HC05模块的回应
        {
            delay_ms(10);
            if(USART2_RX_STA&0X8000)break;
        }        
        HC05_KEY=0;                    //KEY拉低,退出AT模式
        if(USART2_RX_STA&0X8000)    //接收到一次数据了
        {
            temp=USART2_RX_STA&0X7FFF;    //得到数据长度
            USART2_RX_STA=0;             
            if(temp==13&&USART2_RX_BUF[0]=='+')//接收到正确的应答了
            {
                temp=USART2_RX_BUF[6]-'0';//得到主从模式值
                break;
            }
        }        
    }
    if(retry==0)temp=0XFF;//查询失败.
    return temp;
}                                
//ATK-HC05设置命令
//此函数用于设置ATK-HC05,适用于仅返回OK应答的AT指令
//atstr:AT指令串.比如:"AT+RESET"/"AT+UART=9600,0,0"/"AT+ROLE=0"等字符串
//返回值:0,设置成功;其他,设置失败.                              
u8 HC05_Set_Cmd(u8* atstr)
{                 
    u8 retry=0X0F;
    u8 temp,t;
    while(retry--)
    {
        HC05_KEY=1;                    //KEY置高,进入AT模式
        delay_ms(10);
        u2_printf("%s\r\n",atstr);    //发送AT字符串
        HC05_KEY=0;                    //KEY拉低,退出AT模式
        for(t=0;t<20;t++)             //最长等待100ms,来接收HC05模块的回应
        {
            if(USART2_RX_STA&0X8000)break;
            delay_ms(5);
        }        
        if(USART2_RX_STA&0X8000)    //接收到一次数据了
        {
            temp=USART2_RX_STA&0X7FFF;    //得到数据长度
            USART2_RX_STA=0;             
            if(temp==4&&USART2_RX_BUF[0]=='O')//接收到正确的应答了
            {            
                temp=0;
                break;             
            }
        }        
    }
    if(retry==0)temp=0XFF;//设置失败.
    return temp;

///////////////////////////////////////////////////////////////////////////////////////////////////
//通过该函数,可以利用USMART,调试接在串口2上的ATK-HC05模块
//str:命令串.(这里注意不再需要再输入回车符)
void HC05_CFG_CMD(u8 *str)
{                      
    u8 temp;
    u8 t;          
    HC05_KEY=1;                        //KEY置高,进入AT模式
    delay_ms(10);
    u2_printf("%s\r\n",(char*)str); //发送指令
    for(t=0;t<50;t++)                 //最长等待500ms,来接收HC05模块的回应
    {
        if(USART2_RX_STA&0X8000)break;
        delay_ms(10);
    }                                        
    HC05_KEY=0;                        //KEY拉低,退出AT模式
    if(USART2_RX_STA&0X8000)        //接收到一次数据了
    {
        temp=USART2_RX_STA&0X7FFF;    //得到数据长度
        USART2_RX_STA=0;
        USART2_RX_BUF[temp]=0;        //加结束符         
        printf("\r\n%s",USART2_RX_BUF);//发送回应数据到串口1
    }                  
}


 

 
 
 

回复

14

帖子

2

TA的资源

一粒金砂(中级)

板凳
 

#ifndef __HC05_H
#define __HC05_H     
#include "sys.h" 
 

#define HC05_KEY      PCout(4)     //蓝牙控制KEY信号
#define HC05_LED      PAin(4)        //蓝牙连接状态信号
  
u8 HC05_Init(void);
void HC05_CFG_CMD(u8 *str);
u8 HC05_Get_Role(void);
u8 HC05_Set_Cmd(u8* atstr);       
#endif  

 
 
 

回复

14

帖子

2

TA的资源

一粒金砂(中级)

4
 

#include "usmart.h"
#include "usart.h"
#include "sys.h"

////////////////////////////////////////////用户配置参数////////////////////////////////////////////////////      
//系统命令
u8 *sys_cmd_tab[]=
{
    "?",
    "help",
    "list",
    "id",
    "hex",
    "dec",
    "runtime",       
};        
//处理系统指令
//0,成功处理;其他,错误代码;
u8 usmart_sys_cmd_exe(u8 *str)
{
    u8 i;
    u8 sfname[MAX_FNAME_LEN];//存放本地函数名
    u8 pnum;
    u8 rval;
    u32 res;  
    res=usmart_get_cmdname(str,sfname,&i,MAX_FNAME_LEN);//得到指令及指令长度
    if(res)return USMART_FUNCERR;//错误的指令 
    str+=i;                          
    for(i=0;i<sizeof(sys_cmd_tab)/4;i++)//支持的系统指令
    {
        if(usmart_strcmp(sfname,sys_cmd_tab[i])==0)break;
    }
    switch(i)
    {                       
        case 0:
        case 1://帮助指令
            printf("\r\n");
#if USMART_USE_HELP
            printf("------------------------USMART V3.1------------------------ \r\n");
            printf("    USMART是由ALIENTEK开发的一个灵巧的串口调试互交组件,通过 \r\n");
            printf("它,你可以通过串口助手调用程序里面的任何函数,并执行.因此,你可\r\n");
            printf("以随意更改函数的输入参数(支持数字(10/16进制)、字符串、函数入\r\n");      
            printf("口地址等作为参数),单个函数最多支持10个输入参数,并支持函数返 \r\n");
            printf("回值显示.新增参数显示进制设置功能,新增进制转换功能.\r\n");
            printf("技术支持:www.openedv.com\r\n");
            printf("USMART有7个系统命令:\r\n");
            printf("?:      获取帮助信息\r\n");
            printf("help:   获取帮助信息\r\n");
            printf("list:   可用的函数列表\r\n\n");
            printf("id:     可用函数的ID列表\r\n\n");
            printf("hex:    参数16进制显示,后跟空格+数字即执行进制转换\r\n\n");
            printf("dec:    参数10进制显示,后跟空格+数字即执行进制转换\r\n\n");
            printf("runtime:1,开启函数运行计时;0,关闭函数运行计时;\r\n\n");
            printf("请按照程序编写格式输入函数名及参数并以回车键结束.\r\n");    
            printf("--------------------------ALIENTEK------------------------- \r\n");
#else
            printf("指令失效\r\n");
#endif
            break;
        case 2://查询指令
            printf("\r\n");
            printf("-------------------------函数清单--------------------------- \r\n");
            for(i=0;i<usmart_dev.fnum;i++)printf("%s\r\n",usmart_dev.funs[i].name);
            printf("\r\n");
            break;     
        case 3://查询ID
            printf("\r\n");
            printf("-------------------------函数 ID --------------------------- \r\n");
            for(i=0;i<usmart_dev.fnum;i++)
            {
                usmart_get_fname((u8*)usmart_dev.funs[i].name,sfname,&pnum,&rval);//得到本地函数名 
                printf("%s id is:\r\n0X%08X\r\n",sfname,usmart_dev.funs[i].func); //显示ID
            }
            printf("\r\n");
            break;
        case 4://hex指令
            printf("\r\n");
            usmart_get_aparm(str,sfname,&i);
            if(i==0)//参数正常
            {
                i=usmart_str2num(sfname,&res);           //记录该参数    
                if(i==0)                              //进制转换功能
                {
                    printf("HEX:0X%X\r\n",res);           //转为16进制
                }else if(i!=4)return USMART_PARMERR;//参数错误.
                else                                    //参数显示设定功能
                {
                    printf("16进制参数显示!\r\n");
                    usmart_dev.sptype=SP_TYPE_HEX;  
                }

            }else return USMART_PARMERR;            //参数错误.
            printf("\r\n"); 
            break;
        case 5://dec指令
            printf("\r\n");
            usmart_get_aparm(str,sfname,&i);
            if(i==0)//参数正常
            {
                i=usmart_str2num(sfname,&res);           //记录该参数    
                if(i==0)                               //进制转换功能
                {
                    printf("DEC:%lu\r\n",res);           //转为10进制
                }else if(i!=4)return USMART_PARMERR;//参数错误.
                else                                    //参数显示设定功能
                {
                    printf("10进制参数显示!\r\n");
                    usmart_dev.sptype=SP_TYPE_DEC;  
                }

            }else return USMART_PARMERR;            //参数错误. 
            printf("\r\n"); 
            break;     
        case 6://runtime指令,设置是否显示函数执行时间
            printf("\r\n");
            usmart_get_aparm(str,sfname,&i);
            if(i==0)//参数正常
            {
                i=usmart_str2num(sfname,&res);               //记录该参数    
                if(i==0)                                   //读取指定地址数据功能
                {
                    if(USMART_ENTIMX_SCAN==0)printf("\r\nError! \r\nTo EN RunTime function,Please set USMART_ENTIMX_SCAN = 1 first!\r\n");//报错
                    else
                    {
                        usmart_dev.runtimeflag=res;
                        if(usmart_dev.runtimeflag)printf("Run Time Calculation ON\r\n");
                        else printf("Run Time Calculation OFF\r\n"); 
                    }
                }else return USMART_PARMERR;               //未带参数,或者参数错误     
             }else return USMART_PARMERR;                //参数错误. 
            printf("\r\n"); 
            break;        
        default://非法指令
            return USMART_FUNCERR;
    }
    return 0;
}
////////////////////////////////////////////////////////////////////////////////////////
//移植注意:本例是以stm32为例,如果要移植到其他mcu,请做相应修改.
//usmart_reset_runtime,清除函数运行时间,连同定时器的计数寄存器以及标志位一起清零.并设置重装载值为最大,以最大限度的延长计时时间.
//usmart_get_runtime,获取函数运行时间,通过读取CNT值获取,由于usmart是通过中断调用的函数,所以定时器中断不再有效,此时最大限度
//只能统计2次CNT的值,也就是清零后+溢出一次,当溢出超过2次,没法处理,所以最大延时,控制在:2*计数器CNT*0.1ms.对STM32来说,是:13.1s左右
//其他的:TIM2_IRQHandler和Timer4_Init,需要根据MCU特点自行修改.确保计数器计数频率为:10Khz即可.另外,定时器不要开启自动重装载功能!!

#if USMART_ENTIMX_SCAN==1
//复位runtime
//需要根据所移植到的MCU的定时器参数进行修改
void usmart_reset_runtime(void)
{
    TIM2->SR&=~(1<<0);    //清除中断标志位 
    TIM2->ARR=0XFFFF;    //将重装载值设置到最大
    TIM2->CNT=0;        //清空定时器的CNT
    usmart_dev.runtime=0;    
}
//获得runtime时间
//返回值:执行时间,单位:0.1ms,最大延时时间为定时器CNT值的2倍*0.1ms
//需要根据所移植到的MCU的定时器参数进行修改
u32 usmart_get_runtime(void)
{
    if(TIM2->SR&0X0001)//在运行期间,产生了定时器溢出
    {
        usmart_dev.runtime+=0XFFFF;
    }
    usmart_dev.runtime+=TIM2->CNT;
    return usmart_dev.runtime;        //返回计数值
}
//下面这两个函数,非USMART函数,放到这里,仅仅方便移植. 
//定时器2中断服务程序     
void TIM2_IRQHandler(void)
{                                       
    if(TIM2->SR&0X0001)//溢出中断
    { 
        usmart_dev.scan();    //执行usmart扫描    
        TIM2->CNT=0;        //清空定时器的CNT
        TIM2->ARR=1000;        //恢复原来的设置
    }                   
    TIM2->SR&=~(1<<0);//清除中断标志位         
}
//使能定时器2,使能中断.
void Timer2_Init(u16 arr,u16 psc)
{
    RCC->APB1ENR|=1<<0;    //TIM2时钟使能    
     TIM2->ARR=arr;      //设定计数器自动重装值  
    TIM2->PSC=psc;      //预分频器7200,得到10Khz的计数时钟    
    TIM2->DIER|=1<<0;   //允许更新中断                                              
    TIM2->CR1|=0x01;    //使能定时器2
      MY_NVIC_Init(3,3,TIM2_IRQn,2);//抢占3,子优先级3,组2(组2中优先级最低的)                                     
}
#endif
////////////////////////////////////////////////////////////////////////////////////////
//初始化串口控制器
//sysclk:系统时钟(Mhz)
void usmart_init(u8 sysclk)
{
#if USMART_ENTIMX_SCAN==1
    Timer2_Init(1000,(u32)sysclk*100-1);//分频,时钟为10K ,100ms中断一次,注意,计数频率必须为10Khz,以和runtime单位(0.1ms)同步.
#endif
    usmart_dev.sptype=1;    //十六进制显示参数
}        
//从str中获取函数名,id,及参数信息
//*str:字符串指针.
//返回值:0,识别成功;其他,错误代码.
u8 usmart_cmd_rec(u8*str) 
{
    u8 sta,i,rval;//状态     
    u8 rpnum,spnum;
    u8 rfname[MAX_FNAME_LEN];//暂存空间,用于存放接收到的函数名  
    u8 sfname[MAX_FNAME_LEN];//存放本地函数名
    sta=usmart_get_fname(str,rfname,&rpnum,&rval);//得到接收到的数据的函数名及参数个数      
    if(sta)return sta;//错误
    for(i=0;i<usmart_dev.fnum;i++)
    {
        sta=usmart_get_fname((u8*)usmart_dev.funs[i].name,sfname,&spnum,&rval);//得到本地函数名及参数个数
        if(sta)return sta;//本地解析有误      
        if(usmart_strcmp(sfname,rfname)==0)//相等
        {
            if(spnum>rpnum)return USMART_PARMERR;//参数错误(输入参数比源函数参数少)
            usmart_dev.id=i;//记录函数ID.
            break;//跳出.
        }    
    }
    if(i==usmart_dev.fnum)return USMART_NOFUNCFIND;    //未找到匹配的函数
     sta=usmart_get_fparam(str,&i);                    //得到函数参数个数    
    if(sta)return sta;                                //返回错误
    usmart_dev.pnum=i;                                //参数个数记录
    return USMART_OK;
}
//usamrt执行函数
//该函数用于最终执行从串口收到的有效函数.
//最多支持10个参数的函数,更多的参数支持也很容易实现.不过用的很少.一般5个左右的参数的函数已经很少见了.
//该函数会在串口打印执行情况.以:"函数名(参数1,参数2...参数N)=返回值".的形式打印.
//当所执行的函数没有返回值的时候,所打印的返回值是一个无意义的数据.
void usmart_exe(void)
{
    u8 id,i;
    u32 res=0;           
    u32 temp[MAX_PARM];//参数转换,使之支持了字符串 
    u8 sfname[MAX_FNAME_LEN];//存放本地函数名
    u8 pnum,rval;
    id=usmart_dev.id;
    if(id>=usmart_dev.fnum)return;//不执行.
    usmart_get_fname((u8*)usmart_dev.funs[id].name,sfname,&pnum,&rval);//得到本地函数名,及参数个数 
    printf("\r\n%s(",sfname);//输出正要执行的函数名
    for(i=0;i<pnum;i++)//输出参数
    {
        if(usmart_dev.parmtype&(1<<i))//参数是字符串
        {
            printf("%c",'"');             
            printf("%s",usmart_dev.parm+usmart_get_parmpos(i));
            printf("%c",'"');
            temp[i]=(u32)&(usmart_dev.parm[usmart_get_parmpos(i)]);
        }else                          //参数是数字
        {
            temp[i]=*(u32*)(usmart_dev.parm+usmart_get_parmpos(i));
            if(usmart_dev.sptype==SP_TYPE_DEC)printf("%lu",temp[i]);//10进制参数显示
            else printf("0X%X",temp[i]);//16进制参数显示        
        }
        if(i!=pnum-1)printf(",");
    }
    printf(")");
    usmart_reset_runtime();    //计时器清零,开始计时
    switch(usmart_dev.pnum)
    {
        case 0://无参数(void类型)                                              
            res=(*(u32(*)())usmart_dev.funs[id].func)();
            break;
        case 1://有1个参数
            res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0]);
            break;
        case 2://有2个参数
            res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1]);
            break;
        case 3://有3个参数
            res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2]);
            break;
        case 4://有4个参数
            res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3]);
            break;
        case 5://有5个参数
            res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4]);
            break;
        case 6://有6个参数
            res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
            temp[5]);
            break;
        case 7://有7个参数
            res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
            temp[5],temp[6]);
            break;
        case 8://有8个参数
            res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
            temp[5],temp[6],temp[7]);
            break;
        case 9://有9个参数
            res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
            temp[5],temp[6],temp[7],temp[8]);
            break;
        case 10://有10个参数
            res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
            temp[5],temp[6],temp[7],temp[8],temp[9]);
            break;
    }
    usmart_get_runtime();//获取函数执行时间
    if(rval==1)//需要返回值.
    {
        if(usmart_dev.sptype==SP_TYPE_DEC)printf("=%lu;\r\n",res);//输出执行结果(10进制参数显示)
        else printf("=0X%X;\r\n",res);//输出执行结果(16进制参数显示)       
    }else printf(";\r\n");        //不需要返回值,直接输出结束
    if(usmart_dev.runtimeflag)    //需要显示函数执行时间
    { 
        printf("Function Run Time:%d.%1dms\r\n",usmart_dev.runtime/10,usmart_dev.runtime%10);//打印函数执行时间 
    }    
}
//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;//状态寄存器清空        
    }
}

#if USMART_USE_WRFUNS==1     //如果使能了读写操作
//读取指定地址的值         
u32 read_addr(u32 addr)
{
    return *(u32*)addr;//    
}
//在指定地址写入指定的值         
void write_addr(u32 addr,u32 val)
{
    *(u32*)addr=val;     
}
#endif

 
 
 

回复

14

帖子

2

TA的资源

一粒金砂(中级)

5
 

#ifndef __USMART_H
#define __USMART_H                
#include "usmart_str.h"
////////////////////////////////////////////用户配置参数////////////////////////////////////////////////////      
#define MAX_FNAME_LEN         30    //函数名最大长度,应该设置为不小于最长函数名的长度。                                               
#define MAX_PARM             10    //最大为10个参数 ,修改此参数,必须修改usmart_exe与之对应.
#define PARM_LEN             200    //所有参数之和的长度不超过PARM_LEN个字节,注意串口接收部分要与之对应(不小于PARM_LEN)


#define USMART_ENTIMX_SCAN     1    //使用TIM的定时中断来扫描SCAN函数,如果设置为0,需要自己实现隔一段时间扫描一次scan函数.
                                //注意:如果要用runtime统计功能,必须设置USMART_ENTIMX_SCAN为1!!!!
                                
#define USMART_USE_HELP        1    //使用帮助,该值设为0,可以节省近700个字节,但是将导致无法显示帮助信息。
#define USMART_USE_WRFUNS    1    //使用读写函数,使能这里,可以读取任何地址的值,还可以写寄存器的值.
///////////////////////////////////////////////END///////////////////////////////////////////////////////////

#define USMART_OK             0  //无错误
#define USMART_FUNCERR         1  //函数错误
#define USMART_PARMERR         2  //参数错误
#define USMART_PARMOVER     3  //参数溢出
#define USMART_NOFUNCFIND     4  //未找到匹配函数

#define SP_TYPE_DEC          0  //10进制参数显示
#define SP_TYPE_HEX           1  //16进制参数显示


 //函数名列表     
struct _m_usmart_nametab
{
    void* func;            //函数指针
    const u8* name;        //函数名(查找串)     
};
//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
};
extern struct _m_usmart_nametab usmart_nametab[];    //在usmart_config.c里面定义
extern struct _m_usmart_dev usmart_dev;                //在usmart_config.c里面定义


void usmart_init(u8 sysclk);//初始化
u8 usmart_cmd_rec(u8*str);    //识别
void usmart_exe(void);        //执行
void usmart_scan(void);     //扫描
u32 read_addr(u32 addr);    //读取指定地址的值
void write_addr(u32 addr,u32 val);//在指定地址写入指定的值
u32 usmart_get_runtime(void);    //获取运行时间
void usmart_reset_runtime(void);//复位运行时间

#endif

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表