发帖数

53

原创数

53

关注者

11

阅读数

9161

点赞数

1

黄忠

  • 单片机电源管理

    大家好,我是张飞实战电子的黄忠老师,今天我们来讲解单片机电源管理。

    市场上的产品越来越多的低功耗需求,对于单片机的电源管理就要求越来越高,关注度自然也会增加。

    一起看一下Cortex-M3对于电源管理的一些特性吧。

    1、休眠模式

    Cortex-M3提供的休眠模式为一种电源管理特性,在休眠模式中,系统时钟可能会停止,而自由运行时钟输入仍可能在运行,以便处理器可由中断唤醒。

    处理器有下面两种休眠模式:

    休眠:Cortex-M3处理器的SLEEPING信号表示休眠状态

    深度休眠:Cortex-M3处理器的SLEEPDEEP信号表示深度休眠状态

    NVIC系统控制寄存器的SLEEPDEEP位决定休眠模式的类型。

    休眠模式由等待中断(WFI)或等待事件(WFE)指令触发,事件可以是中断、之前触发的中断或者通过接收事件(EXEV)信号生成的信号脉冲。处理器内部具有事件锁存,因为之前的时间也可以将处理器从WFE中唤醒。

    图片4.jpg

    根据芯片的不同设计,进入休眠模式后处理器的实际动作可能会不同,不过一般是停止一些时钟以降低功耗,或者可能的话将芯片整个关掉,所有的时钟信号也会因此停止。在芯片被完全关掉的情况下,只能通过系统复位唤醒系统。

    1、退出休眠特性

    休眠模式的另外一个特性为它可以被设置为在退出中断程序后自动回到休眠。这样若没有需要处理的中断,内核就可以一直保持休眠状态。要使用这个特性,我们需要设置系统控制寄存器里的SLEEPONEXIT位。

    应该注意的是,若使能了退出休眠特性,处理器可以在任何异常退出时进入休眠,即便是没有执行WFE/WFI指令。要确保处理器只在需要时进入休眠,那么若系统未准备好进入休眠,就不要设置SLEEPONEXIT位。

    2、唤醒中断控制器

    唤醒中断控制器(WIC)在Cortex-M3中作为一种可选单元出现,它被连接到已有的NVIC上,并且在中断到达时产生唤醒请求。

    从软件的角度来看,WFIWFE的效果是一样的。WIC中没有可编程寄存器,它可以从NVIC的接口上得到所需的所有信息。通过WIC的使用,进入处理器内核的时钟信号可以完全停止。当有中断请求到达时,WIC会向芯片中的系统控制器或电源管理单元(PMU)发出唤醒请求,通知芯片恢复处理器时钟。

    图片5.jpg


    收藏 0 回复 0 浏览 152
  • 聊一聊单片机堆栈


    大家好!我是张飞实战电子黄忠老师!今天给大家聊一聊单片机堆栈.

    单片机堆栈是什么?

    简单来说是在RAM区的一块存储空间,在系统空间中用作临时数据存储,遵循后进先出的原则。

    栈空间操作的关键点之一就是栈指针寄存器,每次执行栈操作时,栈指针的内容自动调整。

    按照通常的说法,向栈中存储数据称为“压栈”(使用PUSH指令),恢复数据称为“出栈”(使用POP指令)。根据所使用架构的不同,有些处理器在向栈存入数据时地址会自动增加,而有些则会减小。

    这就意味着栈指针始终指向栈空间的最后一个数据,在执行数据存储前(PUSH),栈指针会首先减小。

    PUSHPOP通常用在函数或子程序的开始和结尾处。在函数开始执行时,PUSH操作将寄存器的当前内容存入栈空间;执行结束前,POP又将栈空间存储的数据恢复。一般说来,对每个寄存器的PUSH操作都应相应的进行POP操作。否则恢复的数据可能无法对应之前的寄存器,这样会导致无法预期的后果,比如栈溢出。

    下面看一下压栈和出栈的操作过程:

    图片1.jpg


    再来说一下堆栈的作用:

    子程序调用和中断服务时,CPU自动将当前PC值压栈保存,返回时自动将PC值弹栈。

    保护现场/恢复现场。

    数据传输

    再来说一下堆栈操作的一些规则。

    比如Cortex-M0处理器每次出栈以及压栈操作的最小单位是4字节(32位),还可以使用一条指令实现对多个寄存器的压栈和出栈操作。显然Cortex-M0的栈空间被设计为字对齐的(地址值必须是4的倍数,比如0x00x40x8等)。

    对于Cortex-M0处理器,可以通过R13SP访问R13SP,根据处理器状态和CONTROL寄存器值的不同,访问的栈指针可以是主栈指针(MSP),也可以是进程栈指针(PSP)。许多简单的应用只会用到一个栈指针,一般默认是主栈指针(MSP),进程栈指针通过只用于嵌入式应用的操作系统(OS)。

    对于Cortex-M0处理器由于栈是向下生长的(满递减),内存的上边界通常会被用作栈指针的初始值。例如,如果内存区域为0x20000000~0x20007FFF,我们可以将栈指针的初始值设为0x20008000,在这种情况下,第一次压栈操作会将数据存至0x20007FFC开始的字中,这也是内存的最高4字节。


    收藏 0 回复 0 浏览 261
  • 你知道USB的NRZI编码吗?

     大家好!我是张飞实战电子黄忠老师!今天给大家分享USB的NRZI编码。

    标准的USB连接线使用4芯电缆:5V电源线、差分数据线D-、差分数据线D+、以及GNDUSB协议规定,设备在未配置前,可以从Vbus上最多获取100mA的电流,在配置之后,最多可以从Vbus上获取500mA的电流)。

    USB OTG中,又增加了一种MINI USB接头,使用的是5根线,比标准的USB多了一条身份识别(ID)线,USB使用的是差分传输模式,因而有2条数据线,分别是D+D-。在USB的低速和全速模式中,采用的是电压传输模式;而在高速模式下,则是用电流传输模式。

    USB2.0支持3中传输模式,低速模式(1.5Mb/s)、全速模式(12Mb/s)、高速模式(480Mb/s)、传输速度是指总线上每秒传输的位数,实际的数据速率要比这个速度低一些,因为还有很多的协议开销。

    USB使用的是NRZI编编码方式,NRZI编码是一种映射一个二进制信号的方法,以便通过USB线缆传输该信号,在该编码方案中,当数据为0时,电平翻转,数据为1时,电平不翻转。如下图所示。顶部是将要通过 USB 传送的数据。底部是编码的 NRZI 数据。

    image.png

    为了防止出现长时间电平不变化(这样不利于时钟信号的提取),在发送数据前要经过位填充处理。通过在 6 个连续的逻辑 1 后面插入一个逻辑 0 可以实现位填充。位填充是为了通过保持锁相环(PLL)对 USB 硬件进行同步化。如果该数据内有太多的逻辑 1,那么 NRZI 编码流中将没有足够用于实现同步化的转换。USB 硬件上的接收器会自动检测额外位,并忽略它。该额外位填充是引起 USB 上的额外开销的原因。下图显示的是一个带有位填充的NRZI 数据的示例。请注意,“Data to Send”(将要发送的数据)流为 8 个逻辑 1。在该编码数据中,在第六个逻辑1 后面插入了一个逻辑 0。这样,第七和第八个逻辑 1 将位于逻辑 0

    image.png

    经过位填充后的数据,由串行接口引擎SIE将数据串行化和NRZI编码后,发送到USB的差分数据线上。在接收端,刚好是一个相反的过程。接收端采样数据线,由SIE将数据并行化(反串行化),然后去掉条重围(反位填充),恢复处原来的数据。

    通常我们使用现成的USB芯片,如位填充、串行化、反串行化、CRC校验等处理过程,芯片内部的硬件已经帮我们做好了,因此可以不用关心这些细节。但是往往知道这些细节,在处理问题的时候,非常有用。你会了吗?


    收藏 0 回复 0 浏览 335
  • 什么是USB的描述符?


    USB只是一个总线,只提供一个数据通路而已。USB总线驱动程序并不知道一个设备具体如何操作,有哪些行为。具体的一个设备实现什么功能,要由设备自己来决定。那么,USB主机是如何知道一个设备的功能以及行为呢?这就要通过描述符来实现了。那么什么是USB的描述符呢?其实就是一些传递的协议信息,比如设备的类型、厂商ID、产品ID、端点情况、版本号等信息。

    既然描述符是协议信息,那么不同的版本也会有所不同,比如USB1.1协议定义的标准描述符有设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符、类特殊描述符以及厂商自定义的描述符。那么USB2.0协议中又增加了两个新的标准描述符有设备限定符描述符和其他速度配置描述符。随着USB协议版本的提升,大家知道都是为了提升速度和可靠度,让用户有更快更高效的体验。那么USB1.1是全速设备,现在我们一起看下USB1.1协议定义的描述符吧。

    一个USB设备只有一个设备描述符。设备描述符里决定了该设备有多少种配置,每种配置都有一个配置描述符;而在每个配置描述符中又决定了该配置里有多少个接口,每个接口都有一个接口描述符;在接口描述符里又定义了该接口有多少个端点,每个端点都有一个端点描述符;端点描述符定义了端点的大小、类型等。如果有类特殊描述符,它跟在相应的接口描述符之后。由此可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,接下来是配置描述符,再下来是接口描述符,最下面是端点描述符。在主机获取描述符时,首先获取设备描述符,接着再获取配置描述符,然后根据配置描述符中的配置集合的总长度,一次将配置描述符、接口描述符、类特殊描述符(如果有)、端点描述符一次读回。对于字符串描述符,是单独获取的。主机通过发送获取字符串描述符的请求以及描述符的索引号、语言ID来获取对应的字符串描述符。

    设备描述符主要记录的信息有:设备所使用的USB协议版本号、设备类型、端点0的最大包大小、厂商IDVID)和产品IDPID)、设备版本号、厂商字符串索引、产品字符串索引、设备序列号索引、可能的配置数等。

    配置描述符主要记录的信息有:配置所包含的接口数、配置的编号、供电方式、是否支持远程唤醒、电流需求量等。

    接口描述符主要记录的信息有:接口的编号、接口的端点数、接口所使用的类、子类、协议等。

    端点描述符主要记录的信息有:端点号及方向、端点的传输类型、最大包长度、查寻时间间隔等。

    字符串描述符主要是提供一些方便人们阅读的信息,它不是必需的。

    说了半天,也许你还没搞清楚到底设备、配置、接口、端点等这些是什么东西。不要急,这些东西的确是有点晕人。特别是刚接触时,这么多的内容很容易让人搞混,或者似乎是懂了,然后再想想,似乎又没懂……这些所说的设备,就是一个实实在在的USB设备,例如一个USB鼠标。设备有一个设备地址,USB主机依靠这个设备地址来访问设备。而在设备内部还会分的更细。它会分出一些端点出来,例如端点0、端点1等。就是说,如果USB主机要和USB设备通信,光有设备地址是不够的,还需要一个端点地址。有了设备地址和端点地址,就能准确地对端点发送和读取数据了。好比你要去找8号教学楼的605教室,8号楼就是设备地址,而605教室就是端点地址。而配置和接口,是为了更方便地管理端点而抽象出来的概念。一个设备可以有多个配置,但是同一时刻只能有一个配置有效。每个配置下又可以有多个接口。当我们需要不同的功能时,只要选择不同的配置即可。拿刚才的教学楼来说,我们可以把它分成两个配置:平时上课用和考试用。考试用时,全部的教室都拿来作考场(即该配置下只有一个接口,接口下有很多端点---教室);而平时上课用时,分成两类(即该配置下有两个接口,每个接口下有一些端点---教室):教师休息室和上课的课室。教师休息室和课室是不能共用的(这在USB中也是如此,同一个端点号不能出现在同一个配置下的两个或者更多个不同的接口中)。但是平时用来做课室或者休息室的教室,考试时都可以拿来作考场(这在USB中也是如此,同一个端点号可用在不同的配置中)。具有多个接口并由接口来实现功能的设备把它叫做USB复合设备,例如一个USB音频设备,它具有一个音频控制接口,另外还可能具有一到多个音频流或MIDI流接口。在主机端会把USB复合设备的每个接口当作一个功能设备来看待。像常见的USB鼠标、U盘等,通常是单一的设备,即一个设备下只有一个配置描述符、一个接口描述符。

    总结一下:由端点构成一个接口(或者反过来说,接口是端点的集合),由接口又构成一个配置(反过来说,配置是接口的集合),再由配置构成一个设备(设备是配置的集合)。学习USB,一定要把这些关系理清楚了,才能按照需要构造出一个合格的USB设备。如果一个设备的各种描述符成功返回了,那么可以说已经成功了大半。相反,只要描述符出现一点问题,哪怕只是一个bit的错误,都可能造成设备无法识别或者无法正常工作。


    收藏 0 回复 0 浏览 75
  • 什么是单片机的闩锁效应?

    大家好!我是张飞实战电子黄忠老师!今天给大家分享什么是单片机的闩锁效应?

    什么是“闩锁效应”?这个词儿对我们来讲可能有点陌生。从构造上来看,单片机由大量的PN结组成。有一个由四重结构“PNPN”组成的部分,其中连接了两个PN结。PNPN的结构是用作功率开关元件的“晶闸管”的结构,并且单片机中的PNPN部分被称为“寄生晶闸管”。
        晶闸管由三个端子组成:阳极(正极),阴极(负极)和栅极(门)。通常,电流不从阳极流向阴极,但是当信号输入到栅极时,电流从阳极流向阴极。一旦电流开始流动,除非电源关闭,否则它将继续流动。由于此时的导通电阻非常小,因此流过大电流。在单片机的寄生晶闸管中发生相同现象的现象称为“闩锁”。
        当单片机发生闩锁时,大电流流入内部,不仅导致无法正常工作,而且还可能导致单片机内部的导线熔化并损坏元件。如果使用正确,将不会发生闩锁,但是如果您错误地启动电源或陡峭的高压噪声进入引脚,则会发生闩锁。图1是单片机表面上的金属布线的图片,该金属布线实际上已被闩锁电流熔化。

    图片1.jpg

    一、晶闸管结构是什么样的?
    2显示了晶闸管(PNPN)的结构。当将正电势施加到阳极而将负电势施加到阴极时,由于J1和J3为正向,而J2为反向,因此没有电流从阳极流向阴极。

    图片2.jpg

    然而,当将电压施加到栅极并且电流流动时,J2的反向电流被栅极电流加速,并且电流流过J2。由于J1和J3本质上是向前的,因此当发生这种现象时,电流开始从阳极流向阴极。一旦电流开始流动,除非阳极电源关闭,否则它将继续流动。这是晶闸管切换操作。利用这种操作,晶闸管被用作电力设备中的开关元件。PNPN结被认为是PNP晶体管和NPN型的组合,如图2-b所示。电路图显示了如图2-c所示的双晶体管配置。Tr1的发射极(E)成为晶闸管阳极,基极是Tr1的集电极(C),Tr2的基极(B),阴极是Tr2的发射极(E)。

    二、闩锁发生的机理?
    3显示了应用于单片机CMOS中的两个晶体管。

    图片3.jpg

    上图中的示例适用于N型衬底。此外,存在P型衬底的情况,但在两种情况下均会形成寄生PNPN结,因此可以以相同方式考虑闩锁的原理。Tr1由PMOS的源极的P沟道形成,该PMOS的源极连接到N型衬底的电源,然后再连接到P阱。然后,Tr2由从N型衬底连接到P阱和GND的NMOS源极的N够到路径形成。

    Tr1和Tr2形成为如图3的CMOS中的黄线所示。电源侧为阳极,GND侧为阴极,而栅极等效于NMOS P阱。CMOS输入线连接到NMOS的栅极。栅极和P-WELL在插入栅极氧化膜的情况下形成与电容器相同的结构。电容器很容易通过高频信号,因此,如果噪声进入输入线,并且噪声的dV/dt大(高频分量大),则它会穿过栅氧化膜并到达P阱。这将触发PNPN结导通,从而导致大电流从电源流向GND。
    另外,如果电源线急剧波动,特别是如果它向负侧波动,则栅极电压将高于电源电压,并且状态将与噪声进入栅极时相同。如果在建立单片机的电源之前在端子上施加了电压,则会发生此状态。

     


    收藏 0 回复 0 浏览 198
×
黄忠