物联网
来源:单片机与嵌入式系统应用
引言
物联网市场呈现飞速增长的发展,在这些领域蓬勃发展的背后,MCU作为物联网的核心器件,要满足怎样的条件才能符合用户产品的需要?更多联网产品的出现,使得MCU的功耗是否要越来越低?MCU是否要同FPGA和无线模块高度整合在一起,更加集成化地服务于上述技术领域?究竟什么样的MCU才能抓住机遇,登上物联网市场高速增长的列车?
业界声音
连接能力、能量模式和集成功能是MCU必备的素质
Silicon Labs32位微控制器 产品高级营销经理 ivind Loe
(1) 连接能力是物联网的必备条件
无论现在还是未来,连接能力都是物联网(IoT)连接设备中的微控制器的关键特性之一。强大的无线连接能力不仅对许多物联网应用而言是必需的,而且这些应用也需要更先进的特性,例如对多协议无线的支持,可用来处理诸如多种网络的调试和共存这样的问题。能够使通信信道安全对于保护物联网系统免受入侵也是至关重要的。安全性应该通过硬件加速来最大化效率、响应时间和电池续航能力,因为数量众多的物联网设备都是由电池供电的,或者拥有有限的能源。
此外,高效的传感器接口、灵活计时外设和高集成度通信外设也是关键的构件,这些外设必须都能够在深能级模式中自主工作,以最小化能量损耗。
物联网开发人员需要能帮助自己去实现能效最大化、调试问题和优化网络的开发工具。强大的软件构件也是非常关键的,它可以使开发人员致力于实现产品的差异化,同时无须为每个设计项目进行重复性的工作。
(2) MCU必须要有精心设计的能量模式
一些物联网应用,如智能抄表和智能信用卡,可能会有极低功耗的要求;而诸如智能手表等其他应用,可能对MCU本身的低功耗要求并没有那么严格,因为手表中其他的元器件可能占据了电流消耗的主要部分。
为了适合各种不同的应用,MCU必须拥有精心设计的能量模式,支持MCU去实现电流消耗与响应时间和功能之间的平衡。举例来说,诸如智能信用卡这种需要睡眠模式下电流消耗低于50 nA的应用,可以使用Silicon Labs的EFM32 Gecko MCU和Wireless Gecko SoC的EM4模式。EM4模式拥有最低的电流消耗,但同时只提供少量的外设且唤醒时间更长。而智能水表应用则宁愿使用Gecko MCU和无线MCU的EM2模式,因为EM2模式允许低于1 μA的电流消耗,同时允许复杂的传感器接口自主运行,以便水表处于休眠模式时仍可测量水流量。
(3) 集成功能对于MCU的众多好处
将各种功能集成到MCU中有许多益处,包括更低的解决方案成本、更小的占板面积和更高的功能集成度,进而可产生更高的性能和更低的能耗。我们也看到了对于验证无线模块的高度需求,该无线模块包含一个无线MCU,同时集成了包括天线在内的所有外部无线元件,从而使产品开发人员可以极其容易地将无线功能集成到自己的产品中。
安全防护是MCU急需解决的问题
新唐科技股份有限公司
单片机应用事业群技术经理 凌立民
物联网已开始席卷全球应用领域,成为市场关注焦点,根据高德纳 (Gartner) 物联网预测报告显示,2017年全球物联网装置数量将会达到84亿个,市场份额可达到1 700亿美元,而到2020年装置将成长至204亿个,份额达2 936亿,可见物联网市场为未来之新兴成长动能,台面上各家厂商亦已经积极展开布局。
进一步分析物联网应用范围,其应用范围相当广泛,包含智能医疗、智能家庭与城市、智能工厂、智能交通、环境监控与安控等;其中物联网终端设备为能支持各类型平台,串连网络传输与应用,因此必须具备高效能的运算能力,笔者相信高效能已经成为厂商竞逐的杀戮市场;但除了效能外,物联网终端设备更重要的是设备必须时刻无线连结上网,无时无刻不存在安全隐患,设想一个家庭的电、水与瓦斯等设备装设了可受远端管理的连网装置,如果能轻易被黑客窃取控制权,轻则导致能源供应中断,重则可能引起人身安全或重大公安意外。因此,作为物联网核心器件的单片机,除了效能外,更该考虑的是如何顺应日益严峻的连网安全需求。
目前物联网终端节点,大部分只配备了基础资源进行简单的感测与资料传输工作,但伴随着云计算与大数据的兴起,许多关键性的资料存储与运算都至云端进行,资料到达云端前会经过连接层、路由器层、通信协定连线层及网际网络层等,资料透过不同的装置传送,传递过程皆有可能出现安全风险;参考OWASP (Open Web Application Security Project) 组织所整理的物联网最可能引起信息安全与实体安全防护问题的疑虑之前十项为:
不安全的网络界面;认证/授权不足;不安全的网络服务;传输加密机制的缺乏;隐私权防护不足;不安全的云接口;不安全的移动设备接口;安全配置不足;不安全的软件/韧体;不安全的硬件设备。
不难发现,除信息安全外,实体安全防护仍是物联网最需要解决的问题。ARM公司在2016年10月发布了过去仅在CortexA系列才配备的TrustZone技术的CortexM23和CortexM33处理器,这两款处理器都是基于ARMv8-M架构的新型CPU;TrustZone技术可视为将软件运行在不同的处理器区域上,如安全区 (Secure Zone) 和非安全区 (NonSecure Zone) ,彼此互动将受到严格管制,我们可以想象如同在安全区开了一份白名单,唯有符合白名单条件才能通行,两种软件方能进行互动,因此TrustZone让通用型单片机借由白名单规则来防范恶意程序,满足物联网设备所需的实体安全防护需求。
当然安全防护有不同等级,以ARM 公司官方的分类来看,嵌入式系统 (Embedded System) 安全等级的考虑分为四类,安全性从低至高为应用级防护 (Application Level Security)、进阶型防护 (Privilege Level Security)、TrustZone防护 (TrustZone防护)、防窜改防护 (Antitampering Security)。
应用级防护本质上为软件所提供的安全机制,几乎所有市场上的处理器 (CPU、MPU、MCU等) 皆可以支持此等级的安全需求;进阶型防护在执行时将系统程序分类成Privileged和Unprivileged 状态,类似开了一份黑名单给管理单元来预防破坏的恶意程序,以警告或强制停止系统运行等方式进行保护,由特定等级的MCU才能做到;TrustZone防护仅少数MCU可以做到,如CortexA 系列或CortexM23和CortexM33系列;防窜改防护等级是针对特定用途所设计的芯片,考虑的是MCU本身对实体攻击 (Physical Attack) 的防护,如MCU线路布局设计、引脚信号不可侦测性、整体软件运行速度调整防止比对等进行防护。
上述四类的安全防护等级与投入的资源相关,设计者可思考自己的MCU应用系统需要提供的安全防护等级;一般应用级防护适用于所有处理器,故其出货量成长最为快速;进阶型防护可利用此类MCU内建的MPU (Memory Protection Unit)来设定专属记忆体保护区块,以运用于进阶资安需求的应用,例如一些未连网的装置或对连网安全不是那么有迫切需求的电子产品,TrustZone防护可适用于更高安全层级软件资产安全保障需求的生物办识领域(如指纹辨识应用、智慧连网装置如电子锁应用与门禁系统等),更可在MCU应用系统领域里实现由TrustZone所支持的更加安全的二次开发 (Collaborative Secure Software Development),同时兼顾连网装置在设计功能上多样性需求的弹性,非常适合用于打造安全之物联网环境,其成长力道不容小觑;至于防窜改防护MCU,例如金融行业的相关卡类应用可以说是对芯片安全防护要求等级最高的,可采用防窜改防护等级,保护机密资料不易被入侵。
物联网将持续发酵与带动半导体产业新兴应用发展,IC Insights预估,IC市场从2015年至2020年成长动能除车用市场外,以物联网市场成长最为快速,年复合增长率为12.8%。相信各家厂商要决战全球物联网市场,除了必须善用原有竞争优势,发展关键技术以外,安全相关的技术亦扮演举足轻重的角色,唯有确保了安全性,才能在此波商机中,抢得一席之地。
飞腾公司FT2000/64芯片性能追平Intel
2016年8月,飞腾公司发布了FT2000/64芯片,其通过集成高效处理器核心、基于数据的大规模一致性存储架构、层次式二维Mesh互连网络以及自定义扩展接口,搭配独立的存储扩展芯片(CMC),提供业界领先的计算性能、访存带宽和I/O扩展能力。
物联网的建设离不开海量服务器的支持,虽然ARM叫嚣着进服务器市场叫了不少年,但是到目前为止,产品并不多。所以,能有一款逼近了Intel的性能和性能功耗比的芯片,对整个ARM架构占领服务器市场来说都是意义重大的。
编辑视角
随着物联网时代的复杂化,海量数据需要被物联网硬件采集,大型的服务器同时要对海量数据进行处理、分析,对于64位MCU会有大规模的需求,将刺激64位MCU的大幅增长;而如何在低功耗的前提下又能实现较高的运算能力,成为摆在MCU厂商面前的一道难题,超低功耗MCU是物联网时代的必备条件;物联网环境下,要通过传感器感知外界信息,通过处理器进行数据运算,通过无线通信模块发送/接收数据,因此采用集成传感器+MCU+无线模块的方案才是MCU要抓住的机遇。
随着MCU技术的成熟、芯片设计技术的普及,以及对市场的充分了解,物联网时代不断涌现的巨型企业,必然会走专用MCU的创新之路。近年来许多大用户直接发展自己的专用MCU,如科大开发用于超级计算机、服务器的MCU、华为开发手机专用MCU,最近小米的松果芯片也面向市场,种种市场现象都表明,实现个性化的MCU创新定制才能抓住机遇,登上物联网市场高速增长的列车。
来源:SiliconLabs微信公众号
在上一节中,您了解了一些软件开发的基本实践和提示。我们在本节继续讨论这些主题,包括内联函数,读取和写入闪存(包括用户页面闪存),以及如何避免缓冲区溢出。我们将讨论类型转换的潜在问题,以及如何在出现问题时用配置锁解决问题。
根据下列重点步骤写好代码,一切都会更好!――续
(本系列1到8部分请参加往期文章:http://community.silabs.com/t5/Official-Blog-of-Silicon-Labs/Essential-B...)
九 内联函数的影响与限制
如果您在函数的前面定义关键字“inline”,则告诉编译器您希望将该函数复制到代码中,就像是直接输入代码而不是作为函数。作为程序员,你希望这可以加快代码执行速度。每当在C中调用函数时,输入参数的内容,在函数完成时,代码应该与返回地址一起被放置到栈上,然后代码跳转以执行函数。通过内联函数,您打算绕过该将数据移入和移出堆栈的时间。然而,C编译器或多或少地会用到这一技巧,因为小的函数将由编译器自动内联。编译器将忽略对大型函数的这种内联建议,编译器已经确定这些函数不会从加速中获益。
内联函数不能包含本地静态变量。由于函数内容要在代码中替换,因此对函数作用域私有的静态变量没有意义。内联函数没有作用域。
十 读写闪存的区别
在EFM32中从闪存的任何区域读取数据非常简单。可以使用指向内存地址的指针访问闪存,如:
volatile uint8_t* address = 0x1000;
uint8_t my_value =*address;
通过在地址变量前面放置星号,您可以解除引用指针,这将提供系统地址0x1000的字节大小的内容。从闪存检索的字节数将根据my_value的变量类型而有所不同。例如,定义为uint64_t的my_value将从地址0x1000到0x1007同时获取8个字节。因此,执行my_value ++作为64位无符号整数指向0x1008。
写入闪存是一个更复杂的业务。所有闪存将存储器组织成“页面”,其将可写入单元组合在一起,成为只能作为一组擦除的chuck。因此,如果要写入单个字节的非易失性存储器,则必须先擦除整个页面。对于程序员来说,这意味着你必须首先读取整个页面的内存,将它存储在RAM中,擦除页面,然后将修改的字节写回整个页面,你在操作的中间不能失去电源,否则你将永远失去了那个页面的数据。通常也有时间含义,因为擦除和写入页面比读取值需要更多的时间。当一页闪存被擦除时,该页的所有内容被复位为1,或在字节大小的存储器查看器中为0xFF。因此,当你写一个字节到内存,你只是清除那些不是1的位。
要写入EFM32闪存,另一个要求是,写入闪存的功能必须驻留在RAM中,而不是在正常执行代码所在的闪存中,在那里相同的代码正被执行。这要求任何意图写入闪存的函数也将被执行的RAMFUNC声明,就像在ramfunc.h库实用程序文件中定义的那样。
十一 将持久数据存储在Flash用户页面闪存中
主闪存从地址0开始,并根据EFM32模型有着不同的容量上限。有关特定芯片的主闪存结束的位置,请查看参考手册。除了内置闪存,还有一个内存区域,用于外部闪存扩展,其位于内部主存储器之外,最高可达24 MB。上一节中所述的任何读取或写入主闪存的操作都可用于访问主闪存。但是,每次对芯片编程时,或者如果器件被擦除,存储在程序使用的区域中的数据将被新的代码覆盖。因此,当执行闪存更新过程时,例如,在引导加载器中,通常使用对主闪存的读取或写入。您当然可以随意使用位于程序大小以上的闪存,只要您意识到如果芯片通过器件擦除操作或JTAG编程序列擦除,它将被擦除。
EFM32提供了一个单独的闪存存储器页,它不会被器件擦除操作或JTAG编程操作擦除。闪存的这个区域称为用户页,并从地址0x0FE00000开始。可用的内存量是单页,并且闪存页面的大小根据EFM32芯片的型号而变化。有关闪存页面的大小,请查看数据手册或参考手册。您可以将此页面用于从设备擦除操作(例如设备序列号,设备校准数据或每个设备特定的任何数据)开始,从引导到引导的设备上保留的任何内容。
十二 避免缓冲区溢出和可能造成的破坏
当使用计算机开发代码时,您很幸运能在具有操作系统,内置文件系统和显示屏幕的系统上开发。当你的软件遇到麻烦,操作系统开始采取行动,帮助你,并通知你,你试图访问超出程序范围内的内存,或者你造成了一些故障。在开发嵌入式代码时,你没有这些帮助。没有操作系统来监视事情,以确保你的程序保持在一个很好定义的边界。如果你的代码决定写数据到地址零或一百万,MCU将尝试做它被告知的任何事情。它不能告诉你,你不知道你在做什么,因为没有限制你的程序可以做什么。你种情况有好坏两个方面。
嵌入式开发人员面临的一个大问题是缓冲区溢出。在嵌入式中工作意味着对存储器地址的大量直接操作。如果你的程序开始表现不规律,或者你看到一个看起来改变其值而不设置的变量,缓冲区溢出可能是罪魁祸首。
首先要注意的事是显而易见的。如果定义一个长x个字节的数组,请不要写超出x-1。如果在名为foo的数组中有x个项目,则只能将foo [0]映射到foo [x-1]。坏事是,如果你寻址foo [x],foo [x + 1],等等,你的代码仍然有效。 MCU将满意地写入任何其他变量恰好超出foo [x-1]的位置。然后你的项目开始出现问题。
当你调整指针,而将指针转换为不同的类型时,这也可以失去控制。例如:
void some_function()
{
// Array of just 4 bytes
uint8_t my_array[4];
// Pointer to group of 4 bytes
uint32_t * my_ptr =(uint32_t *) my_array;
// foo is assigned all 4 bytes of my_array,
int foo =*my_ptr;
// then my_ptr is incremented by one
// which to my_ptr's type means 4 bytes
// So my_ptr is now sitting out of bounds
my_ptr++;
}
以上演示了为什么使用在创建时是单向键入的结构,但稍后由不同类型的指针使用需要小心的原因。你可以做类型转换,但并不意味着你应该做。
另一种可以遇到缓冲区溢出问题的方法是忘记局部范围的限制。在C中,函数完成的大部分工作都是在传递给函数的指针上执行的。C函数的返回值通常被限制为“状态”字节,因为简单的值很容易从堆栈中的C函数返回,而其他结构很难返回。例如,一个简单的数组是局部的一个函数:
// This function will generate a compiler warning:
// warning: function returns address of local variable
int* some_function()
{
int my_array[4];
return my_array;
}
// This function has no warning!
int* some_other_function()
{
int my_array[4];
int* foo = my_array;
return foo;
}
一旦函数返回,分配给my_array的内存将被系统回收并分配给需要内存的下一个东西。如果从C函数返回一个指向本地数组的指针,编译器不会警告你,MCU会做你所要做的事情。如果在函数返回之后没有新的内存分配,代码有时会工作。你的解决方案将是间歇性的!
// This is a better way, pass pre-allocated pointers intothe function
// “int my_array[]” and “int * my_array” are identicalfor function parameters
void some_new_function(int my_array[])
{
my_array[0]= 1;
}
十三 精通类型转换
当你在嵌入式开发中“触及核心”时,你会经常使用小量的信息,所以你最终经常使用有限的可变大小(例如8位寄存器)寄存器,从一种类型转换到另一种类型。本节的一些例子展示了在uint8_t类型和uint32_t类型上增加指针时,你必须注意对地址的影响。此外,还必须了解C编译器如何解释和转换类型。
将类型从一种类型转换到另一种类型实际上不执行任何转换。它不是一个函数,而只是一种告诉编译器如何解释数据的方法。当你分配不同类型的变量,C编译器应该警告你,但编译器并不总是警告你这一点。例如,考虑将有符号整数转换为无符号整数的情况,如下所示:
int8_t a = 0; // Range is -128 to +127
uint8_t b = 0; // Range is 0 to 255
long c = 0; // Range is huge, both positive and negative
a =-64; // a can be negative
b = 64; // b can only be positive
c = a + b; // c is 0
a = b; // Converting a signed to unsigned is OK, in this case
c = a - b; // c is again 0
b = 128; // b is now bigger than a can represent
a = b; // a is now converted to -128
c = a - b; // c = -128 - 128 = -256!
这个例子显示了当你的变量变大时会遇到的麻烦。事情工作正常一段时间,但然后当你的变量超过范围,他们开始失败。确保在转换类型时知道您想要什么。大小为8的uint不能容纳超过0到255范围的任何内容,8位的int不能容纳超出-128到+127的任何内容。简单地把一个大的uint8_t作为一个int8_t不能将你的int8_t变为一个更大的int。它仍然限制在+127。如果你想增加它的范围,你必须使用更大的类型,如int16_t。
十四 使用配置锁来缓解故障代码的问题
有时候,当嵌入式工程师对指针进行数学运算时,我们会使用我们的软件来影响硬件。一种保护你的代码不因缓冲区溢出和其他糟糕的指针算法而造成严重错误的方法是使用配置锁。许多EFM32外设上可用的配置锁需要一个特殊值写入配置锁寄存器,以允许更改外设配置。这防止错误行为代码改变设备的整体配置。
编码成功的关键
从现有示例开始,然后使用命名良好的变量和大量注释记录您的更改。进一步了解C语言,并了解在何处以及如何声明变量和函数。不要尝试写入尚未擦除的闪存或超出变量可访问范围的内存。
在下一节中,我们将学习如何在SimplicityStudio IDE中更好地控制软件构建。
随着物联网智能化的提升和不断迭代,FPGA将发挥更多的数据预处理、桥接、I/O扩展等作用。
电子企业的成长一般都会呈现“S型”曲线,与产业的走势休戚与共。要与之对抗,需应对技术和商业模式的双重挑战。英特尔PSG(可编程解决方案事业部)产品营销与策划副总裁Alex Grbic认为,未来万物皆互联的时代,技术层面要解决互操作性,满足相关标准协议,或某应用层面的协议,以及如何在大量数据的收集和处理的同时提升性能和降低功耗。商业层面涉及系统的灵活性和可扩展性,此外价格是重要考量。因而,对于IC的革新至关重要。

01FPGA适应智能化和I/O扩展需求
在物联网的方案中,MCU扮演核“芯”角色。但随着应用的更新迭代,MCU+的趋势也愈来愈明显,特别是MCU+FPGA应用广泛,以满足性能、可扩展以及集成的要求。
Alex Grbic举例说,以汽车业为例,随着智能化的提升,汽车传感器会越来越多。此外在显示方面,不仅LCD显示屏的数量会翻番,而且分辨率要求也越来越高,需要芯片进行更高速的处理、支持更高的带宽。在工业和嵌入式视觉领域,也需要不断满足智能、视频图像和传感器等的升级需求,处理更多的数据,支持更高的I/O带宽。
这时“单打独斗”的MCU或难以“招架”,需要协处理器来做一些数据预处理,或I/O扩展。相较而言,低端FPGA因其配置和可编程,不失为协处理器最佳选择。
“比如在视频监控中,FPGA可作为视频信息预处理后,再交付给MCU运算。或者在汽车智能应用中用于后视摄像头和传感器融合,进行多传感器数据的高速处理,再传给MCU进一步处理。针对把成本和功耗作为设计决策关键要素的应用,则可做芯片之间的桥接、I/O扩展等。此外,在某些应用场景中,FPGA亦可单独做主芯片。”Alex Grbic表示。
虽然低端FPGA作用显著,但对其也提出了支持高速收发器和硬浮点运算的新要求,需要与时俱进。英特尔PSG最新发布的低端Cyclone 10 FPGA可谓有备而来。
02新FPGA的“和而不同”
虽然FPGA玩家屈指可数,但低端FPGA基本是个个涉足,竞争激烈。但Cyclone 10 FPGA与其他低端FPGA不同的是,其GX型号是业界首款集成10G收发器和硬浮点数字信号处理(DSP)的低功耗FPGA,处理速度高达134 GLOP,性能相对前一代Cyclone V有两倍的提升至1.4G,但功耗却与其相当。而LP型号则更强调的是低功耗和低成本,功耗仅为前一代的60%。
因而,在高I/O效能及对速度有关键性需求的应用,包括汽车、工业和嵌入式视觉领域,GX完全胜任;这些应用涉及的芯片之间的桥接、I/O扩展等,LP亦可发挥作用。

对于成本和功耗的双重优化,Alex Grbic英特尔PSG的诀窍在于:一是采用台积电成熟的20纳米工艺;二是架构的创新和软件工具的优化,如针对FPGA的应用场景会定制或者筛选匹配的软件工具。架构创新。三是测试和封装的一些流程的优化。
值得注意的是,Cyclone 10 FPGA集成了可定制的软核(Nios II处理器),实现可编程和可配置,但是不支持ARM,是否英特尔的FPGA策略会有所改变?Alex Grbic回应说,英特尔现有的Cyclone V和中端Arria 10和Arria V均支持ARM,上一代的Cyclone V可平移到Arria 10和Arria V。未来的产品规划也都会将集成ARM的SoC纳入其中,这不会改变。
03成英特尔IoT大战略重要一环
值得注意的是,英特尔PSG开发的 Cyclone 10,锁定汽车、工业、嵌入式视觉等应用,与英特尔物联网部门的战略相当一致。
近些年英特尔在全力开发更开放、安全及可扩充的IoT解决方案,构建IoT生态圈。将Altera纳入囊中后,FPGA也成为其大生态良性循环的重要棋点。
Alex Grbic也着重指出,Cyclone 10与英特尔IoT的战略相符。英特尔的FPGA可涵盖从万物到云端的所有领域。Cyclone 10主要应用场景集中在万物和管道端,其中价值在于进行智能化数据处理,或预处理完再上到云端,减轻云端负荷。针对更高端的云端应用,则可采用英特尔中端和高端的FPGA。

如今,中高端FPGA在云端+CPU或+GPU之势正兴,英特尔推低端Cyclone 10,或意图进一步加强在万物和网络端的实力。而有着英特尔的大生态规划及先进的工艺节点“护航”。Cyclone 10的市场表现亦值得期待。
来源:智慧产品圈



在本系列的第一部分中,我们介绍了修订控制系统,以及它如何安全地保存您的设计文件,并帮助您找到设计文件之间的差异。在本节的第二部分教学中,您将了解如何构建自己的硬件。
这个系列文章有六个部分:
1. 使用版本控制系统
2. 在面包板上开始开发
3. 原型构建
4. 写好代码,一切都会更好
5. 像专业人士那样构建源代码
像天才一样调试问题
开始使用面包板进行开发
当在EFM32上开始一个新项目时,您可能已经参考了本书的一些例子,并认为您有了足够在定制印刷电路板(PCB)上开发自己的EFM32解决方案的能力。但不要让步子太大,可以遵循下列步骤以确保开发的成效:
1. 一步步进行测试
为了获得最佳效果,每个项目都应该从“面包板”开始,在此阶段,您可以为设计中的每个主要设备组装入门工具包和分线板。虽然您可以多次阅读设计中的设备规格,但在您尝试通过软件与设备进行交互之前,您无法真正学习如何使用设备。只是将设备连接到您的入门套件,并尝试通过电气接口与之通信,都将帮助你获得许多从阅读规范得不到的经验。虽然一些规范开始时有很大的意义,但你很快就会发现规范没有涵盖启动设备并开始使用它所需要的一切,或者至少它掩盖了一些重要的信息,如需要额外的信号线,额外的外部电路或许多其他重要的细节。
2. 为每个设备找到或制作自己的分线板
为了使用外部器件,您需要在设计中为每个器件找到一个分线板,评估或开发套件。如果你不能找到一个设备(或者如果它太贵),你通常可以按照本书第9章的说明自己构建一个。如果这是不可行的,例如你的设备有一些难以焊接的器件封装,如BGA,你有时可以找到芯片的备用封装,其具有相同的电气性能与更容易焊接的封装。
如果您的设备需要大量的支持电路来运行,例如特殊的电压调节器,那么开发您自己的评估板是完全值得的,因为开发这样的板,可以证明在你构建整个系统PCB前,你对你设备的引脚分布,footprint和支持电路是完全理解的。这些footprint文件可以在您的系统设计中重复使用,它们已经完全验证。
3. 仅针对基本功能
一旦将评估设备连接到入门套件进行测试后,重点应该是让部件基本上起作用。由于您通过跳线进行连接,因此在某些情况下,信号接口的电气要求将不能全速工作,因此要将速度保持为电气接口最低的速度,并保持EFM32 GPIO输出的最低驱动强度。在进入进一步的功能之前,编写代码来做一些简单的事情,比如读取设备ID寄存器或者做一个简单的写操作。由于可能在跳线上发生的复杂的信号完整性问题,某些频率可能是不可达到的,所以不要对面包板模型有太多期望。
该过程的要点是在设计定制PCB解决方案并将设备驱动程序集成到系统软件之前,尽可能多地了解设备的要求。这将问题隔离到单个子系统,并使您的最终开发就像是系统集成的练习。
面包板成功的关键:
对于设计的每个子系统,使用隔离面包板启动所有项目
为任何棘手的footprint或需要大量板载电路的部件开发评估板
专注于让部件“正常工作”,而不是寄希望于在面包板上实现全面性能
规划原型设计
一旦你的面包板实验完成,你已经确定了将组成您的EFM32解决方案的设备,是时候开发一个自定义PCB,以将所有这些组件一起作为一个单一的系统了。虽然此时定义外壳并且开发一个适合目标外壳的微型板也是很有诱惑力的,但是将第一个定制PCB开发为一个仅专注于测试和开发的大型测试系统是一个更好的主意。
1. 严肃地使用测试点
内置测试PCB是最终解决方案的一个版本,包括访问设计中的所有信号作为测试点。具有测试点的设计中的任何信号都可以通过万用表,示波器或逻辑分析仪进行探测。测试点可以是铜的暴露的“焊盘”,允许应用插头引脚和跳线的通孔结,或者甚至用于探针夹的金属环。将所有组件和测试点放在内置测试板的顶部也是一个好主意,这样调试更容易,因为您可以无需翻转板子。
要查看测试点的类型,只需查看您的入门套件的背面。电镀通孔测试点是我们焊接插头引脚的测试点。小金圆焊盘是表面贴装测试焊盘,适用于探测或焊接其中可以连接小探针夹的小导线。
2. 计划硬件设计spin
通过规划内置的测试版本的PCB,它将需要至少一个“spin”或重新设计生产解决方案的板。设计一个从第一次测试到生产的电路板是非常罕见的,几乎是不可能的。内置测试PCB允许您在启动期间询问系统,并轻松地研究设备之间的电气接口,而无需依靠特殊的焊接技术将探测点连接到电信号。应添加一个全功能通孔JTAG调试器连接器,以便与Simplicity Studio IDE完全交互,就像您的设计是入门套件一样。尽管可以仅使用UART编程开发生产板,但是在没有JTAG调试头的情况下将丢失调试功能,点击此处查看3M N2520-5002RB。http://eu.mouser.com/ProductDetail/3M/N2520-5002RB/?qs=QV10cN0MjFtnDIM27...
您可以通过在电源和每个器件之间放置1欧姆左右的精密电阻,然后测量(或选择范围)精密电阻上的电压差,来研究系统中每个器件的功耗。
3. 使用比您认为在生产中需要的更大,更好的EFM32零件版本
当您开发您的第一个定制PCB版本的设计时,使用一个比你认为最终解决方案需要更多的闪存和RAM的EFM32系列的部件。有时可以保持相同的引脚数和占用空间,但通过使用比最终生产解决方案更强大的部件构建您的设计,可以获得额外的闪存和RAM。与使用优化器减少内存占用的“发布”版本相比,Simplicity Studio中的“Debug”需要更多的闪存和RAM,因此通过在原型阶段升级到更高能力的部件,您将使调试成为可能。你也可以移动到更多功能强大的,有更多引脚的产品,如果它使得调试您的解决方案的工作更容易。只要小心不要依赖升级系列的功能,当您转移到您的生产解决方案时,这些功能将消失。此处提供了一个选择器指南,其中显示了每个系列中每个器件的功能,容量和引脚数。
4. 通过JTAG连接到您自己的PCB,就像它是入门套件一样
当您拿到内置测试PCB时,要使用PCB上的JTAG调试头,您可以将IDT电缆(如此处提供的Assmann H3CCH-2018G http://www.digikey.com/product-detail/en/assmann-wsw-components/H3CCH-20...)连接到入门套件上的JTAG连接器。然后,在Simplicity Studio中的Kit Manager下(将入门套件连接到计算机之后),选择Debug Mode:Out。

您可能必须返回Simplicity Studio的主页并选择“Target Part.”。这样做,右键单击检测到的入门套件,然后选择“Select Target Part...”

在打开的“Target Selectionfor EFM32 ...”窗口中,将目标接口更改为SWD,忽略其生成的任何警告(只要您连接到EFM32部件),然后单击Detect Target按钮。对于出现的任何弹出窗口,按Yes按钮,直到零件标签显示自定义PCB上的实际设备。这将证明从入门套件到自定义PCB上的EFM32部件的JTAG连接被计算机上的Simplicity Studio检测到。

完成所有这些步骤后,无论何时在Simplicity Studio IDE中启动项目,用于项目的部分必须与目标选择中找到的部分相匹配,以便开始闪存编程和调试。这允许您调试您的自定义PCB,就像它是一个入门套件。
原型设计成功的关键
不要跳过原型构建 - 您将不会在第一个PCB上“直接生产”。
添加一个JTAG连接到您的第一个版本,以及您可以找到的最大的,功能齐全的EFM32芯片。
为您的项目配置正确的设备,并将入门套件调试模式设置为输出以调试您自己的项目,就像它是入门套件。
在下一节中,我们将进一步介绍软件开发和调试的提示。



来源:Silicon Labs
作为有着20年经验的计算机工程师和超过两年经验的EFM32TM项目开发人员,我很有着丰富的,开发复杂计算机工程项目的经验。感谢诸如芯科科技(Silicon Labs)的Simplicity StudioTM软件,和如EFM32入门套件的硬件调试工具,类似项目对于经验的要求大大降低了。通过这些平台,任何人都可以快速,低成本地开始嵌入式开发,在拿到入门套件后很短的时间内,您可以直接完成自己的硬件支持的嵌入式解决方案。欢迎点击“阅读原文”至芯科科技(Silicon Labs)中文论坛观看完整的物联网创客指南文章。
展开EFM32的设计旅程
本系列文章的主旨,就是帮助你开始使用EFM32芯片内的所有外设。 然而,只给你一些类似让LED闪烁的例子,和让电子元件在某一个例子中开始工作,并不意味着你自己项目的成功。我多年的经验,能够指导我预先决定如何连接硬件,如何构建软件,如果出现错误,我的直觉会告诉我下一步的解决问题的调试过程。但是如果你没有多年的经验呢?你如何在缺乏经验的前提下找到成功的解决方案呢?我对这个问题的回答将会出现在这个系列的文章中,我将尝试提炼我通过无数弯路积累的经验。
您可能需要先阅读本指南几次,然后当您遇到问题时再次阅读。这可能是解决不断出现的问题的关键。其中一些提示涉及Simplicity Studio集成开发环境(IDE)的错误和细微差别,可能随着Simplicity Studio版本的升级而改进。但是本指南中的大部分提示都是通用的,应该适用于设计的所有方面。
这个系列文章有六个部分:
● 使用版本控制系统
● 在面包板上开始开发
● 原型构建
● 写好代码,一切都会更好
● 像专业人士那样构建源代码
● 像天才一样调试问题
第1部分:使用版本控制系统
在开始使用新设计之前,请为所有设计工作设置版本控制系统。这对于许多人来说可能是显而易见的,因为这些系统在软件开发中应用非常广泛。但对于嵌入式开发来说非常重要,其中源代码文件中的单个字符差异,可能导致成功的解决方案和完全失败的方案。
● 查找修订版本之间的差异
版本控制系统允许您的工作随着设计的进展保存在各种快照中,并允许您比较每个快照的文件差异。这些系统是免费提供的,可以安装在所有类型的操作系统(Windows,Mac和Linux)上。今天最流行的工具是SVN和Git。我两个系统都用,但我更喜欢Git,因为它保留完整的仓储,包括在您计算机上所有的可用的本地修订历史记录,您可以完全离线工作,然后上传到远程服务器以备以后的更改。
另一方面,SVN只保留本地计算机上的最新修订版本,并需要与服务器进行活动连接,以获取过去的修订版本和其他历史记录信息。本系列的代码示例存储在一个在线Git仓储,Github中,所以你应该开始 “克隆” 该仓储到本地硬盘驱动器并进行更改,然后尝试使用Git命令行或GUI工具以查找文件中的差异。设置和使用Git超出了本指南的范围,但有很多教程可供学习。
● (可选)在Simplicity Studio中设置Git
Simplicity Studio可以配置为在Simplicity Studio IDE中使用Git。这允许您提交更改并在IDE中查找文件间的差异。有关如何获得该设置的详细信息,请访问Silicon Labs社区。请注意,集成不需要使用版本控制,我不使用我的计算机上的集成。我只是在我的本地文件夹上运行Git的命令行版本或GUI工具,以进行提交和差异审查。
● 将所有文件存储在仓储中,而不只是源代码
每当您启动一个新项目时,设置一个新的版本控制仓储(简称为“repo”),以存储与该项目相关的所有文件。在该repo继续存储所有的规格和数据表,设计文档,电子表格,等等。你永远不知道您在线查看的文档何时可能不可用或由制造商更改。在一个安全的地方将备份与设计文件放在一起是一件好事。也不要停留在文件本身。在版本控制中也存储项目的原理图和布局文件。
● 在线保存repo的备份
最好使用在线服务,如Github,Atlassian,Google Drive,Microsoft OneDrive或任何其他在线备份服务,以保留额外的备份副本的repo。当你的硬盘驱动器崩溃或你的笔记本电脑丢失,克隆Git repo的最后一个服务器副本就会是非常快速和容易的选项,让您的设计文件回到您的计算机上。
● 尽早的,经常性的提交
一旦你的repo设置并跟踪你的文件,确保在你达到项目中的每一个重要的步骤时,“提交”你的设计文件。当你刚刚能够第一次与某些芯片通信时,提交代码,并在日志消息中指定项目的当前状态,即使源代码是一片混乱的。例如,“通过SPI读取加速度计设备ID”是一个很有用的消息,它可以让你知道提交到repo的代码的基本功能。
接下来通常发生的是,你清理代码,使其更好,更可读,以及有更好的性能,但有时该过程会破坏代码。有时,为什么代码出问题的原因是显而易见的,但有时,你做的解决问题的尝试都不起作用了,你得到了一个不再工作的解决方案。如果您在repo中有一个已提交版本的正常代码,您只需首先将新代码提交给repo,然后在本地驱动器上回到您的更改,看看原来的解决方案是否仍然有效,这让您知道至少你没有出现特别大的错误。然后,您可以使用版本控制系统的差异工具来显示从第一个版本到第二个版本的差异,并最终隔离和修复该问题。
使用版本控制隔离硬件问题
嵌入式开发和纯软件开发之间的一个关键区别是,硬件可以在嵌入式应用程序上随运行而改变。当您第一次运行解决方案时,一切正常,然后您进行一些更改,这时就可能不正常了。这可能是软件的问题,但也许是因为一根电线在某个地方松动了?通过提交对repo的更改,然后回到最后正常工作的版本,你可以确保问题不在软件上,然后找到并修复松动的电线,更新,回到最新版本的repo并继续开发。
版本控制成功的关键
将修订控制系统集成到设计的所有方面。
将仓储的副本保留在联机备份中以便保管。
提前并经常提交有关代码状态的描述性消息。
页面
