MCU

MCU是Microcontroller Unit(微控制器单元)的缩写,它是一种集成了中央处理器(CPU)、存储器(ROM、RAM)、输入/输出端口(I/O)、定时器(Timer)、串行通信接口(UART、SPI、I2C等)和其他外围设备控制器的单个芯片。MCU通常用于嵌入式系统中,用于控制各种电子设备和系统。

由于其集成度高、体积小、功耗低以及成本相对较低等特点,MCU被广泛应用于各种嵌入式系统中,例如智能家居设备、医疗设备、汽车电子系统、工业自动化等。MCU的选择通常基于应用的需求,如处理性能、功耗、外设接口等因素。

一、区别 

两则的分流造成的主要原因是数字信号处理的简便性,考虑一个数字信号处理的实例,比如有限冲击响应滤波器(FIR)。用数学语言来说,FIR滤波器是做一系列的点积。取一个输入量和一个序数向量,在系数和输入样本的滑动窗口间作乘法,然后将所有的乘积加起来,形成一个输出样本。 
 
类似的运算在数字信号处理过程中大量的重复发生,使得为此设计的器件必须提供专门的支持,促进了DSP器件与通用处理器(GPP)的分流:

1、对密集乘法的支持 

2、存储器结构

此外,DSP处理器几乎都不具备数据的高速缓存。这是因为DSP的典型数据是数据流。也就是说,DSP处理器对每个数据样本做计算后,就丢弃,几乎不再重复使用。

3、零开销循环 
 
DSP算法的一个共同的特点,即大多数处理时间都花在执行较小的循环上,也就容易理解,为什么大多数的DSP都有专门的硬件,用于零开销循环。所谓的零开销循环是指处理器在执行循环时,不用花时间去检查循环计数器的值,条件转移到循环大额顶部,将循环计数器减1。

与此相反,GPP的循环使用软件来实现。某些高性能的GPP使用转移预报硬件,几乎达到与硬件支持零开销循环同样地效果。

二、联系 
 
按照传统方式,嵌入式应用中的数字信号处理器(dsp)相对于主微控制器起到从属的作用。在这些应用中,MCU用作系统控制器,而大量的数据处理留给DSP。例如,在音频或视频处理器应用中有可能需要人机界面管理,或则是整个系统的控制。 
 
为完成这些任务,有几种系统设计方案选择。 
 
第一种方案是将DSP和MCU芯片组合在印制电路板上。这种方案成本高并且占用面积大,但是可适当地调整每个芯片的尺寸以最大限度的满足系统需要。   
 
第二种方案是将DSP功能合并到一个MCU中。这种方案只适合于直接的信号处理应用。MCU的时钟频率和计算体系结构根本上不太适合大量的数字处理。有些MCU试图通过增加一个乘法和累加器(MAC)(dsp一个特点)来补偿上述不足。但是这种方案任然缺乏高级应用所需要的基本的“由上至下”的体系结构设计。 
 
第三种方案是一种将dsp和MCU组合在单个封装内的多芯片模块(mcm)。这种方案的局限性是,设计工程师必须按“50/50”的时间比例分配给控制和DSP功能;例如,一旦DSP超出时间,MCU不能完成计算任务。像第一种方案选择一样,当DSP和MCU内核独立存在的时候,需要两套开发工具。 
 
已经出现第四种方案它是将MCU的功能合并到一个DSP中。这类方案的一个例子是美国模拟器件公司(Anolog Device Inc.,简称ADI)的Blackfin 处理器系列。这些新型处理器具有统一的经过优化的体系结构,不仅适于数据计算,而且也适于有关的控制任务。通过平衡执行控制任务与复杂计算的要求,这种方案可以根据系统实时处理的需要,完成100%的控制或者100%的计算任务。完成所有这一切任务不需要在DSP模式和MCU模式之间的模式转换。 

DSP和MCU  

首先让我们回顾一下DSP和MCU的典型功能。DSP主要是在一单个时钟周期内尽可能完成多个MAC(乘法和累加)操作。为了这一点,指令的操作代码通常是可变的超长的指令字(VLIW)。DSP也适于工作在紧密、高效的环路中。另外,为了达到性能指标通常需要编写优化的汇编代码。由于DSP的算法程序一般装在小容量、短等待时间的内置存储器中,所以代码密度通常不是大问题。像DSP主要用于完成计算一样,MCU主要用于完成控制功能。同样地,典型的MCU应用包括许多条件操作,在程序流程中频繁地跳转。通常使用C或者C++语言编写程序。代码密度极为重要,并且根据编译代码的长度来评估算法。存储器系统是基于高速缓存从而允许该系统设计工程师用较长等待时间从较大的存储器中调用较大程序。利用基于高速缓存系统,程序员不需要考虑如何以及何时将指令输入到内核去执行。

统一的DSP和MCU兼备两者的优点。它的指令集由16 bit,32 bit和64 bit操作码组成,但是由于最常用的指令采用16 bit编码,所以编译代码密度大小与那些流行的MCU相同。另外,它包括一个存储器保护功能以及指令高速缓存和数据高速缓存,作为整个存储器管理单元(MMU)的一部分。此外,容易提供一套完整的C/C++开发工具,提供可选汇编语言或者全部汇编语言适合算法优化的编程。  
  
RTOS 

系统控制的一个重要方面是任务管理。实时操作系统(RTOS)逐渐地用于控制复杂系统中多种正在进行的和同时发生的任务。通过提供对任务调度与管理的支持,RTOS简化了编程模式,这通常是由MCU控制的,由于普通的DSP不具备支持RTOS需要的所有功能以便有效地控制。 

然而,统一的DSP和MCU促进了RTOS几个重要功能的发展。第一个是限制访问功能以保护或者保留存储单元。第二个是配备单独的堆栈和帧指针以减少操作系统(OS)请求以及中断和异常处理所需的等待时间。第三个是具备单独的用户操作模式和管理员操作模式。过去,DSP按照等效于管理员操作模式工作,从而允许在任何时间完全访问所有的系统资源。然而MCU提供类似的在用户操作模式,它允许在OS的顶层运行应用软件。现在,在一个统一的体系结构下提供两种操作模式,因为增强的DSP系统能够限制用户应用软件仅通过OS访问系统资源。 

MCU的一个优点是包含使用灵活和种类齐全的外围设备。作为通用的嵌入式控制器,它们通常具备可编程输入输出(I/O)标志、定时器、串行接口和日益增加越来越复杂的标准接口。MCU外围设备的主要作用是嵌入式控制,而不是大量计算。例如,一个实时时钟信号可以唤醒一只温度传感器用以采集环境温度并且将一个延迟的信息通过I/O引脚反馈到MCU。然后,一个定时器的脉冲宽度调制(PWM)输出相应地能够增加或者减小风扇电机的转速。像MCU一样,统一的DSP和MCU具备一套系统控制外围设备(例如,实时时钟、多功能定时器、监视定时器、双向标志位引脚)。然而,它还包括一些高速接口(例如,PCI、异步或者同步存储器控制器、USB、并行视频接口)以便通过这些接口,与许多DMA通道配合快速搬移数据,从而有助于有效利用高速DSP内核的信号处理能力。 

功耗控制一直是嵌入式控制器的一项功能。但是,当系统要求DSP具有优良的性能时,对其电源的选择就不太理想。如果将独立的MCU和DSP芯片应用于电源敏感的场合,通常必须为每个芯片提供一个单独的开关稳压器,因为这两个器件的内核电压经常不一致。这会导致降低电源变换效率和增加设计器件的引脚数目,最终增加布线的复杂程度和解决方案的成本。此外,当MCU和DSP的内核集成到一个芯片上时,电源解决方案本质上不是最佳的,因为它必须满足2个完全独立并具有不同负载特性处理器的需求。将这种情况与统一的DSP和MCU相比较,它包含一个集成动态电源管理(DPM)控制器。由于它是只有一个处理器的体系结构,所以该控制器能够完全适合给定应用的需求。它提供几种固有的电源模式以支持多种系统性能等级。另外,对于未使用的时钟和L2存储器可选择性地禁止。该PLL的频率可在一个宽范围(通常1倍~31倍)进行调节,以满足在DSP和MCU内部多层次的处理需求。最后能够调节电压(外部或者通过一个集成的开关控制器)以提供指数式的节省功耗。由于系统成本、开发容易、器件采购和升级能力的原因,设计工程师正趋向采用一种单芯片解决方案用于嵌入式信号处理解决方案。这种单芯片解决方案必须能够同样好地完成DSP和MCU的功能,所以有必要提出一种统一的处理器体系结构。面对MCU的挑战,比较简单的解决方案是将MCU的功能合并到一个高性能的DSP内核,而不是与此相反。当今一个统一的DSP和MCU平台也已经投放市场,它将在MCU和DSP目前应用领域提供许多应用。 

围观 366

我们在从事MCU应用开发过程中,难免会碰到MCU芯片异常的问题,其中有些异常比较严重。比如异常复位,表现为复位脚有电平跳变或者干脆处于复位电平;在做代码调试跟踪时,发现代码根本就进不到用户main()程序;或者时不时就感觉芯片死掉了,功能完全不可控等。

出现类似严重异常情况的原因我大致总结了以下几方面:

1、电源问题。比方电源质量差,纹波过大,尤其开关电源供电时;或者供电芯片质量差,输出不稳定;或者系统供电能力不足而引起电源波动等。

2、时钟问题。一般表现在时钟配置错误或者时钟工作不稳定,比方配置超出芯片主频工作范围,外部时钟脆弱不堪等。

3、BOOT配置脚问题。经常遇到有人因为BOOT脚的焊接或接触不良导致各类奇怪问题。这种情况多表现在芯片功能时好时坏,工作不稳定。所谓“坏”的时候就是芯片表现得类似死机一般。

4、启动文件问题。经常因为选错了启动文件,导致程序无**常运行,或者说调试时好好的,脱机运行就出鬼。这点在做不同系列芯片间移植时最容易碰到。

5、中断请求位清除问题。由于中断请求位没有及时清除导致中断没完没了的重复进入中断,感觉系统死机一般。

6、堆或栈的越界溢出。这个也会导致芯片无**常工作。

7、VCAP脚问题。有些MCU芯片有VCAP脚,这类脚往往需要接上适当的电容,如果无视了它的话,也可能导致整个芯片的功能异常。

来源:网络

围观 504

从互联网、到移动互联网、再到物联网

从互联网、到移动互联网、再到物联网,连接的形态正在发生着翻天覆地的变化。

互联网时代,主要是电脑与网络间的连接;

移动互联网时代,则使得手机与电脑和网络连接在一起。

而物联网时代,将会让各种各样形态的智能产品,从手机、手表、手环等个人相关的产品,到汽车、音箱、空调等家用产品,再到智慧农业、智慧工业等相关的产品,都将进行相互连接。

物联网的发展瓶颈

据研究数据显示,到2020年,物联网连接的设备将达750亿台。这些产品间的互联,是实时而且是长久的,有些需要几年甚至几十年。

要实现这种互联,超低功耗 是物联网的关键要素之一。如何实现设备间的超低耗连接?是从无线连接技术、到芯片、传感器、微处器理等上游技术方案的优化,还是另辟蹊径,以全新的方式突破瓶颈?

NB-IOT 迎来物联网新突破 ?

近期在韩国召开的3GPP 标准会议顺利结束,NB-IoT对应的3GPP协议相关内容获得了RAN全会批准。

低功耗广域物联网传输速率能做到几百Kbps,覆盖要比现在的覆盖好100倍,可以连接到地下车库,可以在一个扇区内支持50万的连接。

而低功耗能实现一个电池就能支持一个物联网模块长达10年。

目前市场对NB-IoT期待还是比较大的,华为、爱立信、中兴等科技企业,全球电信运营商都已经着手布局NB-IoT技术,最快2017年迎来物联网新元年。

短距离无线技术纷纷升级

蓝牙技术、Zigbee、Wi-Fi,这三种目前主流短距离无线连接技术,蓝牙以点对点的超低低功耗见长,Zigbee以低功耗和MESH自组网见长,而Wi-Fi则以大数据高带传输见长。

而这三种方式以免实时收费的优势,在物联网中的发展定也占据一席之地。

为强化在物联网的应用,Wi-Fi联盟推出低功耗Wi-Fi技术,Zigbee联盟宣布Zigbee3.0获批。

在发布蓝牙4.2之后,前段时间蓝牙联盟也发布了2016年的技术蓝图。

对于蓝牙2016年的技术蓝图,蓝牙技术将实现更长通信距离、更快传输速度及Mesh联网功能。同时,宣传其开发工具Bluetooth Developer Studio上线以及发布全新蓝牙网关架构发布。

“今年,蓝牙技术的演进将进一步为包括智能家居、工业自动化、基于位置的服务和智能基础设施等高速增长行业注入更多动能。”蓝牙技术联盟开发者计划总监何根飞指出。

蓝牙: 提升距离、速度及MESH联网

在通信距离上,Bluetooth Smart的射程范围最多将可扩大4倍,改变智能家居和基础设施领域的应用,为整个室内空间或户外中的不同使用情境提供传输距离更长、连接品质更稳健的无线连接。传输速度在不增加功耗的情况下也将提升至当前的100%,可为关键性应用如医疗设备实现更快速地数据传输,以提高反应速度并降低时间延迟。而Mesh联网功能则能让蓝牙网络的覆盖范围得以遍及整栋建筑或整户住宅,使得范围内的蓝牙设备彼此互联,开启智能家居和工业自动化的更多应用可能。

同时,为了推动蓝牙设备与其他连接技术设备的连接,蓝牙技术联盟宣布推出传输发现服务(Transport Discovery Service;TDS),提供利于设备发现并连接的通用框架。未来,无论设备采用哪种无线技术,透过TDS,设备间能够实现彼此发现并连接。何根飞指出:“TDS让设备仅需最少的电量即可运行,将为物联网(IoT)解决了一项重要的难题。

此外,宣布开放蓝牙网关架构并推出入门工具套件,助力开发者快速为蓝牙产品创建互联网网关。具有蓝牙功能的传感器能透过蓝牙技术连接网关设备,向云端传递数据并进行数据交换。该架构让所有人都能对固定式的、具有蓝牙功能的传感器进行远程监测和控制,藉此扩展了物联网的潜在应用领域。

多功能无线产品也应运而生

在多种无线连接技术真正融合之前,仍存在着多种连接方式多方并存,竞争互补。此背景下,多功能无线产品也应运而生,众多厂商纷纷在 BLE、zigbee、470、WIFI等模块进行研发和优化。

物联网多元化发展芯片厂商将何去何从

随着物联网应用的多样化和应用需求的多元化,企业开始从专注于技术的提升转向如何更好地满足客户的需求。在推动物联网的连接应用上,MCU的发展又将如何转变?针对物联网领域的应用,低功耗、小引角、无线等是否会成为未来MCU的主流?实际应用中,MCU+传感器+合作伙伴软件的系统化方向又是否可行?

物联网爆点即将到来,你,准备好了吗?

文章来源:周立功单片机

围观 401

永磁同步马达(PMSM)通常用于高效能、低功耗的马达驱动。高效能马达控制的特征为可在整个速度范围内平稳旋转,零速度时有完全的扭矩(Torque)控制,且能达到快速加速和减速。为了达到上述要求,PMSM采用向量控制技术,该技术通常还被称为磁场定向控制(FOC)技术。向量控制算法的基本思路是将一个定子电流分解为磁场生成的分量和扭矩生成的分量,分解后,这两个分量能单独进行控制;而马达控制器(亦即向量控制控制器)的结构几乎与一个他励直流马达(DC Motor)相同,这样便简化了PMSM的控制程序。

扭矩生成定理

PMSM的电磁扭矩分别由定子及转子两个磁场交互作用生成。定子磁场由磁通量或定子电流表示,转子磁场由恒定的永久磁铁(弱磁情况除外)的磁通量表示。若将这两个磁场比喻为两个条形磁铁,则可以想象当磁铁互相垂直时,吸引/排斥磁铁的力是最大的。这意味着,设计人员应该要依此定理控制定子电流,也就是要创建垂直于转子磁场的定子向量。转子旋转时,也就必须更新定子电流,使定子磁通向量与转子磁铁保持90度垂直。

当定子和转子磁场垂直时,内嵌式PMSM的电磁扭矩方程式为:扭矩=33ppλPMIqs(pp为磁极对的数目,λPM为永久磁铁的磁通,Iqs则为交轴的电流幅值。)当磁场垂直时,电磁扭矩与q轴电流的幅值成正比。微控制器(MCU)须调节定子相电流强度,同时调节相位/角度,但这不像直流马达控制那样容易达成。

简化电流控制 创造最佳FOC效能

直流马达控制很简单,因为其所有受控的量都是稳定状态的直流电(DC)值,而且电流相位/角度受机械换向器的控制;但在PMSM领域中,要如何才能实现磁场定向控制技术?

DC值/角度控制

首先,须知道转子的位置,其常常与A相有关。我们可使用绝对位置传感器(如解析器)或相对位置传感器(如编码器),并处理所谓的「对齐」。对齐过程中,将转子与A相轴线对齐,如此一来A相轴线与直轴(励磁分量所在轴)就对齐。在这种状态中,转子位置设为0;亦即,构建静态电压向量,令所需的电压在d轴,位置设为0,这导致定子磁场吸引转子,并将直轴与A相轴线对齐。三相量可通过Clarke变换转换成等效的二相量。接着,再透过Park变换将两相静止参照系中的量转换成两相旋转坐标系中的直流量,这期间要用到转子位置。

转子的电气位置是转子的机械位置再乘以极对数pp。经过一系列控制之后,设计人员应当在马达端子上生成三相交流电压,因此所需/生成电压的直流值应当通过反Park/Clarke变换进行转换。

幅值控制

所有变量现在都是直流值,可以轻松控制,但是要如何控制它们的幅值呢?对于幅值控制,建议使用级联结构的PI控制器,且可以像直流马达那样控制许多状态量,如相电流(扭矩环)、转速和位置。

FOC步骤

首先,须测量马达的相电流,并使用Clarke变换将它们转换为两相系统,及计算转子位置角;接着,再使用Park变换将定子电流转换为d、q坐标系统上;此时,定子电流扭矩(isq)分量和磁通量(isd)生成分量由控制器单独控制;最后,透过逆向Park变换,输出定子电压空间向量从d、q坐标系转换回两相静止坐标系,并使用空间向量调制,生成三相输出电压。

无传感器控制

设计人员需要转子的位置信息,才能高效地控制永磁同步马达,然而在一些应用中于传动轴上安装转子位置传感器,会降低整个系统的耐用性和可靠性。因此,设计人员的目标不是使用这个机械传感器直接测量位置,而是利用一些间接的技术估算转子位置。

低速时,须高频率注入或开环启动(效率不高)等特殊技术来启动马达并使之达到某一个转速,在这个转速下对于反电动势观测器来说,反电动势已足够。通常,5%的基本速度足以使无传感器模式正常运行。

中/高速时,使用d/q参照系中的反电动势观测器。内部脉宽调变(PWM)频率和控制环路频率必需够高,才能获得合理数量的相电流和直流母线电压的样本。反电动势观测器的计算要求乘累加、除法、正弦/余弦(sin/cos)、开方等数学计算,适合使用基于ARM内核的Kinetis MCU或Power Architecture系列的数字讯号控制器(DSC)。

弱磁控制

超过马达额定转速的作业要求,PWM逆变器提供的输出电压高于直流母线电压所限制的输出能力。要克服速度限制,可实施弱磁算法。负的d轴给定电流将提高速度范围,但由于定子电流的限制,可得到的最大扭矩会相对地降低。在同样的直流母线电压限制下,控制d轴电流可以起到弱化转子磁场的效果,这降低了反电动势电压,允许更高的定子电流流入马达。

文章来源: 新电子

围观 268

在当今群雄逐鹿、竞争激烈的可穿戴市场中,获得成功的关键在于差异化的产品特性和服务。制造商和服务提供商竞相争夺同样的可穿戴“市场大饼”。成功设计可穿戴式产品是一项复杂的工程。成功的产品需要成本、性能、功能、电池使用寿命的完美组合,必须具备引人注目的外观、感受和表现以吸引消费者。我们需要通过关注最终用户体验和探索使用情形,以便在可穿戴产品中集成各种不同元素并完成复杂的权衡。

典型的嵌入式系统通常开始于功能和能力定义,它们可说是项目的首要驱动关键。同样,成功的可穿戴产品设计需求要关注于“用户体验”。这些需求包括可穿戴产品的外观、感觉和与最终用户的交互,以及它所引起的印象、感受和情绪。

当今有许多能够监测健康和生物特征、跟踪运动距离、记录移动路线、估计能量消耗、以及来电和邮件通知的可穿戴产品,同时可以无缝的和我们的智能电话进行整合和通信。这些可穿戴产品设计非常专注用户体验;它们时尚、特性丰富、易用、价格适中、并且可连接到物联网(IoT)。

可穿戴市场能够分成三种产品类别,每一类别需要的设计权衡,如图1所示:

●活动追踪器:这些相对简单的产品往往不包括LCD显示屏。如此简单的好处之一是这些产品是经济的、易用、并且往往有最长的电池使用寿命。

●带有小型或中型显示器的健身带和“超级手表”:这些可穿戴产品可能包括多种生物和环境传感器,并且在特性/功能、电池使用寿命和成本之间选择最佳平衡点。

●智能手表:这些手表大小的复杂设计占据高端市场,并且通常运行在操作系统(例如Android Wear)之上。智能手表提供特性丰富的用户体验,但是更多功能和处理能力消耗更多的电池电量,通常每天都需要进行充电。

图1:每种类型的可穿戴产品都需要特有的设计权衡

可穿戴产品中的一个关键器件选择是微控制器(MCU)。选择具有出色低功耗操作的MCU是大多数可穿戴应用的关键所在。当今的32位架构中,ARM Cortex-M系列已成为领先的低功耗处理平台。Cortex-M0+是2级流水线架构,在一些性能效率和低活动模式电流消耗之间进行了最佳权衡。Cortex-M3和M4处理器提供了3级流水线,具有良好的功耗和性能平衡。M4处理器的单精度浮点单元和DSP扩展能够为软件算法大大缩短了执行时间和能量消耗,例如常用于从噪声传感器数据中提取信息的Kalman滤波算法。智能手表需要更先进的处理器(例如Cortex-M7)和专有内核,要为更高处理能力和高带宽内存接口的一些功效进行权衡。表1总结了主要可穿戴产品类型所需的关键处理能力和特性需求。

表1:ARM Cortex-M系列满足各类可穿戴产品需求

选择合适的电池技术也是重要的设计考虑。一次性电池具有不需要任何专门充电电路的优势;它们也有更好的能量密度并提供更多的能量容量。不足之处是它们使得机械设计变得更复杂并且限制了整体产品的易用性。可充电电池能获得更轻薄的设计,但增加了成本和设计复杂性。无论如何选择,可穿戴产品都需要小巧的外形,这就限制了电池的尺寸和提供的能量。可穿戴产品需要一种系统级的方案,专注于尽可能的在包括硬件和软件在内的所有级别上减少能耗。

在追求更长电池使用寿命的过程中,可穿戴产品的设计师不能为能效而牺牲良好的用户体验。幸运的是,MCU现在已经为获得更长电池使用寿命而在最佳性能和低功耗优化之间取得平衡。除了低功耗电流之外,快速唤醒时间也是关键特性之一。休眠到激活状态的快速转换能够获得更好的系统响应并减少能耗。具有灵活唤醒源、超低功耗定时器和串行接口的MCU也为设计者提供了强大的选项。更先进的MCU即使在MCU处于休眠状态也能够提供有效运行的外设。这种自治外设技术的典型例子是Silicon Labs的外设反射系统(Peripheral Reflex System,PRS),如图2所示,在EFM32 Gecko MCU外设中,例如模数转换器(ADC)和直接存储器存取(DMA)引擎能够自治的响应外部输入或中断触发,而无需任何CPU参与。这种方法能够设置MCU处于休眠状态,可以在来自传感器的输入超过预设定的门限之后才醒来,而不是让MCU在活动、高功耗状态下不停的查询同一个传感器。

图2:通过使能MCU外设自治运行并且保持处理器内核处于休眠状态,外设反射系统节省系统能耗

可穿戴产品上基于CMOS的传感器为丰富用户体验提供了基础,使能新应用和使用案例。有三种主要的可穿戴产品传感器类别:运动传感器、环境传感器和生物传感器。每种传感器类型提供了对于最终用户活动、环境和健康的特有的洞察。当组合起来,它们更加强大。可穿戴产品中传感器的组合和使用需要许多权衡。光学传感器需要使用能够穿透光线的材料。特定传感器的电源可能需要门控,以至于它们不会成为电池的永久负载,但是这种方法增加了设计复杂性。预期的用户体验、成本和使用案例最终驱动可穿戴产品中传感器集成的最佳水平。

移动app是所有可穿戴解决方案的重要组成部分,而Bluetooth Smart已迅速成为连接可穿戴产品到基于iOS和Android的移动设备时的主要无线解决方案。Bluetooth Smart具有优化的低功耗运行模式。它非常适合于传输传感器数据、同步用户信息、提供空中更新支持。智能手机提供了非常灵活的用户界面,app实现了丰富的个性化能力,这种能力无法简单的以其他方式通过可穿戴产品单独实现。然而,添加和使用无线连接会增加设计成本。成功的可穿戴设计需要谨慎的平衡处理。无线传输通常是可穿戴系统中的最高耗能者。决定消息以多大数量和多大频率进行传输或者可穿戴产品与智能手机以多大频率进行同步,对于最终产品的电池使用寿命会产生巨大的影响。高数据量的使用能够把电池使用寿命缩短到数小时或数天。而更保守的方法也许能够使同样产品的寿命延长到几个星期或几个月。

可穿戴市场可能已不再处于起步阶段,随着低功耗MCU、基于CMOS传感器和无线SoC的不断突破,我们现在正处于可穿戴产品创新的新时代前夕。随着可以更容易的访问更精确传感器驱动的最终用户数据,可穿戴设备能够可靠和唯一的识别用户。从健康和活动跟踪到安全和可靠用户识别的转换能够在医疗保健、安全、移动支付和社交网络开辟更多新机会。第一个在这些领域以适当成本获得引人注目用户体验的可穿戴式产品,将成为市场的下一个大赢家。

文章来源:物联网在线

围观 341

便携式系统通常用电池供电,而电池使用寿命取决于系统的功耗。在提倡“绿色环保”计划的今天,即便是市电供电的应用也要把功耗作为一项重要的产品选择标准。

便携式设备通常分为使用充电电池供电的设备和使用非充电电池供电的设备。如果应用使用的是非充电电池,那么电池使用寿命将是至关重要的规范要求。对于任何应用而言,电池使用寿命取决于:
所用电池的可用电荷量;
应用的平均电流消耗。

使用充电电池的应用还要考虑到另一个参数,那就是电池充电的频率和每次充电所花的时间。从最简单的角度说,延长电池使用寿命可通过提高电池容量或降低应用的平均电流消耗来实现。由于电池重量过大会影响系统的机械约束和成本,因此系统设计人员只能将电池电量提高到一个限值。在电池化学技术的全新发展不断提高电池电荷密度的同时,我们还亟需想办法继续降低平均功耗。

应用的平均功耗取决于:

每个电路组件的功耗;

应用的供电方案以及电力如何通过栅极输送到设计的各个部分;

设计中的各个组件是如何在不同的工作条件下工作的;

每个组件的功耗可从各组件的器件数据表获得。了解每个组件的功耗拆分信息非常重要,这有助于设计出色的系统,实现低功耗优化。

不妨来设想一个简单的小型电池供电数字时钟。该设备可用于计时,并在按下按键时能显示当前时间。设备通常处于断电模式以节电,只有在检测到按键动作时才会被唤醒并刷新显示屏。显示屏和主电路在工作一段时间后会返回断电模式以节电。该系统的高层次方框图如下:

图1:小型数字时钟的高层次方框图

电路采用RTC计时,用主控制器芯片与RTC通信,并管理显示屏界面。整个系统大部分时间处于断电状态,显示屏关闭,主控制器也处于断电模式,这样电流消耗可降到最低,所有外设都关闭。按键则作为唤醒设备的触发器,以获取RTC数据并在显示屏(通常为LCD)上进行显示。

要分析这种系统的功耗,要看的第一个数据就是设备和显示屏都处在断电模式下的典型平均电流是多少。应查看每个外设和控制器的数据表,以了解功耗数据。为了最大限度地降低功耗并延长电池使用寿命,应做到给所有不使用的外设断电。在本应用中,这个不使用的外设就是显示屏。与显示屏形成对比的是,RTC需要始终进行供电,以实现计时功能。

MCU通常是大多数系统中总功耗的主要来源。这一点同样适用于本案例中的应用,如果不能选择并适当使用正确的MCU时尤为如此。有很多办法可降低MCU的功耗,包括但不限于:

1. 降低工作频率

2. 以更低的工作电压运行

3. 使用低功耗工作模式

MCU能在各种工作频率上运行。然而,不同器件支持的频率各不相同。MCU的功耗与工作频率成正比,随着频率的升高,动态功耗也会升高。因此,MCU应该以尽可能低的频率运行,同时能够可靠地满足系统的需求。

此外,频率也与时钟源有关。设备支持各种时钟源选项,包括内部高速振荡器、内部低速振荡器、外部晶体振荡器等。在大多数情况下,外部晶体可提高精确度,但代价是功耗较高。选择低功耗时钟源,往往要权衡速度和精确度。为选择适当的时钟源,确保系统性能和功耗的完美平衡,应该认真研究系统要求。

大多数MCU支持低功耗工作模式,从而满足低功耗系统设计的要求。同样,支持模式的数量以及每种模式的特性根据器件会有所不同。应适当使用低功耗模式,以降低平均功耗。常见的模式包括:

工作模式:MCU正常运行。

较低功耗模式:时钟经门控后送至MCU,保持各种寄存器和RAM的状态。

最低功耗模式:包括MCU在内的所有外设都断电。

当时钟经门控后送至MCU时,功耗就是静态功耗。静态功耗取决于几个因素,包括亚阈值条件和FET中的隧道电流等。此外,隧道电流在小型芯片设计的FET缩减时会成为主要因素(即尺寸减小使得氧化物的厚度减小)。

今天,我们已经拥有在单芯片上实现完整系统/子系统高度集成的SoC。 除了集成度之外,就功耗而言,这些SoC也有助于降低平均功耗,使其低于采用独立MCU和分立外设的情况。

文章来源:周立功单片机

围观 261

微控制器(MCU)深入人们应用生活,几乎大小设备都看得到MCU踪影,在MCU导入DSP数字信号处理器、FPU浮点运算单元功能后,MCU更大幅扩展元件可适用范围,这几年来,在众多MCU大厂纷纷针对旗下商品推出多样整合方案,不管是产品策略还是市场区隔,也让MCU市场更加丰富多元...

MCU(Microcontroller Unit)深入生活应用是不容易质疑的趋势,尤其是MCU在功能优化或市场区隔目的下,进行DSP(Digital Signal Processor)数字信号处理器或FPU(Floating Point Unit)浮点运算单元功能整合,使得MCU的可应用场域大幅扩展。

MCU整合FPU可以在进阶数值运算的精密度大幅提升、处理效能也能获得改善。

针对IoT应用开发的MCU方案,整合DSP可优化感测器数据撷取品质与提升信号处理效能。

如果以FPU或DSP导入目的,一般在MCU中追加FPU、DSP整合架构,主要目的还是在考量成本下的设计方向,尤其在早期半导体元件,SOC(System on Chip)系统单芯片与MCU存在一段价格差距,如果仅需要SDP或FPU进行运算加速,又不想选用高单价SOC,这时整合DSP或FPU硬件加速单元的MCU产品、不仅可以更好的提供运行效能,同时又能在成本控制上表现更加优异。

MCU整合芯片封装成本骤降 增加MCU功能扩充应用空间

以早期的SOC产品来看,搭载DSP与FPU硬件加速器是SOC产品的重要特性,其中DSP与FPU的应用方向主要以音讯、影像等处理加速运算为主,而在制程技术持续优化,SOC的成本逐步与MCU拉近,MCU在32位元甚至64位元架构下,也开始有结合DSP或是FPU硬件加速单元的解决方案。

先看看MCU加上硬件加速单元的优点,在MCU追加FPU导入,最直接的效益是早期利用MCU处理类似FPU运算内容,会因为MCU本身的运算架构限制,让运算结果得出时间会相对拉长,而在导入硬件加速器处理浮点运算时,因为硬件呼叫或是资料传递就能透过硬件算出数据,MCU本身耗在浮点运算的记忆体资源可以因硬件加速整合减少至少10%。

当然,从目的性来看,不管MCU有无整合FPU硬件加速单元,浮点运算需求使用MCU现有的运算能力也能得出结果,只是前提是计算过程会耗用较多运算时间与硬件资源,对于可等待、无需提供即时反应的系统自然可以不考虑整合FPU的MCU方案,但若是对系统效能、回馈反应速度要求高的整合需求,MCU结合FPU的效益提升不仅仅是运算资源耗用优化、节能优势等效果,反而是加快系统回应与效能提升的效用,才是MCU结合FPU硬件加速最直接、重要的功能改进,也让MCU可以因应更高复杂度的整合工作。

高阶数值运算 运用硬件加速满足设计需求

在早期MCU元件仍以8位元架构为主流的应用方向,MCU在资料处理与运算处理上,本来就有因架构的问题而有其处理限制,例如,MCU进行小数点、分数处理运算时,因为4位元或是8位元位数有限,就必须采用有限数值进行处理,透过数值结果的限制换取处理复杂度简化与效能要求目的,而这种因为数值处理产生的误差即“截断误差”,截断误差也会因为使用MCU进行数据运算的限制,而令误差数值产生扩大现象。

而在MCU整合FPU硬件加速,在运算同类型的数据处理时,例如在IoT物联网或是终端感测器应用中,常有将外部类比感测数据转换成数字资料的资料撷取、处理需求,这时透过MCU整合的FPU/DSP硬件加速单元,不仅可将感测数据更快速处理完成、加快系统回应,同时,也能导入进阶运算减少数据演算的误差。

在实际应用中,FPU硬件加速器本身并无法完全解决误差扩大问题,所以会有FPU、DSP等不同硬件加速整合架构下的应用目的考量,举例来说,透过DSP硬件加速器,可针对特殊数据类型更高速、可靠的运算处理输出,像是DSP可利用指令来进行多种运算,处理如快速快速傅立叶转换(fast Fourier transform;FFT)或有限脉冲回应(Finite impulse response;FIR)进阶运算中重要且耗资源的运算需求,甚至透过单周期的指令便能处理单一指令多重资料(Single Instruction Multiple Data;SIMD)运算需求,MCU在进行进阶数值处理方面还可获得进阶增强效益。

FPU/DSP不同硬件加速单元具互补作用

虽说整合FPU或DSP基本在架构与应用方向就不同,但实际上两者分别是针对数据运算、讯号处理对应至各式演算法应用,两者功能可以说是各有互补效用,比较难被独立拆分。以ARM Cortex-M4来看,若仅提供DSP硬件加速处理器反而没设置FPU浮点运算加速器反而会造成应用限制,因为在Cortex-M4应用场合如果仅有数字信号处理加速硬件支援,少了浮点运算支援,对开发需求端若碰到需要数值进阶运算加速,就会造成设计上的弹性限制,或是导致还需透过外部功能芯片支援,或利用原有的运算资源因应数值进阶计算需求,反而会因为数值处理效能限制了Cortex-M4的应用可能性。

同样的状况也发生在仅有FPU而没有设置DSP的微控制器应用方案上,对DSP或是FPU应用功能是相辅相成,独立整合对于微控制器的配置并未能产生综效,反而会成为发展路径的限制。

再者,从新一代IoT产品发展方向,透过感测器融合(Sensor Fusion)应用方向为例,若是Sensor Fusion概念为将多感测器整合在单一系统中协同运行,系统需要高阶数值与讯号处理能力,才可以将关键数值讯号自复杂数据中提取出来。

至于感测器融合可以再搭配即时的调整、控制与校正处理,由DSP加上FPU协同处理达到高精密度、高效率进行撷取数据的精密分析,尤其是现有的Sensor Fusion已做到陀螺仪、加速度器、温度、压力甚至触控感测都做在同一个模组中,必须透过DSP与FPU预先筛出相对精密且兼顾处理效率的讯号撷取与预处理的感测数据,提供相对高效的系统更具效率的感测数值处理机制。

DSP数字滤波应用 可提升感测讯号撷取品质

此外,在MCU整合FPU的另一个优势在于可在系统中善用其运算特性,例如,运用数字演算法进行撷取数值的数字滤波应用,针对处理讯号进一步以基于硬件加速的数字演算法进行波形或数据再处理,形成一提升数据噪讯比(SNR)的便捷作法,数字滤波器还可利用演算机制优化提供不同程度大小的滤波效果,这在于微控制器用于感测热门的心率、血液含氧量、运动数值等生理资讯,或是数字电表、智能电表等应用,解决末端数据因为杂讯或环境噪讯影响,倒置讯号失真的数据优化回补效用,优化终端取得的讯号波形信号品质,更利于后续处理或数据使用。

为了优化末端应用,微控制器整合硬件加速单元也蔚为一股风潮,不只是DSP或是FPU硬件加速单元,例如就有微控制器在架构上加入了VMU硬件加速单元,处理因应马达应用重点的三角函数数值运算需求,或是对应无线电通讯需求整合的数据分析演算支援,与现有FPU浮点运算硬件加速功能区隔,采取协同分工的方式加速整体微控制器的应用效能。

有趣的是,针对不同的市场与运算需求定位,微控制器除在运算时脉进行差异区隔,以最实际的运算效能区分不同应用场合、市场切分外,整合不同应用所需的硬件加速单元也成为产品市场定位的重要分界,例如针对穿戴式运算应用市场的微控制器,在要求功耗、感测器融合、元器件成本方面就可仅整合FPU、DSP硬件加速定位市场区隔,在高阶的微控制器应用上,甚至有解决方案直接整合硬件绘图引擎,直接看准工业用人机介面终端的应用需求,另针对如车用电子、IoT物联网等不同市场需求,也有五花八门的硬件加速单元配置组合,满足不同整合需求的应用架构。

另一个微控制器整合DSP、FPU硬件加速单元的目的,其实加入硬件加速单元整合而不采行外部解决方案来组构硬件加速运算需求,其最大的优点在于成本方面的极致优化,因为电子电路板可以更节省载板空间,运用单一芯片就能改善运算的整体效率,而在软件开发层面,可在整合架构下运用简单呼叫与资料传递的再处理,便能满足应用服务的数据计算产出效能要求,甚至于开发完成的成品还可运用一致性侦错分析工具,直接针对系统进行全面分析与勘误,在开发设计的效率与速度都能获得改善。

来源:互联网(版权归原著作者所有)

围观 398

微控制器(MCU)深入人们应用生活,几乎大小设备都看得到MCU踪影,在MCU导入DSP数位讯号处理器、FPU浮点运算单元功能后,MCU更大幅扩展元件可适用范围,这几年来,在众多MCU大厂纷纷针对旗下商品推出多样整合方案,不管是产品策略还是市场区隔,也让MCU市场更加丰富多元。

MCU(Microcontroller Unit)深入生活应用是不容易质疑的趋势,尤其是MCU在功能优化或市场区隔目的下,进行DSP(digital signal processor)数位讯号处理器或FPU(Floating Point Unit)浮点运算单元功能整合,使得MCU的可应用场域大幅扩展。
 
MCU整合FPU可以在进阶数值运算的精密度大幅提升、处理效能也能获得改善。
  
针对IoT应用开发的MCU方案,整合DSP可优化感测器数据撷取品质与提升信号处理效能。
  
如果以FPU或DSP导入目的,一般在MCU中追加FPU、DSP整合架构,主要目的还是在考量成本下的设计方向,尤其在早期半导体元件,SOC(System on Chip)系统单晶片与MCU存在一段价格差距,如果仅需要SDP或FPU进行运算加速,又不想选用高单价SOC,这时整合DSP或FPU硬体加速单元的MCU产品、不仅可以更好的提供运行效能,同时又能在成本控制上表现更加优异。
  
MCU整合晶片封装成本骤降 增加MCU功能扩充应用空间
  
以早期的SOC产品来看,搭载DSP与FPU硬体加速器是SOC产品的重要特性,其中DSP与FPU的应用方向主要以音讯、影像等处理加速运算为主,而在制程技术持续优化,SOC的成本逐步与MCU拉近,MCU在32位元甚至64位元架构下,也开始有结合DSP或是FPU硬体加速单元的解决方案。
  
先看看MCU加上硬体加速单元的优点,在MCU追加FPU导入,最直接的效益是早期利用MCU处理类似FPU运算内容,会因为MCU本身的运算架构限制,让运算结果得出时间会相对拉长,而在导入硬体加速器处理浮点运算时,因为硬体呼叫或是资料传递就能透过硬体算出数据,MCU本身耗在浮点运算的记忆体资源可以因硬体加速整合减少至少10%。
  
当然,从目的性来看,不管MCU有无整合FPU硬体加速单元,浮点运算需求使用MCU现有的运算能力也能得出结果,只是前提是计算过程会耗用较多运算时间与硬体资源,对于可等待、无需提供即时反应的系统自然可以不考虑整合FPU的MCU方案,但若是对系统效能、回馈反应速度要求高的整合需求,MCU结合FPU的效益提升不仅仅是运算资源耗用优化、节能优势等效果,反而是加快系统回应与效能提升的效用,才是MCU结合FPU硬体加速最直接、重要的功能改进,也让MCU可以因应更高复杂度的整合工作。

高阶数值运算 运用硬体加速满足设计需求
  
在早期MCU元件仍以8位元架构为主流的应用方向,MCU在资料处理与运算处理上,本来就有因架构的问题而有其处理限制,例如,MCU进行小数点、分数处理运算时,因为4位元或是8位元位数有限,就必须采用有限数值进行处理,透过数值结果的限制换取处理复杂度简化与效能要求目的,而这种因为数值处理产生的误差即“截断误差”,截断误差也会因为使用MCU进行数据运算的限制,而令误差数值产生扩大现象。
  
而在MCU整合FPU硬体加速,在运算同类型的数据处理时,例如在IoT物联网或是终端感测器应用中,常有将外部类比感测数据转换成数位资料的资料撷取、处理需求,这时透过MCU整合的FPU/DSP硬体加速单元,不仅可将感测数据更快速处理完成、加快系统回应,同时,也能导入进阶运算减少数据演算的误差。
  
在实际应用中,FPU硬体加速器本身并无法完全解决误差扩大问题,所以会有FPU、DSP等不同硬体加速整合架构下的应用目的考量,举例来说,透过DSP硬体加速器,可针对特殊数据类型更高速、可靠的运算处理输出,像是DSP可利用指令来进行多种运算,处理如快速快速傅立叶转换(fast Fourier transform;FFT)或有限脉冲回应(Finite impulse response;FIR)进阶运算中重要且耗资源的运算需求,甚至透过单周期的指令便能处理单一指令多重资料(Single Instruction Multiple Data;SIMD)运算需求,MCU在进行进阶数值处理方面还可获得进阶增强效益。
  
FPU/DSP不同硬体加速单元具互补作用
  
虽说整合FPU或DSP基本在架构与应用方向就不同,但实际上两者分别是针对数据运算、讯号处理对应至各式演算法应用,两者功能可以说是各有互补效用,比较难被独立拆分。以ARM Cortex-M4来看,若仅提供DSP硬体加速处理器反而没设置FPU浮点运算加速器反而会造成应用限制,因为在Cortex-M4应用场合如果仅有数位信号处理加速硬体支援,少了浮点运算支援,对开发需求端若碰到需要数值进阶运算加速,就会造成设计上的弹性限制,或是导致还需透过外部功能晶片支援,或利用原有的运算资源因应数值进阶计算需求,反而会因为数值处理效能限制了Cortex-M4的应用可能性。
  
同样的状况也发生在仅有FPU而没有设置DSP的微控制器应用方案上,对DSP或是FPU应用功能是相辅相成,独立整合对于微控制器的配置并未能产生综效,反而会成为发展路径的限制。
  
再者,从新一代IoT产品发展方向,透过感测器融合(Sensor Fusion)应用方向为例,若是Sensor Fusion概念为将多感测器整合在单一系统中协同运行,系统需要高阶数值与讯号处理能力,才可以将关键数值讯号自复杂数据中提取出来。
  
至于感测器融合可以再搭配即时的调整、控制与校正处理,由DSP加上FPU协同处理达到高精密度、高效率进行撷取数据的精密分析,尤其是现有的Sensor Fusion已做到陀螺仪、加速度器、温度、压力甚至触控感测都做在同一个模组中,必须透过DSP与FPU预先筛出相对精密且兼顾处理效率的讯号撷取与预处理的感测数据,提供相对高效的系统更具效率的感测数值处理机制。

DSP数位滤波应用 可提升感测讯号撷取品质
  
此外,在MCU整合FPU的另一个优势在于可在系统中善用其运算特性,例如,运用数位演算法进行撷取数值的数位滤波应用,针对处理讯号进一步以基于硬体加速的数位演算法进行波形或数据再处理,形成一提升数据噪讯比(SNR)的便捷作法,数位滤波器还可利用演算机制优化提供不同程度大小的滤波效果,这在于微控制器用于感测热门的心率、血液含氧量、运动数值等生理资讯,或是数位电表、智能电表等应用,解决末端数据因为杂讯或环境噪讯影响,倒置讯号失真的数据优化回补效用,优化终端取得的讯号波形信号品质,更利于后续处理或数据使用。
  
为了优化末端应用,微控制器整合硬体加速单元也蔚为一股风潮,不只是DSP或是FPU硬体加速单元,例如就有微控制器在架构上加入了VMU硬体加速单元,处理因应马达应用重点的三角函数数值运算需求,或是对应无线电通讯需求整合的数据分析演算支援,与现有FPU浮点运算硬体加速功能区隔,采取协同分工的方式加速整体微控制器的应用效能。
  
有趣的是,针对不同的市场与运算需求定位,微控制器除在运算时脉进行差异区隔,以最实际的运算效能区分不同应用场合、市场切分外,整合不同应用所需的硬体加速单元也成为产品市场定位的重要分界,例如针对穿戴式运算应用市场的微控制器,在要求功耗、感测器融合、元器件成本方面就可仅整合FPU、DSP硬体加速定位市场区隔,在高阶的微控制器应用上,甚至有解决方案直接整合硬体绘图引擎,直接看准工业用人机介面终端的应用需求,另针对如车用电子、IoT物联网等不同市场需求,也有五花八门的硬体加速单元配置组合,满足不同整合需求的应用架构。
  
另一个微控制器整合DSP、FPU硬体加速单元的目的,其实加入硬体加速单元整合而不采行外部解决方案来组构硬体加速运算需求,其最大的优点在于成本方面的极致优化,因为电子电路板可以更节省载板空间,运用单一晶片就能改善运算的整体效率,而在软体开发层面,可在整合架构下运用简单呼叫与资料传递的再处理,便能满足应用服务的数据计算产出效能要求,甚至于开发完成的成品还可运用一致性侦错分析工具,直接针对系统进行全面分析与勘误,在开发设计的效率与速度都能获得改善。

来源: DIGITIMES

围观 364

在单片机开发中,由于资源受限而没有平台的支持,每次开发都要重写很多代码,应用的千奇百怪的需求更是加剧了这种困难。解决问题的办法是,总结常见的需求,分析它,得出即高效有通用的解决方案。

今天我就来为大家提供一种按键的解决方案,它易用,高效,节省资源!

先给出这个按键模块解决方案的全部代码,稍后再来分析。

keyif.h内容:

1: #ifndef __KEY_IF_H__
2: #define __KEY_IF_H__
3: ////////////////////////////////////////////////////////////////////////////////
4: typedef unsigned char u8_t;
5:
6: #define KEY_NUM_MAX (8)
7:
8: #define KEY_STA_BEGIN (0)
9: #define KEY_STA_KEEP (1)
10: #define KEY_STA_END (2)
11:
12: #define KEY_PERIOD_MS (25)
13:
14: void kif_Init(void);
15: void kif_TickHook(void);
16:
17: /*
18: kindex 按键索引,从0开始,而小于KEY_NUM_MAX。
19: 返回值:按键被按下返回非零,按键被抬起返回零。
20: */
21: extern u8_t KeyRead(u8_t kindex);
22: /*
23: kindex 按键索引,从0开始,而小于KEY_NUM_MAX。
24: ksta 按键状态,取值为KEY_STA_系列宏。
25: ktick 按键计时,以KEY_PERIOD_MS时间为计数单位。
26: 返回值:如果本次按键操作已经处理妥当,就返回非零。
27: */
28: extern u8_t KeyProc(u8_t kindex, u8_t ksta, u8_t ktick);
29:
30: ////////////////////////////////////////////////////////////////////////////////
31: #endif /* __KEY_IF_H__ */
32:

keyif.c内容:

1: #include "keyif.h"
2: #include
3:
4: #if defined(KEY_NUM_MAX) && (KEY_NUM_MAX > 0)
5:
6: #if KEY_NUM_MAX > 255
7: #error 该模块为8位单片机优化,不支持255个以上按键。
8: #endif
9:
10: static u8_t kticks[KEY_NUM_MAX]; // 每个按键需要1字节计时器。
11: static u8_t kstats[(KEY_NUM_MAX+7)/8]; // 每个按键需要1BIT的状态标志。
12: static u8_t kvalid[(KEY_NUM_MAX+7)/8]; // 每个按键需要1BIT的有效标志。
13: ////////////////////////////////////////////////////////////////////////////////
14: //| |
15: //| 函数名称 |: kif_Init
16: //| 功能描述 |:
17: //| |:
18: //| 参数列表 |:
19: //| |:
20: //| 返 回 |:
21: //| |:
22: //| 备注信息 |:
23: //| |:
24: ////////////////////////////////////////////////////////////////////////////////
25: void kif_Init(void)
26: {
27: memset(kticks, 0, sizeof(kticks));
28: memset(kstats, 0, sizeof(kstats));
29: memset(kvalid, 0, sizeof(kvalid));
30: }
31:
32: ////////////////////////////////////////////////////////////////////////////////
33: //| |
34: //| 函数名称 |: kif_TickHook
35: //| 功能描述 |:
36: //| |:
37: //| 参数列表 |:
38: //| |:
39: //| 返 回 |:
40: //| |:
41: //| 备注信息 |:
42: //| |:
43: ////////////////////////////////////////////////////////////////////////////////
44: void kif_TickHook(void)
45: {
46: u8_t grp, msk;
47: u8_t now;
48: u8_t i;
49:
50: grp = 0;
51: msk = 1;
52: for(i = 0; i < KEY_NUM_MAX; ++i){
53: now = (KeyRead(i) ? msk : 0);
54: if((kstats[grp] ^ now) & msk){
55: // 按键状态发生变化。
56: if(now){
57: // 按键刚被按下。
58: kticks[i] = 0;
59: kstats[grp] |= msk;
60: kvalid[grp] |= msk;
61: if(KeyProc(i, KEY_STA_BEGIN, 0)){
62: kvalid[grp] &= ~msk;
63: }
64: }
65: else{
66: // 按键刚被抬起。
67: kticks[i] += 1;
68: kstats[grp] &= ~msk;
69: KeyProc(i, KEY_STA_END, kticks[i]);
70: }
71: }
72: else if(now){
73: // 按键保持按下状态。
74: kticks[i] += 1;
75: if(kvalid[grp] & msk){
76: // 按键处于有效状态。
77: if(KeyProc(i, KEY_STA_KEEP, kticks[i])){
78: kvalid[grp] &= ~msk;
79: }
80: }
81: }
82: // 处理用于加速执行的中间变量。
83: msk <<= 1;
84: if(msk == 0){
85: msk = 1;
86: grp++;
87: }
88: }
89: }
90:
91: #else /* KEY_NUM_MAX */
92:
93: void kif_Init(void){ ; }
94: void kif_TickHook(void){ ; }
95:
96: #endif /* KEY_NUM_MAX */
97:
example.c内容:

1: #include "keyif.h"
2:
3: // 读取按键物理状态的函数。
4: u8_t KeyRead(u8_t kindex)
5: {
6: switch(kindex){
7: case 0: // 按键#0
8: if(PIN_DOWN(0)){
9: return 1;
10: }
11: return 0;
12: case 1: // 按键#1
13: if(PIN_DOWN(1)){
14: return 1;
15: }
16: return 0;
17: case 2: // 按键#2
18: if(PIN_DOWN(2)){
19: return 1;
20: }
21: return 0;
22: case 3: // 按键#3
23: if(PIN_DOWN(3)){
24: return 1;
25: }
26: return 0;
27: }
28: return 0;
29: }
30:
31: // 按键事件处理函数。
32: u8_t KeyProc(u8_t kindex, u8_t ksta, u8_t ktick)
33: {
34: switch(kindex){
35: case 0: // 按键#0
36: if(ksta == KEY_STA_BEGIN){
37: // 按键被按下,TODO SOMETHING。
38:
39: return 0;
40: }
41: else if(ksta == KEY_STA_KEEP){
42: // 按键被保持,TODO SOMETHING。
43:
44: return 0;
45: }
46: else if(ksta == KEY_STA_END){
47: // 按键被松开,TODO SOMETHING。
48:
49: return 0;
50: }
51: break;
52: case 1: // 按键#1
53: if(ksta == KEY_STA_KEEP && ktick == 1000/KEY_PERIOD_MS){
54: // 按键按下保持了1000毫秒,TODO SOMETHING。
55:
56: return 1;
57: }
58: break;
59: case 2: // 按键#2
60: if(ksta == KEY_STA_KEEP && ktick == 1){
61: // 按键被按下,具备了间隔KEY_PERIOD_MS毫秒的去抖动时间,TODO SOMETHING。
62:
63: return 1;
64: }
65: break;
66: case 3: // 按键#3
67: if(ksta == KEY_STA_END){
68: // 响应按键松开事件,TODO SOMETHING。
69:
70: }
71: break;
72: }
73: return 0;
74: }
75:
76: ////////////////////////////////////////////////////////////////////////////////
77: //| |
78: //| 函数名称 |: main
79: //| 功能描述 |:
80: //| |:
81: //| 参数列表 |:
82: //| |:
83: //| 返 回 |:
84: //| |:
85: //| 备注信息 |:
86: //| |:
87: ////////////////////////////////////////////////////////////////////////////////
88: int main(void)
89: {
90: // 初始化KEYIF。
91: kif_Init();
92:
93: while(1){
94: delay(KEY_PERIOD_MS);
95: // 以KEY_PERIOD_MS毫秒为周期调用。
96: kif_TickHook();
97: }
98: }

上面的代码包括了3各文件,keyif.h、keyif.c、example.c。

其中example.c是使用举例,它提供了两个必须的函数,

u8_t KeyRead(u8_t kindex);
u8_t KeyProc(u8_t kindex, u8_t ksta, u8_t ktick);

先来分析KeyRead()函数:

它是读取物理按键的底层函数,该函数被KEYIF模块调用。当按键按下时,它必须返回非零;按键抬起时,返回零即可。例如我们通常把按键引脚设计为低电平为按下状态,那么当读取对应引脚电平状态时,如果读取的引脚为低电平则返回非零,高电平就返回零。

kindex参数是用于区别物理引脚的。例如:kindex为0时读取GPIO_B4,kindex为1时读取GPIO_A1,等等。

再来分析KeyProc()函数:

该函数是用户的按键响应函数,在该函数中用户可以加入一切按键响应代码。该函数被KEYIF模块调用。kindex参数是按键的索引,用于标识按键;ksta参数是按键的当前状态,取值为KEY_STA_BEGIN、KEY_STA_KEEP、KEY_STA_END其中之一。BEGIN代表按键刚被按下,KEEP代表按键保持在按下状态,END代表按键被松开了。ktick参数是KEEP状态的计时器,表示按键按下状态保持了多久,单位是KEY_PERIOD_MS毫秒。

KeyProc()函数的返回值决定了本次按键操作是否还会有后续的KEEP事件,如果用户不需要后续的KEEP事件,返回非零即可。当用户告诉KEYIF不需要后续KEEP事件后,按键保持在按下状态也不会产生KEEP事件,直到下一次按键操作。无论有无KEEP事件,BEGIN和END事件始终会有的,无法关闭!

example.c文件中给出了几个应用示例,其实这个按键框架能实现的操作远不止这些!用户自己根据需求可以轻易写出各种代码。

要使用KEYIF,必须在用户代码开始处调用kif_Init()函数来初始化KEYIF。然后在主循环或者时钟中断里,以KEY_PERIOD_MS毫秒为周期调用kif_TickHook()函数。

文章来源: 博客园

围观 198

这篇文章是俄国人Sergei P.Skorobogatov就读英吉利剑桥大学之博士论文,讲解了各种MCU的攻防技术,堪称一部小百科全书。对于志在研究MCU防护的筒子,能给你很多参考思路:但对于想当黑客的人,我们对后果概不负责!

C非侵入式攻击不需要对元器件进行初始化。攻击时可以把元器件放在测试电路中分析,也可单独连接元器件。一旦成功,这种攻击很容易普及,并且重新进行攻击不 需要很大的开销。另外,使用这种攻击不会留下痕迹。因此,这被认为是对任意元器件的硬件安全最大的威胁。同时,通常需要很多时间和精力来寻找对特定元器件 的非侵入式攻击方法。这通常对元器件进行反向工程,包括反汇编软件和理解硬件版图。

非侵入式攻击可以是被动的或主动的。被动攻击,也叫侧面攻击,不会对被攻击元器件发生作用,但通常是观察它的信号和电磁辐射。如功耗分析和时钟攻击。主动攻击,如穷举攻击和噪声攻击,特点是将信号加到元器件上,包括电源线。

一个简单的非侵入式攻击可以是复制一个上电配置的基于SRAM的FPGA。接上配置芯片用的JATG接口,用示波器或逻辑分析仪,捕捉所有信号。然后可以通过分析波形并回复独有的命令。

只使用到一半的FPGA资源时,可以轻微改变数据流来伪装盗版的事实。配置时留下一点空间而不影响元器件的运行。JTAG接口在发送信号时序时也有一些自由,故盗版的波形可以设置成看上去与原始信号不一样的。另外,破解者可以在上传时交换行地址,给人的印象是完全不同的设计。

含糊与安全

半导体制造商给大客户提供了增强产品防破解能力的措施:包装上的客户印字代替了标准的芯片型号。这给人的印象是产品是由定制的集成电路设计的。众所周知,ASIC提供了很好地保护措施来防止多种攻击,只有极少数经验丰富且装备精良的破解者才有可能成功破解。这会使很多潜在的破解者望而却步。但一个信心坚定的破解者会尝试用简单的方法确定芯片是不是真的ASIC。最简单的方法是观察连接到电源,地,时钟,复位,串口或别的接口的引脚。与数据库中被怀疑的微控制器相比较,这种结果非常可靠,每种微控制器都有自己的引脚特点。一旦发现相似的,就把它放在通用烧写器上尝试读出结果。

另一个简单的方法是限制访问程序存储器。通常用在智能卡中,但一些微控制器中也用到。这不是很可靠且实用的方法。当然在智能卡中用得很好,所有的客户被与芯片制造商迫签署不扩散协议。但微控制器极少这样,能被通用烧写器烧写的微控制器世界上很多公司都能提供。即使文件中没有烧写的规格,用低成本的示波器几个小时就可以套出需要的波形。如果微控制器不被特殊通用烧写器所支持,仍然可以通过从制造商购买开发板来获得直接完整的协议。

时序攻击(Timing attacks)

一些安全相关的操作使用输入的值和密钥,由半导体芯片执行不同的时间来比较。小心的时序测量和分析就能恢复出密钥。这个方法最早在1996年的文献上提到。稍后这种攻击成功破解了实际的RSA签名的智能卡。

为了攻击成功,需要收集装置的信息,与处理时间整合比较,如问答延迟(question-answer delay)。很多密码算法容易受到时序攻击,主要原因是软件来执行算法。那包括执行适时跳过需要的分支和操作条件;使用缓存;不固定时间处理指令如倍频和分频;还有大量的其他原因。结果就是执行能力典型地取决于密钥和输入的数据。

为防止此类攻击可以使用盲签名(Blinding signatures)技术。这个方法是利用选定的随机数与输入数据混合来防止破解者知道输入数据的数学运算法则。

时序攻击可用在安全保护是基于密码的微控制器,或使用确定数字的卡或密码来进行访问控制的系统,如达拉斯的iButton产品。这些系统中共有的风险是输入的连续数字在数据库进行再次校验。系统需经常检查输入到数据库的密钥的每个字节,一旦发现不正确的字节就会立即停止,然后切换到下一个直到最后一个。所以破解者很容易测量出输入最后一个密钥倒请求另一个的时间,并得出发现的密钥相似度。尝试相对小的数字,有可能找到匹配的密钥。

为防止这些攻击,设计者需要小心计算处理器的周期。当密码进行比较时确保正确和错误的时间是一样的,例如有的微控制器的内部存储器载入模块在输入正确的八字节密码后可以访问内部闪存。为达到正确和错误的密码都处理相同的时间,程序中增加了额外的空操作指令。这对时序攻击提供了很好的保护。一些微控制器有内部阻容振荡器,那样处理器的工作频率与电压和芯片的温度相关。这使得时序分析很困难,攻击时需要稳定元器件的温度并减少电源线上的噪声和电压波动。一些智能卡有内部随机时钟信号使得攻击时测量时间延迟无效。

穷举攻击(也称暴力攻击Brute force attacks)

暴力对于半导体硬件和密码来说是另一种意思。对于密码,暴力攻击是对系统尝试数量众多的密钥。通常是使用高速计算机来寻找匹配的密钥。

一个例子是微控制器中的密码保护设置。比如,微控制器密码本身长度为32字节(256位),抵挡暴力攻击已经足够了。但密码分配在与处理器中断矢量相同的存储器地址。那么,首先减少存储器内矢量一直指向的区域。然后当软件被更新时,只有小部分的密码被修改,因为大部分中断子程序指向的矢量是相同的地址。结果是,如果破解者知道早前密码中的一个,就很容易做系统的搜索,在合理的时间内找到正确的密码。

暴力攻击也可用在ASIC或CPLD的硬件设计来实现。这种情况下,破解者使用所有可能的逻辑组合到元器件可能的输入端并观察所有输出。这种方法也称为黑箱分析(Black-box analysis),因为破解者不知道被测试元器件的情况。通过所有可能的信号组合,尝试获得元器件的功能。这种方法对相对小的逻辑器件很有效。另一个问题是破解者使用的ASIC或CPLD有触发器,故输出将可能是当前状态或输入的状态。但如果预先检查并分析信号,搜索的范围可以显著减少。例如,时钟输入,数据总线和一些控制信号是很容易认出的。

另一种可能的暴力攻击,对很多半导体芯片有效,是将外部高压信号(通常是两倍于电源电压)加到芯片引脚上,来试图进入工厂测试或编程模式。事实上,这些引脚用数字万用表很容易发现,因为它们没有保护二极管到电源脚。一旦发现对高压敏感的引脚,破解者就可以尝试可能的逻辑信号组合来加到别的引脚上,找出用于进入工厂测试或编程模式的部分。

破解者也可用元器件的通信协议来找出设计者嵌入在软件中的测试和更新用得隐藏功能。

芯片制造商经常提供给后期测试用得嵌入硬件测试接口。如果这些接口的安全保护没有适当设计,破解者很容易利用它来读写片上存储器。在智能卡中,这些测试接口通常位于芯片电路之外,并在测试后从物理上除去。

任何安全系统,不管软件和硬件,在设计上都可能有缺陷,对于破解者来说都是机会,暴力攻击有可能找到它。小心设计安全保护系统,进行适当的评估,可以避免很多问题,并使得这些攻击事实上不可行。

功耗分析(Power analysis)

一个运算设备的功耗取决于它当前的状态。依照CMOS晶体管的原理,各部分动态时的功耗比静态的要大。当输入电压加到反向器上,会引起一个晶体管短路,这个晶体管电流的增加比静态消耗的寄生漏电要大得多。在电源线上加个10-20欧的电阻,就可以测量电流的波动。为达到更好的效果,需要使用至少12位精度和50MHz采样速度的模数转换器。这些获得的参数可以用来区别处理器的不同指令并估计总线上同时翻转的位数。

通过平均多次重复同样操作的电流,即使是没有通过总线的很小信号也能区别开。有些信号如移位状态特别有用,因为很多密码的密钥产生算法使用移位操作来逐一移出单个密钥倒进位标志。即使状态位的变化不能直接测量,它们通常会改变指令次序或微码的执行,这会导致功耗的明显变化。

不同指令导致不同级别的指令解码和运算单元的活动,可被清晰地区别开,故运算部分能被推测出。处理器的不同单元在时钟沿相关的不同时间里有独有的开关状态,能被高频仪器分离出来。

有多种不同的功耗分析技术用在破解密码算法上。整个分析过程是相对简单的,只需要标准的现有的廉价仪器设备。

功耗分析技术主要有两种:简单功耗分析(SPA:Simple Power Analysis)和差分功耗分析(DPA:Difference Power Analysis)。SPA是在密码或别的安全相关操作时直接观察功耗,可以得知设备运行时的信息如密钥资料。如果破解者知道密码算法,很容易通过观察处理器指令次序,特别是移位条件转移,找到一些位的信息。如果算法或逻辑运算的结果很容易被看出,如进位状态,零或负标志,就可以获得更多的信息。DPA是种更有效的技术,因为破解者不需要知道密码算法是如何执行的。它使用静态分析和已知密码运算的大量功耗迹线来获取隐藏信息。用统计方法鉴别功耗的微小区别,可用来恢复密钥中的单个的位信息。

功耗特性当然包括噪声部分。额外的噪声可以通过减少获取信号的探针长度并小心使用测量仪器来降低它。测量接在地线上的电阻的功耗有一些优势。首先,减少了噪声电平。其次,可以用示波器的探头直接测量信号,因为大部分探针站有公共的地线与外部电源地相连。为了增加信噪比,可以通过提高平均采样数来获得。

有源探头能降低输入电容,增加对输入信号的带宽。一种方法是用高速低噪声的运放来构建相对简单的探头,另一种是用很短的同轴电缆直连到示波器的输入端。在这些情况下,探头的输入电容显著减少。

图 左侧是普通的无源探头,右侧是自制的有源探头。

我们对现有的功耗分析步骤进行了改进。这是一种新的方法,尚未有类似的。我们用铁芯变压器来取代连到电源或地的电阻,那样波形就有点不一样,因为信号的直流成分丢失了,同时又有些有利条件。常用的方法对直流电流几乎没有什么限制。但对于10欧电阻来讲100mA的电流意味着有1V的电压降,那可能中断微控制器的正常操作。减少这个电阻可以解决这个问题,但会使得难以识别功耗的微小变动。使用变压器后,不需要使用昂贵的有源探头,标准的无源探头就可以给出几乎相同的结果。如果信号太小,调节二次侧的线圈就可以增加振幅。变压器也担当无源滤波器的角色,如波形,同样的处理器指令对电阻和变压器所测量到的波形有不同的影响。那可以通过对获得的信号进行处理。为了攻击获得成功,需要采集数千的样本,然后快速分析处理所展现的秘密。

最近,芯片设计上已考虑这种攻击,并将使得这种攻击方法更难获得成功。

噪声攻击(Glitch attacks)

噪声攻击是快速改变输入到微控制器的信号,以影响它的正常运行。通常噪声是叠加在电源上或时钟信号上,但噪声也可以是外加的短暂电场或电磁脉冲。在离芯片表面数百微米处放置两根金属针,然后加上少于1微秒的数百伏电压的窄脉冲,晶圆衬底会感应出一个电场,使得邻近晶体管的阈值电压发生变化。最近出现一种改进的方法:使用几百圈金属线绕在微探针的针尖构成一个小型电感。当电流进入线圈会产生磁场,针尖将集中磁力线。

每个晶体管和与它相连的线路构成有时延特性的RC电路。处理器的最大可用时钟频率取决于该电路的最大延迟。同样的,每个触发器在接收输入电压和由此引致的输出电压之间有个特征时间窗口。这个窗口由给定的电压和温度来确定。如果用时钟噪声(比正常的时钟脉冲要短得多)或电源噪声(电源电压的快速波动)将会影响芯片里的某些晶体管,导致一个或多个触发器进入错误状态。通过改变参数,处理器会被导致执行许多完全不同的错误指令,有时甚至是不被微码支持的。经管我们不会预先知道何种噪声会导致何种芯片的何种错误,但它能相当简单地进行系统的搜索。

时钟噪声攻击(Clock glitches)

时钟信号的噪声攻击在目前是最简单的,且相当实用。实际应用中的噪声通常用来取代跳转条件并试验先前的测试指令。可以在安全密码问询处理时创建一个攻击窗口,简单预防执行这些指令。指令噪声也能用来扩大循环的时间。如,串口子程序在输出缓冲后再读更多的内容;或在密钥操作时减少循环次数来传一个弱的密码。

为获得噪声,时钟需要临时增加一个或大于半个周期,有些触发器在到达新状态之前就获得输入。时钟噪声通常针对处理器的指令流。对硬件执行安全保护的微控制器没有什么效果。实际中,仅使用时钟噪声来攻击微控制器或智能卡的软件程序接口。

这类保护的破解是相对容易的。如处理器在循环里只执行一个指令,攻击时可用不同的时钟噪声导致处理器误操作。不需要小心地与时钟信号同步,只需要随机制造噪声就可在数次攻击内成功。插入噪声是相对容易的,无需使用外部发生器,瞬间短路晶振即可。当谐振器在不同的泛音上产生震荡会发出很多噪声。大部分情况下需要在确定的时钟周期内获得所需结果,在这种情况下用信号发生器更好。

使用时钟噪声来攻击某些微控制器也许是很困难的。例如某微控制器在内部RC震荡器工作的启动模块。很难与内部时钟同步,攻击时很难估计精确的时间。一些智能卡在处理器指令流里会随机插入延迟,使得攻击更为困难。使用功耗分析会有帮助,但要求非常昂贵的设备来实时获得参考信号。

电源噪声攻击(Power glitches)

电源供应电压的波动会导致晶体管阈值电平的漂移。结果就是一些触发器在不同的时间里采样它们的输入,或读出错误的安全熔丝的状态。 通常用瞬间增加电源电压或电压跌落来制造噪声,一般在10个时钟周期内。电源噪声通常用在微控制器的程序接口上,能影响处理器运行或硬件安全电路。一般地,弱点比时钟噪声更难找到并利用,因为对于时域参数,振幅,上升/下降时间都是变量。

如果在执行AND $0100指令时电源电压减少50-70%,处理器从EEPROM中取出的值是FFh而不是实际的值。这会对应熔丝未加密状态。窍门是小心计算执行时间来减少电源电压,否则处理器会停止运行或进入复位状态。这种任务并不难,复位后目标指令在第一个一百周期内被执行。破解者可以使用矢量发生器或构建一个自己的噪声源。

芯片的擦除操作也会解除安全保护。但同时会芯片上程序和数据存储器中的内容。安全保护电路在硬件设计上是在安全熔丝复位之前擦掉存储器。但我们发现在芯片擦除操作时电源电压几微秒内增加到大约10V,会中断存储器擦除操作,但安全熔丝正常完成复位,这使得有可能读出存储器里的内容。如此高压需要谨慎使用,如果时间过长会损伤芯片。因此最好增加防欠压和过压攻击的能力。如果电源电压低于3V或6V,通过编程接口的任意修改存储器的操作会被立即中断。

不是一直需要电源噪声超过电源电压范围的规格。保护机制可以阻止在芯片擦除操作开始后使用大于50mV的噪声。那会导致中止程序存储器的擦除操作但不会擦掉熔丝。

上述例子表明噪声攻击时无需特殊工具就有很好的效果。智能卡里有时钟监控电路但极少微控制器有。

数据保持能力分析(Data remanence)

处理器一般会把密钥保存在静态RAM里,如果元器件被篡改就会掉电,RAM内容丢失,从而保护密钥不被窃取。众所周知的是在低于零下20度时,SRAM里的内容会“冰冻”。很多元器件把温度低于这个阈值视为发生篡改事件。我们做了一些实验来确定现代SRAM数据保持能力与温度的关系。我们的实验表明传统的思维不再有效。即使在高温下,数据保持能力也是个问题。数据保持能力不仅仅对SRAM有影响,对DRAM, UV EPROM, EEPROM和闪存也有影响。结果是,仍然可以从已擦除的存储器中获得一些信息。这会给安全设备带来很多问题。

安全工程师都很关注断电后SRAM器件能保持数据的时间。原因如下:很多产品使用密钥或类似的方法进行加密和别的安全相关的计算,需要不能被读出或改变。最普遍的解决方法是把安全密钥放在带篡改传感器的易失存储器中。一旦检测到发生篡改,易失传感器会掉电或短路到地。但如果数据保留时间大于破解者打开元器件并对存储器上电的时间,那保护机制就被摧毁了。

在二十世纪八十年代,发现低温能将SRAM的数据保存时间增加到几秒甚至几分钟。对于那个时候的元器件,发现零下20度就可以增加数据保存时间,并且会随着温度的降低而增加保持的时间。有些就增加了温度传感器,温度低于零下20度就触发篡改事件,立即清零存储器。本次试验是重复这个工作,察看2000年后的产品是否也有此特性。

另一个需要关注的是即使部分内容已被破坏,安全信息也能被复原。假设破解者获得了n=128位密钥中的m=115位,也就是90%的信息。他可以通过搜索n!/(m!(n-m)!=128!/(115!13!)=2.12*1017~258个可能的密钥。通过1万台电脑,每台每秒进行10亿次搜索密钥的操作,破解者只需6个小时就能搜遍所有密钥。如果只有80%的信息,也就是知道128位密钥中的103位,那就有2.51*1026~288种可能。几乎增大了一百倍,破解者要花百万年来搜索密钥,故认为均匀的128位密钥不能被恢复。

文章来源:玩转单片机

围观 231

页面

订阅 RSS - MCU