EFM32

Silicon Labs(亦称“芯科科技”)近期发布的新款32位MCU EFM32PG23和8位MCU EFM8BB50产品旨在通过更优化的设计架构来帮助开发人员加速产品原型设计。PG23和BB50不仅进一步扩大了Silicon Labs的MCU产品组合,并且利用小尺寸和低功耗设计满足各种微型、电池设备和物联网应用的需求。即刻点击链接访问官网了解更多产品信息:https://cn.silabs.com/mcu

1.png

EFM32兼具超低功耗和高性能优势

EFM32是一款节能微控制器,专为超低功耗应用而设计,特别面向功耗敏感的消费和工业产品。EFM32系列MCU旨在能够扩展功能性以确保执行任务所需的实时容量,同时还能维持较低的系统功耗。由于EFM32 MCU系列基于Cortex-M内核、高度集成、低功耗的设计,因而成为许多物联网应用原型设计的理想选择。

全系列EFM32 MCU适用于:

  • 消费产品

  • 智能电表

  • 家庭自动化

  • 工业自动化

  • 通信集线器

  • 工业控制枢纽

以EFM32系列中的最新型号PG23为例,该MCU体积虽小,但适用于许多应用,它具有工作频率高达80 MHz,工作电流仅为21µA / MHz的Arm Cortex-M33内核。在休眠模式下,PG23的电流可低至1.03 µA。凭借这样的低功耗以及低能耗传感器接口(LESENSE),PG23在电池供电应用中表现出色。该MCU为大多数算法提供了足够的内存,拥有高达 512 kB的闪存和64 kB的RAM。除了配备完善的串行通信外围设备,PG23还具备LCD控制器、键盘扫描和芯片内置温度传感器。

为了检测边缘信号,PG23拥有两个模拟比较器和一个具有灵活分辨率的模拟数字转换器,分辨率为12、16或20位可配置。开发人员还可以更改ADC的模式来获得2 Msps的高速模式,或者专注精确度,以便获得高达16位的ENOB高精确度模式。通过提升精确度,使PG23成为许多消费类医疗,或是测试和测量应用方面的理想选择,可用来快速构建及部署人工智能和机器学习算法。

探索更多关于PG23的产品信息和技术文档:https://cn.silabs.com/mcu/32-bit-microcontrollers/efm32pg23-series-2

Silicon Labs在MCU行业中以超低的功率提供了较快的速度,利用经优化的数字和模拟外设,具有灵活的引脚映射和较高的系统时钟速度,结果是在更低的功耗和更少的延迟下更快地进行原型设计。这些属性非常适合于应对混合信号和低延迟设计的诸多挑战。

极小尺寸的BB50 MCU,降低开发成本和复杂性

EFM8 8位MCU利用经优化的C8051内核,可以在一个周期内运行70%的指令。核心频率最高可达72MHz,有源电流低至150µA/MHz,睡眠电流低至300nA。总的来说,尾流时间降低到2µs, ADC是14位SAR ADC。该系列微控制器的GPIO范围为13-40,具有高达64kB的闪存和最高可运行4kB的RAM。

以EFM8系列中的最新型号BB50为例,BB50 MCU系列产品专为极小尺寸的物联网设备而设计,尺寸范围从边长2毫米(约#2铅笔芯的宽度)到5毫米(小于标准#2铅笔的宽度)。在这极小尺寸封装中,该MCU集成了丰富的模拟和通信外围设备,大幅减少外部组件数量,从而显著降低产品总体物料清单(BOM)成本。这一系列特性使BB50成为微型、电池优化设备的理想选择,例如互联医疗设备、可穿戴设备、资产监控标签、智能传感器,以及牙刷和玩具等简单的消费电子产品等。

全系列EFM8 MCU广泛的应用包括:

  • 烟雾探测器

  • 遥控器

  • 电机控制

  • 消费产品

  • 移动设备

  • 照明控制

探索BB50产品信息和技术文档:https://cn.silabs.com/mcu/8-bit-microcontrollers/efm8-bb5 

本文部分内容参考网站:https://circuitcellar.com/newsletter/silabs-latest-mcus-efm32-and-efm8-are-aimed-at-quick-prototyping/

来源:SiliconLabs
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 19

为了帮助工程师更容易掌握Silicon Labs(亦称“芯科科技”)的EFM32 32位MCU系列产品以及EFR32系列多协议无线SoC/模块的开发技巧,我们特别制作了本篇文章提供Simplicity Studio相关的外设(Peripheral)应用示例。这些示例在我们免费的Simplicity Studio软件开发环境中非常容易取得,只要将EFM32或EFR32的开发板连上Simplicity Studio,即可参考针对各种不同应用的外设示例。

我们希望能帮助您能够找到最合适的示例来测试您的开发套件,并使您的初始设计能够参考其中的示例做为基础,从而加速开发过程。但是,如果您不能找到您正在寻找的示例,我们在公共存储库中有各种各样的未发布的示例,将能提供您更进一步的帮助。点击访问Silicon Labs的公共存储库:https://github.com/SiliconLabs

在那里你可以找到几乎所有有关Silicon Labs设备的例子。在本博客中,我们将向您展示如何访问EFM32/EFR32外围设备示例。

EFM32 / EFR32外设示例:
https://github.com/SiliconLabs/peripheral_examples

第一步:了解设备系列
首先你需要知道你的设备是什么系列,你可以看看开发套件包装上的标记,下面表格中标示的数字则是序列号。

第二步:外设名称
下面的表格列出了所有的设备外设设备及其描述:

第三步:访问外设示例
要访问外围示例,请执行以下步骤:
复制或下载存储库到Simplicity Studio安装中的以下路径:
C:\SiliconLabs\SimplicityStudio\v4\developer\sdks\gecko_sdk_suite\v#.#\app\

#代表的是Gecko SDK套件的版本号。

通过以下一系列的点击访问,从Simplicity Studio导入你想要的例子:
File -> Import, orProject -> Import -> MCU Project

要访问来自IAR的示例,只需导航到所需的.eww文件并双击它。

更多参考示例
● EFM32/EFR32 Peripheral API Reference:
https://siliconlabs.github.io/Gecko_SDK_Doc/index.html
● Simplicity Studio Manual:
https://www.silabs.com/documents/public/application-notes/AN0822-simplic...

来源: SiliconLabs

围观 298

在前一节中,你了解了一些帮助你进行硬件原型设计的重要原则。在本节中,我们将分享在软件开发方面的经验教训。关键词extern,static和volatile都是什么?你应该在你的代码中使用递归还是malloc()?

根据下列重点步骤写好代码,一切都会更好!

一 查找硬件设备的现有软件示例

开发任何嵌入式解决方案的第一步是找到可以使您的任务更简单的示例。您在自定义解决方案中找到的特定部分的软件示例将帮助您以另一种方式“查看”设备,并帮助您重新解释设备规格,即使这些示例是针对其他计算机架构或软件语言的。

二 编译器的代码

没有完美的计算机软件语言。所有语言都有自己的优势和弱点。用于EFM32家族的Simplicity Studio中使用的软件语言是C. C语言有着很长的历史,它被广泛信任,并且在嵌入式设计上表现良好,但是其语法及特性很难掌握。当你在C中编码时,你实际上是为编译器和其他构建工具编写指令。记住这一点。C语言是“接近金属”的语言,因为您的代码在人类可读格式下编写的代码,汇编代码和二进制映像的构建过程的结果之间仅有几个步骤。

C代码具有严格的类型,要求某些变量匹配得足够好以执行安全赋值。这是为了保护你不要做愚蠢的事情,比如变量(即指针)的地址和变量的内容。但是经常在嵌入式开发中,您需要能够将纯数字转换为地址,以便指定寄存器地址。这需要你熟悉类型转换,以告诉编译器你真的知道你在做什么。

三 使用描述性变量和函数名称

你可以做的最好的事情是确保你的代码设计得很好,使用描述性的变量和函数名。在C代码中没有与长名称关联的运行性能损失。当构建工具将C代码转换为二进制机器码时,将删除所有标识符。请考虑在FAT文件系统(FF)库中找到的以下代码段:

res= dir_sdi(dj, 0);
if (res == FR_OK) {
do{ /* Find a blank entry for the SFN */
res= move_window(dj->fs, dj->sect);
if(res != FR_OK) break;
c= *dj->dir;
if(c == DDE || c == 0) break; /*Is it a blank entry? */
res= dir_next(dj, 1); /*Next entry with table stretch */
} while (res == FR_OK);
}

上面的代码有一些注释,这当然有帮助,是一件非常好的事情,但是很难通过查看变量,函数,枚举和预处理符号知道这个代码的确切原因。考虑使用以下代码作为替代:

// Load the first target_directory entrywithout table stretch
result = set_directory_index(target_directory,NO_TABLE_STRETCH)
if (result == FAT_RESULT_OK)
{
//Look for a blank entry for the Short File Name over all directories
do
{
result= find_next_window_offset(target_directory->file_system_object,target_directory->current_sector);
if(result != FAT_RESULT_OK)
break;

//Window offset was OK, check the entry
short_file_name= *target_directory->short_file_name;

//Is it a blank or unused entry?
if (short_file_name[0] == DELETED_DIRECTORY_ENTRY_BYTE
||short_file_name[0] == UNUSED_DIRECTORY)
break;

//Get the next entry with table stretch
result= get_next_directory(target_directory, TABLE_STRETCH);
}
while (result == FAT_RESULT_OK);
}

是的,代码有点宽,难以键入,但SimplicityStudio提供代码完成与CTRL +空格键的快捷键,你可以随时剪切和粘贴。代码可读性会增强,需要更少的寻找变量名。我们可以通过查看第二个例子来说明,这段代码旨在查看目标目录,并在找到目标目录中的已删除(先前已填充但现在可用)或零(从未填充)短文件名条目时中断。描述性名称允许您像读一段故事似得阅读代码,在你阅读时告诉你目的。

四 严肃的对待注释

一个好的软件开发人员在几个关键的地方给代码添加了很多注释。注释,如长变量名,不影响到运行时可执行二进制文件的文件大小,只是在那里,以帮助阅读文档的代码。解决方案中每个文件的顶部应说明该文件的目的,并且在每个函数的顶部应有较长的注释,说明函数的用途以及描述输入和输出。除了这些关键的地方,应该在逐行的基础上使用注释,无论代码的意图清不清楚。使用描述性变量名称可以帮助解释代码的目的,并减少必要的注释,使得那里的注释更突出。相信我,一年后你不会记得当初写代码的目的,所以要重视注释了!

五 使用emlib库

对于EFM32程序员,emlib库是你的朋友。接入EFM32外设时,尽可能的调用这些库。这些库经过良好测试,并有额外的代码来帮助寻找问题,而不仅仅是直接调整寄存器。例如,以下代码使用emlib库:
TIMER_TopSet(TIMER3, 1000);

相同的事情可以通过预处理器定义寻址内存映射外设的寄存器来完成,定义TIMER3为0x40010C00。我们不使用这个地址,因为它很难被记住,但这是TIMER3映射在主内存中的地方。
TIMER3->TOP = 1000;

所有外设以完全相同的方式映射到内存地址,因此有时您会看到使用此指针表示法的示例,而不是emlib库函数。如果您将看到em_timer.h中的TIMER_TopSet函数定义,您将看到该函数与此示例完全相同,因此在这种情况下,库函数没有提供任何附加值。然而,使用emlib库,有时会得到比简单操作映射寄存器更多的功能。例如,CMU_ClockEnable函数在最终使用“bit band”命令确保寄存器位自动地设置之前,小心地代表您做出很多决定。尽可能频繁地使用这些库函数,以获得所有EFM32库设计师设计的便利性。

六 定义变量以避免堆栈和堆的问题

C的许多方面对于非专业的程序员来说并不明显,但在嵌入式设计中运行代码时变得很重要。对于初学者,所有本地声明的变量都在栈上。这些是您在函数或任何代码块中定义的变量。

堆栈是从“内存顶部”或物理RAM中最高可用地址开始的内存区域,然后向下计数,直到达到堆栈限制。如果您定义了太多的局部变量,或者您的代码通过使用递归或其他嵌套函数动态创建这些变量,那么您的堆栈空间会被占满。

全局变量是在模块级别的所有函数和其他代码块之外定义的变量。编译器自动为heap上的全局声明的变量分配内存,这是堆栈外的主内存池的一部分,如果您尝试分配太多的RAM,将会产生编译器错误。但是,在代码中使用malloc()命令可以动态地在运行时在堆中分配RAM。

在具有有限RAM的嵌入式处理器上使用recursion或malloc()命令是一个冒险的任务!你必须理解你的代码将需要多少递归尝试(或malloc()调用)以便解决问题,然后设计一个永远不会用尽堆栈空间的解决方案。

如果您在代码中定义所有变量并让编译器确定如何自动管理内存,您将遇到较少的超出堆栈或堆的问题。即使有这样的预防措施,如果你的代码几乎是可用的RAM大小,当你编译和构建你的代码,你将需要学习如何监视堆栈和堆的大小,这部分内容超出本节的范畴。

int foo; //Global variable, memory is on the heap

void some_function()
{
int bar; // Localvariable, memory is on the stack
}

七 全局静态变量和局部静态变量的差异

使用关键字“static”定义的变量表示不同范围的不同内容。在内部函数中,static关键字用在变量的前面,以记住它在函数调用之间的值。它具有一种“粘性”,你可以在函数的第一次调用时初始化它,然后让它保持其值,而不是每次函数执行时重新初始化非静态变量。在全局范围,所有变量都是“粘性”的,因为它们只在运行时开始时初始化一次,然后记住它们的值。但是,放置在全局变量前面的static关键字指示编译器该变量对于该模块是本地的,并且不被外部模块使用。对于同一个“static”关键字,这是一个完全不同的含义。

int foo1 = 1; // Global variable, initialized only once
static int foo2 = 2; // Global variable,initialized only once, private to this module

void some_function()
{
int bar1 = 3; // Local variable, initializedevery time the function is called,
//private to this function

staticint bar2 = 4;// Local variable, initialized only the first time thatthis function
// is called, private to this function

int foo1; // This is a bad idea. Local foo1 overrides global foo1 and makesthe
//global version unavailable inside this function
}

八 volatile和extern的含义及如何相互影响

只要变量和函数在模块中未声明为static,它们就可以在该模块外部使用,并在其他模块中使用。为了告诉编译器你打算在模块中使用相同的变量,你在一个模块中定义一个常规方法的变量,并在设计中所有其他模块的定义之前添加关键字“extern”。现在,您设计中的所有模块都可以访问同一个变量。但是,如果设计中的其他模块中的一个模块意图修改最初定义的位置之外的变量的值,则必须在该变量前面添加关键字“volatile”。这个volatile关键字告诉编译器该变量可以在模块之外更改,并阻止优化器删除似乎没有效果的语句。
// Module A
int foo; //Meant to be modified in this module only
volatile int bar; // Value can changeunexpectedly outside of this module
// Optimizer must always evaluate the value ofbar

// Module B
extern int foo; // We can read this valuedefined in Module A, but should not modify it
extern int bar; // Since declared volatilein Module A, we can read and modify this variable

此外,当使用Release版本和Debug版本时,使用volatile非常重要。当优化设置增加时,编译器将主动尝试压缩不必要的代码。这意味着您需要防止编译器这样做,通过使用volatile关键字可以改变当前范围之外的任何变量。

在下一节中,我们将继续介绍软件路径的最佳实践,了解内联函数,如何使用闪存,配置锁以及如何解决缓冲区溢出问题。

围观 433

来源: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并继续开发。

版本控制成功的关键
将修订控制系统集成到设计的所有方面。
将仓储的副本保留在联机备份中以便保管。
提前并经常提交有关代码状态的描述性消息。

围观 382
订阅 RSS - EFM32