发帖数

50

原创数

50

关注者

12

阅读数

7795

点赞数

4

蔡琰

  • 回调函数的使用

    大家好!我是张飞实战电子蔡琰老师,今天给大家讲解回调函数的使用。

    回调函数(Callback Function)是程序中一种常用的函数调用方式。其特点是可以在下层软件模块(宏观上的被调用者)中,调用来自上层的软件模块(宏观中的调用者)中的函数,这和通常的调用顺序是相反的。

    程序调用的方式:

    软件模块的关系,从总体上看,有上层软件模块和下层软件模块之分。一般有三种调用方式:

    简单的同步调用

    带有回调的调用

    异步调用

    同步调用是最常用的调用方式,由上层模块调用下层模块。在调用过程中,上层模块将被阻塞,直至下层模块执行完毕并返回。在方向上,同步调用是单向的调用方式,如下图所示:

    图片1.jpg

    上图调用方式为A->B。即上层模块的函数A调用下层模块的函数B,在调用过程中函数A被阻塞,当函数B返回之后,函数A继续执行。在B执行过程中,A不能得到B执行的消息。同步调用是一种最简单的调用方式,在大多数的C语言库函数调用中,都使用这种方式。

    带有回调的调用方式是一种双向调用模式,在这种方式中,下层模块的函数在被调用的时候,将会调用上层模块的某个函数,如下图所示:

    图片2.jpg

    在带有回调的调用中,调用方式为A->B->C。位于上层模块的函数A调用下层模块的函数B,在B的执行过程中,将调用上层模块的函数C。在这里函数C被称为回调函数,它是被下层模块所调用的上层模块函数。B函数执行的过程中,可以通过调用C函数将信息返回给上层模块。对于上层模块,C函数至少有两个作用,其一是监视B的运行状态,其二是干预B的运行。在这种方式中,本质上的关系依然是上层调用下层,由于增加了回调函数C,这样可以在调用的过程中进行交互。

    异步调用一般基于消息或事件,下层模块接受上层模块的命令,当发生某个事件的时候,下层模块将调用上层模块的函数。异步调用方式一般基于回调函数的注册机制。异步调用如下图所示:

    图片3.jpg

    在异步的调用方式中,调用方式为A->B立刻返回,当某个事件发生后,进行D->C的动作。本来上层模块的A调用下层模块的B的时候,只是一个简单的同步调用,调用完后将立刻返回。在A->B的调用过程中,可以向下层模块注册某些信息,例如回调函数C,当下层模块的某个事件发生的情况下,调用上层模块的C函数。

    再来看下回调函数的作用:

    回调函数的表现形式是一个某种类型的函数指针,这个函数由上层的软件模块实现,将这个函数指针通过某种方式传递给下层的软件模块,由下层的软件模块在某个时刻调用这个函数。

    函数指针的本质是一个函数的地址,在32位的C语言系统中,本质上就是一个32位无符号的整型数。函数指针由上层软件模块到下层软件模块的传递方式可以是通过作为函数的参数传递,也可以是使用结构体的成员进行传递。调用回调函数的时刻一般有两种:一种是在上层模块调用的下层模块的函数中,直接调用回调函数;另一种是使用注册的方式,在某个事件发生的时候下层模块调用回调函数。


    收藏 0 回复 0 浏览 137
  • 位段操作

    大家好!我是张飞实战电子蔡琰老师,今天给大家分享位段操作。

    位段操作允许单次加载/存储操作(读/写)访问单个数据位,对于Cortex-M3,两个预定义的位段区域支持这种特性,其中一个位于SRAM区域的头1MB,另外一个则位于外设区域的头1MB。这两个区域可以同普通存储器一样访问,不过它们还可以通过被称作位段别名的独立区域进行操作。当使用位段别名地址时,可以通过每个字对齐的地址中数据的最低位,来访问每个单独的位。

    例如,要将地址0x20000000中数据的第2位置1,除了可以通过读出数据、设置位然后写回数据的方式外,还可以通过单一指令执行这个操作,下面看一下两种情况的汇编执行流程。

    图片2.jpg

    图片3.jpg

    类似地,如果我们需要读取存储器位置中的一个位,位段特性可以简化应用程序代码。例如,如果我们需要确定地址0x20000000处数据的第2位,我们可以采取下面图所示的步骤。

    图片4.jpg

    位段操作并不是一个新的想法,事实上,类似的特性已经在像8051之类的8位微处理器上存在30多年了。尽管Cortex-M3并没有位操作的特殊指令,而定义了特殊区域却可以让对这些区域的访问自动转换为位段操作。

    下面是Cortex-M3在位段存储器寻址里使用的术语:

    位段区域:支持位段操作的存储器区域。

    位段别名:访问位段别名会引起对位段区域的访问(位段操作)。

    在位段区域里,每个字被位段别名寻址区域里的32个字的最低位表示。事实上,在访问位段别名区域时,地址被重映射为位段地址。对于读操作,字被读出并且选定的位会被移入读返回数据的最低位;对于写操作,写入的位数据会被移入所需位的位置,并且执行读-修改-写的操作。


    收藏 0 回复 0 浏览 133
  • USB的拓扑结构

     大家好!我是张飞实战电子蔡琰老师,今天给大家分享USB的拓扑结构。

    我们经常使用USB,对USB多少了解呢?本篇文章我们一起来学习一下USB的拓扑结构和数据通信原理。

    USB是一种主从结构的系统,主机叫做Host,从机叫做Device,通常所说的主机具有一个或者多个USB主控制器(Host controller)和跟集线器(root hub),主控制器主要负责数据处理,而跟集线器则提供一个连接主控制器和设备之间的接口和通路。另外,还有一类特殊的USB设备-USB集线器,我们也叫USB HUB,它可以对原有的USB口的数量上进行扩展,就可以获得更多的USB口。但是需要注意的是集线器只能扩展处更多的USB口,而不能扩展出更多的带宽,带宽是共享一个USB主控制器的。

    image.png


    USB HUB

    通常,PC上有多个USB主控制器和多个USB口,每个主控制器下有一个跟集线器,跟集线器下面通常具有一个或者几个USB口,当你有多个不同的USB设备都需要较大的数据带宽时,可以考虑将他们分别接到不同的主控制器的跟集线器上,以避免带宽不足。

    USB的数据交换只能发生在主机与设备之间,主机与主机之间,设备与设备之间不能直接互联和交换数据。为了在物理上区分主机和设备,使用了不同的插头和插座,所有的数据都由主机主动发起,而设备只是被动的负责应答,例如,在读数据时,USB先发出命令,设备收到该命令后,才返回数据。

    USB OTG比普通的4线USB多了一条ID识别线,用来表明它是主机还是设备,它可以在主机和设备之间切换角色,这样就实现了设备与设备的链接,增大了USB的使用范围。但是需要注意的是依然没有脱离主从关系,两个设备之间必须要有一个作为主机,一个作为设备。

    image.png

    USB层次连接

    塔顶作为USB主控制器和跟集线器,下面接USB集线器,USB集线器将一个USB口扩展为多个USB口,多个USB口又可以通过集线器扩展出更多的接口,但USB协议中对集线器的层数是有限制的,USB1.1规定最多4层,USB2.0规定最多6层,理论上一个USB主控制器最多接127个设备,这是因为协议规定每个USB设备具有一个7bit的地址(取值范围0-127)。

    一个完美的数据传输过程如下:首先由USB主控制器发出命令和数据,通过跟集线器,再通过下面的集线器发给USB设备,设备对接收到的数据极性处理后,返回一些信息或者数据,它首先到达上一层的集线器,上层的集线器再交给更上层的集线器,一直到USB的主控制器,最终USB主控制器讲述CPU处理。

    文中我们对USB的拓扑结构和数据通信过程做了一个详细的描述,你学到了吗?


    收藏 0 回复 0 浏览 36
  • 张飞单片机来了

    大家好!我是张飞实战电子蔡琰老师,今天给大家分享张飞单片机。

    在这一芯难求的时代,张飞单片机来了,带着丰富的示例、手册以及最小系统板,还有强大的技术支持,让迷茫的你可以快速上手到应用。话不多说,我们就一起来看一下张飞单片机的特点以及应用吧。

    张飞单片机目前的芯片有:ZFM32F030系列32位微控制器(TSSOP20QFN32),都是M0核。ZMF32F103CB 32位微控制器(LQFP48),是M3核。

    1、先说一下我们两个系列的特点吧

    FM32F030系列32位微控制器的特点:

    图片1.jpg

    图片2.jpg

    ZFM32F103CB  32 位微控制器特点:

    图片3.jpg

    看到这些特点对于一般的硬件工程师或者单片机应用工程师就可以检索到自己的需求了,可以快速去查找相关应用了对吧。找到外设应用了就可以快速对照手册来看具体操作了。

    1、接下来跟大家看下我们提供的数据包都有什么内容吧

    image.pngimage.png

    用户手册大家都知道,是可以查询最详细信息的手册,包括寄存器应用之类的信息;数据手册就是对应单片机最基本的信息,比如特点,管脚信息,系统及外设等的描述,电气规范,封装等的一些信息。

    FLM烧写文件是一个FLASH烧写算法文件,要加载到MDK工具下才能下载烧录程序;第四点是标准库以及示例程序;还有我们提供了最小系统板的说明和原理图。

    1、为了方便大家能快速上手应用我们的单片机,可以免费申领我们的数据包和最小系统板,扫描下面二维码咨询,相关的技术问题我们也可以交流。

    image.png

    张飞单片机技术支持邮箱:support@zhangfeidz.com


    收藏 0 回复 0 浏览 644
  • 为什么好多人设计USB上拉电阻都是1.5K?

    大家好!我是张飞实战电子蔡琰老师,今天给大家讲解为什么好多人设计USB上拉电阻都是1.5K?

    说起USB,想必大家对这个词儿都不默生,USB接头那么多种,怎么分得清呢?下面由两幅图来简洁表述。

    图片1.jpg

    图片2.jpg


                                      常见USB接头及连接线介绍

     

    通过上面两幅图,我们心里已经有了一个大致的概念了,那么在USB接口设计的时候,通常我们要在USB的通信线上挂上拉电阻,为什么要这个上拉电阻呢?不要行吗?谈起这个USB的上拉电阻,我们还得从USB的插入检测机制说起,至于这个上拉电阻是挂在D+?还是D-还大有文章,请听我慢慢道来!

    USB主机是如何检测到,到插入的设备呢?在USB集线器的每个下游端口的D+ D-上,分别接了一个15K的下拉电阻到地,这样,当集线器的端口悬空没有设备插入时,输入端就被这两个下拉电阻拉到了低电平,而在USB的设备端,在D+或者D-上接了一个1.5K的上拉电阻到3.3V的电源,1.5K的上拉电阻是接在D+还是D-上,有设备的速度来决定,对于全速设备和高速设备,上拉电阻是接在D+上的,而低速设备的上拉电阻则是接在D-上。

    image.png

                                                                                      USB传输速度

    当设备插入到集线器时,接了上拉电阻的那条数据线的电压由1.5K的上拉和15K的下拉分压决定,结果大概在3V(3.3/1.5+15)* 1.5=3V),这对于集线器的接收端来说,是一个高电平信号,集线器检测到这个状态后,它就报告给USB主控制器,这样就检测到设备的插入了,集线器根据检测到的被拉高的数据线是D+还是D-来判断插入的是什么速度类型的设备,USB高速设备先是被识别为全速设备,然后通过集线器和设备的通信确认,再切换到高速设备,在高速模式下,是电流传输模式,这时要将D+上的上拉电阻断开。

    image.png


    USB速度检测

    可以做一个简答的实验,用一个10K的上拉电阻接在USB的+5V和D+/D-上,电脑会提示发现新硬件,但是无法找到驱动程序,这时因为D+/D-被拉高,集线器就认为有设备插入了,它就报告给主机,但是主机获取数据却没有响应,就会得到一个无法识别的USB设备,这时你的设备管理器就会显示一个未知USB设备。

    换句话来讲,这个如果这个1.5K是其他值,那么D+/D-上拉分压之后的电平就会发生变化,如果再遇到电压纹波,那么就有可能不会被检测到,这个就是1.5K的由来,你明白了吗?




    收藏 0 回复 0 浏览 582
×
蔡琰