发帖数

53

原创数

53

关注者

11

阅读数

10801

点赞数

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 浏览 176
  • USB的四种传输类型之中断传输等时传输

    USB协议规定了4中传输类型:批量传输,等时传输,中断传输和控制传输.我们已经有相关文章介绍了批量传输,接着下面我们来说说中断传输和等时传输.

    中断传输是一种保证查询频率的传输中断端点在端点描述符中要报告它的查询间隔,主机会保证在小于这个时间间隔的范围内安排一次传输这里所说的中断,跟我们硬件上的中断是不一样的。它不是由设备主动地发出一个中断请求,而是由主机保证在不大于某个时间间隔内安排一次传输。中断传输通常用在数据量不大,但是对时间要求较严格的设备中,例如人机接口设备(HID)中的鼠标、键盘、轨迹球等。中断传输也可以用来不断地检测某个状态,当条件满足后再使用批量传输来传送大量的数据。除了在对端点查询的策略上不一样之外中断传输和批量传输的结构基本上是一样的,只是中断传输中没有PINGNYE两种包。中断传输使用中断事务(interrupt-transaction),中断事务的流程图如图1所示

    image.png

    等时传输(同步传输)用在数据量大、对实时性要求高的场合,例如音频设备、视频设备等,这些设备对数据延迟很敏感。对于音频或者视频设备来说,对数据的100%正确要求不高,少量数据的错误还是能够容忍的,主要的是要保证不能停顿;所以等时传输是不保证数据100%正确的。当数据错误时,并不进行重传操作。因此等时传输也就没有应答包。数据是否正确,可以由数据包的CRC校验来确认。至于出错的数据如何处理,由软件来决定。等时传输使用等时事务(isochronous-transaction)来传输数据。图2是等时事务的流程图

    image.png

    以上就是中断传输和等时传输了,你明白了吗?


    收藏 0 回复 0 浏览 173
  • 如何学好嵌入式系统中的C语言编程

    大家好,我是张实战电子黄忠老师;今天我们来学习如何学好嵌入式系统中的C语言编程。

    1、真正深刻地认识存储器

    .诺伊曼说过“程序等于算法加数据结构”。首先,算法是什么?算法是通过存储在存储器中的程序代码实现的。其次,数据结构又是什么?数据结构是存放在存储器中的各种类型的数据。程序本质上就是处理器通过执行存放在存储器中的程序代码对存放在存储器中的数据进行操作和变换的过程。在这个过程中除了处理器本身外,最核心的环节就是存储器。因为不管是程序的可执行代码还是数据都是存放在存储器中的。撇开代码、变量、数组、指针、结构、堆栈等这些软件中的各个元素的表象,剩下的本质就是存储器!因此,理解C语言的关键是真正理解存储器。

    每一个存储单元都有两个属性:一是存储器里面存放的内容,二是存储器的地址。这个内容可以是代码,也可以是数据,甚至是另一个存储单元的地址(这个时候往往我们称这个存储单元放的是一个指针)。

    2、认识和理解嵌入式C编程环境

    嵌入式软件开发的 一个非常重要的特点就是交叉编译,也就是开发工具运行的环境和被调试的程序不是运行在同一个硬件平台(处理器)上的。一般而言编译器、汇编器、链接器等工具链软件以及调试工具都运行在通用的PC机平台上;调试工具通过一定的通信手段将链接器输出的可执行文件下载到嵌入式系统开发板(一般称为目标系统)的存储器中,并通过一定的机制控制和观测目标系统的寄存器、存储器等。这个开发过程往往需要使用多种不同的工具,对此初学者很容易感到困惑。只有真正理解开发过程中各个环节的作用,才能对嵌入式系统C编程有深入的认识。

    另一个问题是,虽然C语言是一门高级语言,但是想真正用好C语言,程序员必须对编程过程中所使用的工具非常了解,清楚地知道每个工具的作用以及这些工具与硬件平台的相互关系。比如:编译器是如何处理全局变量和全局数组的?对于全局变量的处理与局部变量有什么不同?编译器是如何利用堆栈进行传递参数的?又比如:C语言的编译器、链接器是如何处理一个项目中多个C文件之间的相互依赖关系的?链接器最终是如何生成可执行文件的?可执行文件的内存映像又是如何安排的?这些问题初看起来似乎与C编程本身没有什么关系,但因为在嵌入式软件的开发过程中程序员要经常直接和底层的设备与工具打交道,所以一个嵌入式软件的程序员应该对这些问题了如指掌。

    图片18.png 

    3、认识和掌握C语言中的常见陷阱

    C语言不是一门面向初学者的编程语言,C语言发明者的初衷是希望设计一种面向编译器和操作系统设计的高级语言,因此C语言中充满了各种各样对于初学者而言的陷阱。这些陷阱一方面来自于C语法本身的灵活性,另一方面来自于C对存储器边界的不检查,因此非常容易在代码中造成存储器越界访问的问题。在C语言中,最容易出错的地方是与存储器相关的内存访问越界以及内存泄漏的问题,C语言的使用者必须非常小心地规避这些陷阱。

    4、掌握C语言程序设计过程中的调试方法

    任何程序在编写的过程中都需要调试,尤其对于比较复杂的系统更是如此。面对程序编写过程中出现的问题,比较现实的问题应该是如何在最短的时间内发现程序错误的根源,修改这个错误,并且吸取教训争取在以后的程序中不再犯同样的错误。在这个环节中最重要也是最需要技巧的工作就是找到问题的根源。虽然很少有相关的参考书介绍这方面的内容,但事实上,程序的调试是有一定的方法和技巧的。

    20.png 


    收藏 0 回复 0 浏览 162
  • 抛开CRC校验的“神秘面纱”

    大家好!我是张飞实战电子黄忠老师!今天给大家抛开CRC校验的“神秘面纱”!

    模2运算是一种二进制算法,CRC校验技术中的核心部分。与四则运算相同,模2运算也包括模2加法、模2减法、模2乘法、模2除法四种运算。


    与四则运算不同的是模2运算不考虑进位和借位,模2运算是编码理论中多项式运算的基础。下面我们就来看一看什么是模2运算。


    模2运算使用与四则运算相同的运算符,即“+”表示模2加,“-”表示模2减,“×”或“·”表示模2乘,“÷”或“/”表示模2除。与四则运算不同的是模2运算不考虑进位和借位,即模2加法是不带进位的二进制加法运算,模2减法是不带借位的二进制减法运算。这样,两个二进制位相运算时,这两个位的值就能确定运算结果,不受前一次运算的影响,也不对下一次造成影响。


    “模2加法”就是0和1之间的加法,其中0+0 =0,1+0 =0+1 =1,1+1=0。这种运算是比较常用的,并不神秘。对于任意多个数a1,a2,…,an(每个都是0或1),可以把它们做模2加法a1+a2+…+an。当这n个数中有奇数个1时,结果为1,否则结果为0。例如0101+0011=0110,列竖式计算:

    image.png

    模2减法是一种不考虑借位的减法,其定义如下:0-0=0,1-1=0,1-0=1,0-1=1。同样,第四式代表了模2减法的特征。在多位模减法中,每位都按上述定义进行运算,不考虑借位问题。根据上面减法可以得出一个结论:奇数个1相减得1,偶数个1相减得0。例如0110-0011=0101,列竖式计算:

    image.png

    一位数的模2乘法定义如下:0*0=0,0*1=0,1*0=0,1*1=1,多位数的模2乘法与普通乘法一样演算,区别是,部分积相加时按模2加,即奇数个1相加得1,偶数个1相加得0。例如1011×101=100111,列竖式计算:

    image.png

    模2除法是模2乘法的逆运算,定义如下:0÷1=0,1÷1=1,类似于普通的多位二进制除法,但是在如何确定商的问题上两者采用不同的规则。普通多位二进制除法按带借位的二进制减法,根据余数减除数够减与否确定商1还是商0,若够减则商1,否则商0。多位模2除法采用模2减法,不带借位的二进制减法,因此考虑余数够不够减除数是没有意义的。实际上,在CRC运算中,总能保证除数的首位为1,则模2除法运算的商是由余数首位与除数首位的模2除法运算结果确定。因为除数首位总是1,按照模2 除法运算法则,那么余数首位是1就商1,是0就商0。例如1011÷101=110101...001,列竖式计算:

    image.png

    模2算术是编码理论中多项式运算的基础。大家一定要掌握哦,下篇文章我们就一起看看它到底在CRC中是如何发挥作用的。

    收藏 0 回复 0 浏览 152
  • 单片机的异常处理

    大家好!我是张飞实战电子黄忠老师!今天给大家分享单片机的异常处理

    ARM处理器中,如果一个程序产生了错误并且被处理器检测到,这是就会产生错误异常。

    错误是怎么发生的呢?

    许多可能的原因都会引起错误发生,比如对于存储器相关错误,总线系统的异常响应可以有以下原因:

    访问的地址非法;

    由于传输的类型非法,总线的从设备不接受此次传输(从设备决定)

    由于传输未使能或初始化,总线的从设备无法进行此次传输(例如,如果外设的时钟被关闭,那么访问这个外设时,微控制器就可能会产生错误响应)。

    当确定了硬件错误异常的直接原因以后,我们可能还得花费一些时间来确定问题的根源。例如,总线错误可以由很多种情况引发,例如错误的指针操作、栈空间损坏、内存溢出、非法存储器映射以及其他原因。

    分析错误

    根据错误类型的不同,通常能够直接确定引起硬件错误异常的指令的位置。要实现这个目的,就需要知道进入硬件错误异常时的寄存器的内容,以及异常处理前压入栈中的寄存器的内容。这些值中包含了程序返回地址,通过它也能知道引起错误的指令地址。

    如果使用了调试器,那么可在工程中创建硬件错误异常处理,并且在其中添加一个用以暂停处理器的断点指令;或者也可以在硬件错误异常处理的开始部分设置一个断点,这样当硬件错误发生时,处理器就会自动暂停。在处理器由于硬件错误暂停后,我们就可以尝试着按照下面图的流程对错误进行定位。

    image.png

    为了给分析提供更多的信息,也可以生成程序映像的汇编代码,并且利用在栈帧中找到的PC值确定错误的位置。如果错误的地址为存储器访问指令,就应该检查寄存器的值确定存储器访问的地址是否合法。除了检查地址范围,也应该确认存储器的地址是否正确地对齐。


    除了压入栈中的PC值(返回地址),栈帧中也包含了其他有助于调试的寄存器值。例如,压入栈的IPSR能够反映处理器是否在进行异常处理,EPSR则代表了处理器状态(EPSR的T位为0,则表示错误由意外切换至ARM状态引起)。


    栈中的LR也可能会提供一些信息,例如发生错误的函数的返回地址,错误是否发生在异常处理中,以及EXC_RETURN的值是否被异常破坏等。


    另外,当前的寄存器值也可以提供有助于定位错误原因的各种信息,除了当前栈指针的值,当前的链接寄存器的值也可能有帮助。如果LR中为非法的EXC_RETURN的值,这就意味着它在前面异常处理中被错误地修改了。


    CONTROL寄存器也可以提供帮助。在没有OS的简单应用程序中,进程栈指针(PSP)不会被用到,并且CONTROL寄存器会一直保持为0。如果CONTROL寄存器被设置为0x2(PSP用于线程状态),这就意味着LR在之前的异常处理中被错误地修改了,或者栈内容被破坏导致了EXC_RETURN的值错误。


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