usmart_dev.init(SystemCoreClock/1000000); stm32 战舰的usmart 程序

发布者:BlossomWhisper最新更新时间:2022-04-27 来源: eefocus关键字:stm32  战舰  函数指针 手机看文章 扫描二维码
随时随地手机看文章

usmart_dev.init(SystemCoreClock/1000000); //初始化USMART


对初始化程序的解析。对应  stm32 战舰的usmart 程序来分析


usmart_dev是_m_usmart_dev结构体的变量, usmart_dev结构体变量的初始化如下


struct    _m_usmart_dev   usmart_dev=

{

usmart_nametab,

usmart_init,

usmart_cmd_rec,

usmart_exe,

usmart_scan,

sizeof(usmart_nametab)/sizeof(struct _m_usmart_nametab),//函数数量

0,    //参数数量

0,   //函数ID

1, //参数显示类型,0,10进制;1,16进制

0, //参数类型.bitx:,0,数字;1,字符串     

0,    //每个参数的长度暂存表,需要MAX_PARM个0初始化

0, //函数的参数,需要PARM_LEN个0初始化

};   

要想理解上面的初值,就需要看_m_usmart_dev 这个是结构体的声明, _m_usmart_dev的声明如下


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

};

void (*init)(u8);  


u8 (*cmd_rec)(u8*str);


void (*exe)(void); 


void (*scan)(void);         


上面的四句都是函数指针。


所以执行usmart_dev.init(SystemCoreClock/1000000)的时候是执行的是usmart_dev结构体成员中函数指针void (*init)(u8)所指向的函数。而void (*init)(u8)所指向的函数,在结构体变量中已经初始化过(初始化为usmart_init)。


所以执行usmart_dev.init(SystemCoreClock/1000000)相当于执行了usmart_init(SystemCoreClock/1000000);(结构体的成员是函数指针)


函数usmart_init的实现如下


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; //十六进制显示参数

}

实际内容就是对time2 初始化 ,在time2定的时间内去扫描函数。


time2中断函数实现的如下


void TIM2_IRQHandler(void)

{              

if(TIM2->SR&0X0001)//溢出中断

usmart_dev.scan(); //执行usmart扫描

TIM2->CNT=0; //清空定时器的CNT

TIM2->ARR=1000; //恢复原来的设置

}    

TIM2->SR&=~(1<<0);//清除中断标志位      

}

同理执行函数 usmart_dev.scan(); 就是执行了结构体成员变量usmart_scan,


下面是usmart_scan实现方法


void usmart_scan(void)

{

u8 sta,len;  

    if(USART_RX_STA&0x8000)//串口接收完成?

    {    

        len=USART_RX_STA&0x3fff; //得到此次接收到的数据长度

        USART_RX_BUF[len]=''; //在末尾加入结束符. 

        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("函数错误!rn");   

                                break;

                    case USMART_PARMERR:

                                printf("参数错误!rn");   

                                break;

                    case USMART_PARMOVER:

                                printf("参数太多!rn");   

                                break;

                    case USMART_NOFUNCFIND:

                                printf("未找到匹配的函数!rn");   

                                break;

                }

            }

        }

        USART_RX_STA=0;//状态寄存器清空     

    }

}

 

USART_RX_STA是个接收完成的标志位,同时里面接收串口的字节的个数;


先执行函数 usmart_dev.cmd_rec(USART_RX_BUF);//得到函数各个信息


再次就是执行函数 usmart_dev.exe(); //执行函数 


具体的函数里面有一堆。。。。。。


总结:

结构体成员是函数指针的使用方法。

关键字:stm32  战舰  函数指针 引用地址:usmart_dev.init(SystemCoreClock/1000000); stm32 战舰的usmart 程序

上一篇:keil 中调用printf 的使用 在软件调试下 serial windows 下显示打印信息
下一篇:stm32 编程的收获,有关C语言(在stm32 公交报站中的收获)

推荐阅读最新更新时间:2024-11-11 11:23

STM32入门系列-CMSIS标准
使用寄存器点亮开发板上LED,这种开发方式显然是不适合大众,对于STM32这样庞大的芯片,内部寄存器实在太多,如果操作的外设比较多,那么就需要花很多时间查询底层寄存器内容,而且即使程序写好,如果要换其他端口或者外设的话,修改起来非常麻烦,而且容易出错,移植性也差。基于这些原因,ST公司推出了一套固件库,内部已经将STM32的全部外设寄存器的控制封装好,给用户提供一些API函数,用户只需要学习如何使用这些API函数即可。 CMSIS标准 CMSIS标准英文全称是Cortex MicroController Software Interface Standard,翻译为中文意思就是ARM Cortex微控制器软件接口标准。由于基于
[单片机]
<font color='red'>STM32</font>入门系列-CMSIS标准
STM32的nvic之理解
例程: /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* Enable the WAKEUP_BUTTON_EXTI_IRQn Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = WAKEUP_BUTTON_EXTI_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue; NVIC_InitStructure.N
[单片机]
<font color='red'>STM32</font>的nvic之理解
STM32之FSMC
STM32 FSMC总线深入研究 由于CPU与FPGA通信的需要,以及对8080总线的熟悉,首选采用了STM32的FSMC总线,作为片间通信接口。FSMC能达到16MHz的写入速度,理论上能写20fps的1024*768的图片哈哈。(当然实际上是不可能的,就算是DMA传输,数据源也跟不上,实际上刷模拟的图片每秒10fps,刷的很high)当然这不是本篇的要点,这里主要研究STM32的FSMC接口,将速度提升到极限。 1. FSMC协议分析 如下为ILI9325的8080接口的协议 CS(片选信号):低电平片选有效,高电平失能(默认为高:失能) RS(数据寄存器):低电平写寄存器,高电平写数据(默认为高:写数据
[单片机]
<font color='red'>STM32</font>之FSMC
STM32 I2C从机发送数据
stm32 I2C主机发送功能在网上有很多例程,调试也很容易,从机发送数据的介绍很少,鉴于本人刚开始调试单片机程序不久,花了一整天也没调试通,最后在部门领导的帮助下,通过示波器及单步调试程序,查看寄存器状态值,终于实现了。下面主要介绍下从机发送数据注意事项。(附带例程) 1、相信使用I2C的都知道,从机是不能主动发送数据的,开始条件都是由主机生成。 2、根据参考文档,I2C默认是从机模式,只有在生成起始条件后,才会从从机模式自动切换到主机模式。所以作为从机模式使用时不能生成起始条件。 3、附图1,为从机发送器的传送时序图,截图于参考手册,图中说明部分讲述了怎样能清除事件,这点很重要,每次事件是都要去清除才可以去检测下一
[单片机]
<font color='red'>STM32</font> I2C从机发送数据
STM32 通用定时器作为输入捕获 学习笔记
STM32 通用定时器作为输入捕获 通用定时器作为输入捕获的使用。我们将用TIM5的通道1(PA0)来做输入捕获,捕获PA0上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间。 输入捕获简介: 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。 STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候, 将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA
[单片机]
STM32 串口的简单配置
配置串口包括三部分内容: 1. I/O口配置:TXD配置为复用推挽输出(GPIO_Mode_AF_PP),RXD配置为浮空输入 (GPIO_Mode_IN_FLOATING); 2. 串口配置:波特率等; 3. 中断向量配置:一般用中断方式接收数据。 注意事项: 1. USART1是挂在APB2,使能时钟命令为: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE ); 其他几个则挂在APB1上,如2口: RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE ); 2. 配置4口和5口的时候,中断名为UART4、UART
[单片机]
ST完成STM32微控制器全系底层软件部署
意法半导体完成了将其免费底层应用程序接口(LL API,Low-Layer Application Programming Interface)软件导入支持所有的STM32微控制器(MCU)的STM32Cube软件包中。LL API软件让专业级开发人员能够在方便易用的STMCube™环境内开发应用,使用ST验证过的软件对最低到寄存器级的代码进行优化,从而缩短产品上市时间。 在所有的STM32Cube包内整合LL API和硬件抽象层(HAL)软件,让开发人员能够完全自由地选择外设控制方式。他们可以选择利用HAL的易用性和移植性,或采用LL API软件优化性能 、代码量和功耗。为相关STM32 Nucleo开发板订制的例
[单片机]
ST完成<font color='red'>STM32</font>微控制器全系底层软件部署
STM32之六独立看门狗
单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生,在一定的时间内(通过计数器)没有喂狗信号输入给看门狗则表示MCU出现问题,自动会给处理器发送复位信号,是MCU重新启动,是系统正常运转。 STM32的独立看门狗有内部的专门40KHz低速时钟驱动,即使主时钟发生故障,它仍然有效。看门狗时钟十一个内部RC时钟,并不是准确的40KHz,而是在30~60KHz之间的变化时钟,估算时间的时候以40KHz来计算。 第一步,首先取消寄存器写保护,我们利用库函数的IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);来实现,
[单片机]
<font color='red'>STM32</font>之六独立看门狗

推荐帖子

新手请高手帮看下程序
#includereg51.h#includeabsacc.h#defineIN0XBYTE/*0通道的绝对地址*/#defineIN1XBYTE/*2通道的绝对地址*/voidabc0809_1(ucharidata*x);/*找球传感器的值*/voidabc0809_2(ucharidata*x);/*灰度传感器的值*/voidline(void);/*直行函数*/voidleft(void);/*左转函数*/void
mirasy 51单片机
AD采集分压电阻的选择
单片机AD采集测量范围0~2.56V,现在要测量一个24V~30V的锂电池电压,打算分压,然后AD采集,请问分压电阻如何选择呢?试了好几组电阻值,测出的电压值都比实际电压偏高好多差到0.4~0.5V了,不知该如何选择?程序没有问题,单片机也没有问题,使用精准电压源芯片提供2.5V电压,AD采集值计算结果很准,只是用电阻分压AD采集值就会差很多。还有就是如果是和电阻精度有关,为什么用万用表测出来也和理论计算值接近,唯独AD采集结果偏高好多?AD采集分压电阻的选择 直接用AD测一个不分压的电压
gxp790953623 单片机
手控电脑屏~~自己做的哦
手控电脑屏~~自己做的哦好久没来电子工程世界玩了,好像一年了吧,呵呵,主要是现在没玩硬件了,嗨。不过我现在又来了,哈哈。。。3D切换是在win7旗舰版上运行的(windows+tab)。3D桌面旋转是自己下的软件,十款超酷3D虚拟桌面软件:http://bbs.pcbeta.com/viewthread-451413-1-1.html我下的是第四个:Deskspace。Deskspace默认的旋转快捷键是windows+ctrl,但我没有找到c
ginny DIY/开源硬件专区
ZigBee基础程序之——LED
#includeioCC2530.h//#includestdio.h#defineuintunsignedint#defineucharunsignedchar//定义控制灯的端口#defineRLEDP1_0//定义LED1为P10口控制#defineYLEDP1_1//定义LED2为P11口控制#defineLED3P1_4#defineLED4P0_1/****************************//延时*****
wang668 RF/无线
Wince音频驱动结构
Wince有3种音频模式:MDD/PDD、WaveDev2和UAM。1,MDD/PDD:Wince驱动常用的模型,分为两层,平台无关层MDD及平台相关层PDD;两者通过接口静态链接起来才能形成完整的驱动,接口定义(public/common/oak/inc/waveddsi.h)。2,WaveDev2WaveDev2没有分层,所有文件在同一文件夹下,和硬件相关的部分hwctxt.h和hwctxt.cpp3,UAM用的不多,用硬件做混音。来一篇英文介绍
Wince.Android 嵌入式系统
【求助】430最短复位时间怎么算,多谢了先
430F1222和430F135,用4M的晶振,最短复位时间要多少?怎么算啊,多谢多谢了,最好给个RC复位电路参考值,拜托各位大虾了【求助】430最短复位时间怎么算,多谢了先一般复位电路(电压监控芯片)的RESET信号保持时间在100ms以上这么长啊,51的最少只要两个机械周期而已,有20MS就足够了,MSP要这么久才可以完全复位啊?我是说最短上电复位时间,我想在上电复位的同时给单片机一个低电平信号,但这个信号只能维持50MS,不知到能不能检测到这个低电平信号关于复位时间的长
ywmcu9 微控制器 MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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