MCU

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

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

永磁同步马达(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()函数。

文章来源: 博客园

围观 197

这篇文章是俄国人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

8048的面世标志着控制专用CPU MCU(Microcontroller Unit)的延生,而作为互联网基石的PC,其CPU8088却是在3年以后的1979年才出现。自1979年以后,PC的CPU从16位、4.77MHz时钟、单核发展到了今天的64位、常见的3GHz时钟和多核。而比PC的CPU历史悠久的MCU,其字节停止在32位已有10多年了。相对于芯片,MCU软件技术进展更慢,在PC机软件开发已由工厂化发展到全社会协同的今天,MCU软件技术仍停留在单打独斗的个人英雄时代。

尽管MCU的应用领域和市场规模都要比PC大得多,其MCU软件技术进展仍然十分缓慢,其中原因包括应用领域的碎片化导致公有技术抽象困难,开发力量难以聚焦。软件技术进展缓慢直接影响MCU芯片技术的发展,芯片的性能又反过来阻碍软件技术的发展。随着物联网(IOT)在人们生活中的渗透,高性能MPU的价格已下降接近MCU的价格区间,互联网软件技术不断向MCU领域浸入,加速MCU软件技术发展的时机已到来。

由无规则向OOA及OOD转化

MCU软件的前期分析设计将由无规则向OOA及OOD转化。传统的MCU软件开发,其分析设计和实施通常是由封闭的团队,甚至一个人独立完成。尽管团队内部成员理念一致、配合默契,项目实施敏捷。但整个开发过程都在同一团队进行,几乎不涉及团队外的协同开发,因此分析设计简陋,甚至只停留在口头上。随着IOT时代的到来,其封闭单一的团队难以适应今天的发展,团队外的协同是MCU软件开发的必然趋势,但前期分析设计的不足,会使问题变得更复杂。

将PC软件开发成熟的方法论引入MCU软件领域,则是促进MCU软件技术发展的捷径。OOA(Object Oriented Analyzing)和OOD(Object Oriented Design)是系统工程理论在PC软件技术中的体现,它们是支撑软件技术工厂化和社会化的重要理论基础。OOA及其OOD通过对应用进行分层、分类抽象处理,将部分层与类从应用中剥离出来,从而使协同者不需要了解应用就能进行软件开发。从1997年开始,作者以系统工程理论为基础开始探索OOA及OOD在MCU软件开发中的应用,并于2005年将初步成果应用于继电保护装置开发。其方法是将继电保护装置分层分类封装在4个不同的MCU之中,在不具备独立开发继电保护装置的团队中实施,其开发时间和开发投入远低于当时同行业经验丰富的开发团队。该系列继电保护装置已经应用10多年了,不仅维护升级方便,而且至今竞争力不减。

编程方法由FP向OOP融合

编程方法由FP向OOP融合是另一个发展趋势。在编程方法上,FP(Functional programming)与OOP(Object Oriented Programming)之间的战争从来没有停止过。作者认为脱离应用背景,讨论FP与OOP是毫无意义的,因为FP强调的是精英技术,它是开发人员的综合个人能力的体现,是一门精致而美的艺术,艺术的特点就是难以复制;OOP则是实施软件开发工厂化与社会化的一门技术,其不足在于CPU及其资源利用率低,但高速发展的芯片产业弥补了它的不足。MCU软件技术是FP的代表者之一,但它实在是无奈之举。因为直到2000年,主流MCU还停止8位、256Byte内部RAM和12MHz的时钟,在这样低的资源下进行软件开发,不仅仅是FP编程方法,更有C与汇编的交融,它已超越技术,升华为一门艺术。

2000年以后,OOP己成为PC软件开发的主流技术,现在主流MCU内核ARM cortexM3/M4与2000年时PC的资源配置接近,在MCU软件开发中实施OOP的条件已具备。PC软件开发成功的经验证明:实施OOP,是降低软件研发的门槛,是将软件开发从精英模式走向工厂化和社会化的有效措施。同时也是解决软件开发人员短缺的唯一手段。作者于两年前通过对OOP编程语言JAVA的归零学习,已感悟OOP之真谛。然后亲自编程将OOP技术应用于MCU软件开发中,并向同行、同事介绍OOP在MCU软件开发中的体会,让目前的MCU软件开发人员拓展思路,使他们从封闭的思维方式中解脱出来,走向社会化,其效果也是非常明显的。

软件开发的分离与成熟

中间件成熟,推动驱动软件与应用软件开发分离。过去因MCU性能和资源的限制,MCU软件开发与硬件开发是密不可分的,驱动软件是联接MCU硬件与软件之间的桥梁,它是MCU开发最重要的环节。因为驱动软件涉及软件和硬件技术,要求开发人员同时具备硬件和软件知识,所以驱动软件开发是MCU开发中最难的一个环节,它是MCU开发的主要成本。

2010年与ARM cortex M系列MCU先后出现的还有CMSIS(Cortex Microcontroller Software Interface Standard)。CMSIS是ARM公司制定的ARM Cortex-M系列MCU软件接口标准,它将MCU外设与软件无关抽象化。自此,MCU驱动软件由MCU制造商或MCU开发软件商提供,从而降低了MCU开发的难度,提高了MCU软件的重用性。

Ethernet、WiFi和Bluetooth是主要通信标准。作为IOT前端的MCU也必需具备信息交互功能。Ethernet、WiFi和Bluetooth等协议软件经过多年发展,已成熟、规范和专业,作为MCU的公有技术把它们植入到MCU软件之中是十分必要的。将它们封装成中间件,MCU软件开发时,在硬件的支持下只需要将这些中间件集成到MCU软件之中就能使MCU与互联网实现灵活的信息交互。例如ucTCPIP、CMX-TCP/IP、IwIP等是MCU软件开发常用的Ethernet中间件。在MCU开发时,不需要了解TCP/IP的细节,仅需将这些中间件集成到MCU软件中就能实现Ethernet功能。目前除了上述互联网信息功能外,还有大量的其他中间件,如MCU图形中间件emWin、USB中间件ecc-USB等。同时,MCU软件开发主流平台KEIL将自己的和第三方提供的中间件集成在同一开发平台上。MCU软件开发时,只需要将这些中间件集成到自己的软件中,就可实现相应的功能。

总之,MCU中间件的广泛应用,标志作MCU软件开发由封闭走向开放。在原生市场本来就广阔的MCU应用领域,借助IOT的推动,MCU软件技术必将迎来新的发展浪潮。作为经历了电子管时代,并且电路设计和代码编写己成为人生一大爱好的作者,将激情满怀地迎接MCU软件技术的又一次变革。

(作者唐晓泉博士,供职于中国科学院电工研究所)

来源:中国电子报、电子信息产业网

围观 381

对Flash-based的MCU来说,ISP和ICP几乎是不可或缺的功能。但我们经常被这两个功能搞混,究竟他们的差别在哪里?对客户的意义又是什么?在这里,和大家分享并澄清一些观念,希望对大家有所帮助,进而解答来自客户关于ISP与ICP的疑问。

1)在开发阶段

改code时,不再需要将MCU从板子上拔起来,拿到烧录器上烧,然后再装回去。可以直接利用ISP/ICP Programmer做板上烧录,为开发者提供了极大的便利性。

2)在量产阶段

客户可以采用“先焊到板子上再烧code”的方式,将烧code的动作安排在生产线的某一站。

那么传统的方式(先将code烧好再焊到板子上)有什么缺点?

传统的方式是这样的:拆封-->从tray盘取出chip-->烧录-->把chip放回tray盘。

这样的流程比起上面建议的方式:增加了烧录时间,容易造成QFP包装的chip弯脚,或忘了烧code即放回tray盘。

3)在成品阶段

已组装好的成品若要改code,可以透过预留的接口,利用ISP或ICP, 更新MCU,不需要拆机。

什么是 IAP(In-Application Programming)?

IAP指的是,MCU在运行的状态下,利用ISP的机制,不透过外接工具(例如:ISP Programmer) 的帮忙, 去更新APROM、DataFlash 或 CONFIG。要实现这种功能,系统必须有取得更新数据的能力,例如:处于某一种联机的状态。

(注:有时候, ISP/IAP的分别并不是那么清楚!)

ISP与ICP的差别

一、 ISP

(1) MCU必须处于可执行程序的状态(除了上电,还要接XTAL),且必须预烧ISP-code在LDROM里面

(2) 烧录范围只限于APROM、DataFlash或CONFIG (但对使用者来说, 应经够了!)

(3)chip在LOCK的状态下,仍然可以只更新某一区块 (APROM、DataFlash或CONFIG)

(4) 因为烧录的动作取决于ISP-code的写法,所以给系统设计者的弹性较大

二、 ICP

(1) MCU只要处于上电状态即可,不必预烧任何code在MCU里面

(2) 烧录范围涵盖整颗MCU,包括 APROM、 DataFlash、 CONFIG、 LDROM和 ROMMAP

(3) chip在LOCK的状态下,无法只更新某一区块,只能在erase-ALL之后,更新某一区块,再逐一烧回其它区块(因为ICP的本质就是走串行接口的Writer Mode,chip被LOCK之后,除了erase-ALL,所有烧录动作皆会被禁止)

(4)因为烧录纯粹是ICP硬件的行为,MCU无法自己更新自己,所以给系统设计者的弹性较小(例如:无法藉由ICP去实现IAP的功能)

三、ISP与ICP的使用场合

依这两者的特性,配合客户的系统需求, 而后才建议客户使用ISP或ICP。

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

围观 448

页面

订阅 RSS - MCU