用Simplicity Studio开发EFM8单片机(续)

VIP用户可用PC浏览器下载pdf附件,非VIP用户请电邮14518918@qq.com索取图文版pdf文档。

前言

前文是《手把手教你用EFM8的CLU实现双输入或门 20241028》、《51核单片机EOC8001试玩 20241210》、《GD32E251E_EFM8LB12_EVB说明 20250415》和《用Simplicity Studio开发EFM8单片机,不写一句代码仅用全图形化配置CLU实现一个硬件或门 20260303》。本文是狗尾续貂,主要是为了方便初学者阅一文而得天下,不用再去翻故纸堆了。

正文有五大章节:

一、 Simplicity Studio下载和安装

二、 Simplicity Studio运行,尝试用图形界面构造一个CLU的两输入或门

三、 Simplicity Studio编译项目并生成可烧录固件

四、 Simplicity Studio烧录固件或debug代码

五、 Simplicity Studio导入原厂例程

一、 Simplicity Studio下载和安装

据EOC公司的FAE说,开发EFM8,应配合上原厂提供的Simplicity Studio软件才够好用。我用过SS5之后,感觉确实是打开了一个新世界。

打开官网,https://www.silabs.com/developers/Simplicity-studio,用个人邮箱注册、登录后下载Windows Installer的.iso文件。

安装Simplicity Studio软件时请记得勾选8-bit Microcontrollers,因为我们的目标设备是8051内核的EFM8LB1:

然后勾选可自选封装,毕竟工程师都是心高气傲的主儿,我的地盘我做主嘛:

然后在配置界面一个比较生僻的地方,可见SS5可以配置其仿真头(Debug Adapter)支持J-Link:

配置好SS5必需组件后,将开始漫长的下载。服务器大概率在万把公里之外的美国,且等着呗:

二、 Simplicity Studio运行,尝试用图形界面构造一个CLU的两输入或门

安装完毕即可运行Simplicity Studio。

Step1,新开一个工程,菜单File---New---Silicon Labs Project Wizard。

注意,首次运行Simplicity Studio 5,软件会弹一个Installation Manager窗口出来,让用户三选一。好在第三个图标上的文字Install by technology type(wireless,Xpress, MCU,sensors)中,有一个MCU,请选这个,会继续下载MCU开发所需插件。

Step2,选定一个目标设备,可输入EFM8LB11F32E-B-QFN24,下面的SDK栏务必要选择8051 SDK v4.3.1.0,因为更下面的Tool Chain是依赖这个开发包才能进行。注意这里点击Next之后会有个圈圈转老半天,估计是向美帝打小报告去了,我们无产阶级革命者一定要有定力,不要半途而废,死等就好。

Step3,选择Si8051 Configuration Project,不勾选8051 SDK V4.3.1.0(2)。千问说"Si8051 Configurator Project" 是专为 EFM8/C8051 设计的、支持图形化硬件配置(类似 STM32CubeMX)的项目模板 ------ 它通常依赖于 Simplicity Studio 原生工具链 + EFM8 Software Framework SDK,而不是旧的 8051 SDK。

Step4,给项目起个名叫mySS5Projrct,方便日后查找。不勾选Use default location,手动指定一个文件夹,就叫"D:\mySimplicityStudio5\mySS5Project"吧。完了点击Finishi按键,遂将自动生成一个项目框架出来。

这就是自动生成的项目框架。

其中,在src子目录下挂了三个文件。

<mySS5Project_main.c>

这是用户应用程序的入口文件,包含 main() 函数。

<InitDevice.c>

由硬件配置工具自动生成的硬件初始化代码。

包含 InitDevice() 函数,用于初始化所有在配置工具中勾选的外设(如 GPIO、UART、定时器等)。

通常在 main() 函数开始处调用。

<STARTUP.A51>

这个汇编语言源代码,主要功能有:初始化堆栈指针 (SP)、清零内部 RAM、配置内存模式、最后跳转到 main() 函数。它还包含一个 SI_EFM8_Init() 钩子函数,在 main() 之前执行,用于禁用看门狗等关键初始化。

其中,在inc子目录下挂了一个文件。

<custom_efm8lb11f32e-b-qfn24.hwconf>

这是SS5 硬件配置工具的配置文件,以 XML 格式存储所有外设和引脚的配置。修改此文件(一般是通过图形界面做配置)可重新生成 InitDevice.c/h。

Step5,双击custom efm8lb11f32e-b-gfn24.hwconf,选DefaultMode Perip...标签页,勾选Clock Control,配置时钟源来自内部高频振荡器1即Internal High Frequency Oscillator 1,这样SYSCLK=72MHz。

勾选Configurabel Logic,注意此后必须上下挪动一下右侧Propeties字样上面的分隔栏,才能显出CLU0/CLU1/CLU2/CLU3复选标签(这似乎是SS5软件的一个固有bug,光勾选Configurabel Logic而不挪动分隔栏则复选标签就不会显出来供用户选择):

Step6,选中CLU1标签页,如下图配置好,此刻可见CLU1OUT是P0.7,且查找表输入是A=P1.4且B=P1.3且C=CLU1CARRY(无所谓,反正C不参与真值表运算),因为逻辑表达式是(B | A)跟C不发生关系。

注意界面上True Table真值表的结果output,它从高到低是从LSB到MSB,所以该True Table的output的二进制值11111100b=0xFC。待会儿SS5自动生成InitDevice.c后,我们在其CLU配置函数中就能看到0xFC这个值了。

为什么CLU1A.12就是P1.4,CLU1B.11就是P1.3呢?这需要看EFM8参考手册的Table 14.1. CLUnA input Selection和Table 14.2. CLUnB input Selection表格内容了:

注意啊,Simplicity Studio Version: SV5.9.3.2的图形界面上,给CLU分配A和B输入源显示出来的管脚位号可能是有错的。比如CLU3B.10,根本不是图形界面上写的P1.4,而是参考手册Table 14.2. CLUnB input Selection中的P0.4。

Step7,键盘Ctrl+S保存,同时生成代码。双击打开iniDevice.c,可见核心代码如下。

先看CLU1配置函数:

再看使能CLU1函数:

再看配置SYSCLK函数:

最后看初始化时如何调用这仨函数,来实现P0.7= P1.3 | P1.4:

但是截至目前,因为没有配置输出管脚P0.7为push-pull output,实测P0.7恒为低电平。主要原因有二,一是P0.7默认是open drain I/O,则没有上拉电阻就无法呈现高电平;二是P0.7默认是not skipped,则P0.7未绑定成CLU外设的输出管脚,仅受I/O寄存器控制。

还有,因为我的板子的P1.4,是金手指输入的HardTxDis信号;而P1.3,按SFF-8472 MSA规定是A2[110].bit6这个SoftTxDis寄存器控制位。如果我的代码没有拿SoftTxDis寄存器控制位赋值到P1.3,则P1.3可能是上电后默认的1,将导致或门输出P0.7恒为1而无法呈现出低电平了。

所以,我们就得配置P0.7的管脚属性。在DefualtMode Port I/O标签页,点击P0.7管脚,在右边的Property配置窗口,选择IOMode=Digital Pull-Push Output,选择Skip=Skipped。实际上,当P0.7的Skip处于默认的Not Skipped时,界面这里是有个三角形内嵌感叹号的图标在告警的,改成Skipped后告警图标才消失。

另外,我们还得保证P1.3这个协议中被寄存器控制的输出管脚,在寄存器还没有写代码控制它之前,将之配置成和P1.4一样的高阻输入管脚,方可进行测试。先说结论,IOMode=Digital OpenDrain I/O且Latch=High且Skip=Not Skipped。为啥呢?这就要从EFM8的开漏输出(Open-Drain)管脚的硬件结构说起了。EFM8 的 GPIO 开漏模式,本质上是一个S极接地的N沟道MOS管。其中,漏极 (D)连接到芯片引脚 P1.3,源极 (S)连接到芯片内部地 (GND),栅极 (G)连接到由 Latch(即 PnDAT 寄存器)取反。当栅极=Latch=Low时,G极取反=High,管子导通,漏极的P1.3将导通到源极的GND,从而在漏极呈现低电平。当栅极=Latch=High时,G极取反=Low,管子断开,从而使漏极的P1.3悬空,其外部必须接上拉电阻到高电平,或者直接连到高电平,才能在漏极呈现高电平。注意,普通输入输出管脚,Skip就必须被配置成Not Skipped。

同理,本身就是作为外部输入信号的P1.4,也要配置成IOMode=Digital OpenDrain I/O且Latch=High且Skip=Not Skipped。

注意,由于IOMode=Digital OpenDrain I/O且Latch=High且Skip=Not Skipped,对IO口而言,是默认配置,所以当你在编辑.hwconf文件时,点击右键菜单里的 Generate Source,或敲键盘Ctrl+S,将图形界面的内容保存到InitDevice.c中之后,在InitDevice.c中将只能看到配置P0.7的代码,而完全看不到配置P1.3和P1.4的代码。

另外,SS5默认字号是11号,对老年人不友好,可参考下图更改字号到16,舒坦些:

欲探寻更多Starter Kit Board的例程,可以点击File---New---SiliconLabs Project Wizard...:

一旦进入Simplicity Studio IDE之后,我们随时都可以双击.hwconf文件,呼出一配置界面,重新进行管脚配置:

注意,我们知道,支持I2C bootloader的I2C从机管脚是P0.2/P0.3,但是默认情况下,勾选了右下角SMBus0的"Clock/Data"之后,管脚是映射到P0.1/P0.2的。此刻就应该点击P0.1,选"Skipped",则软件会跳过P0.1,把SMBus0管脚映射到我们想要的P0.2/P0.3上去。

请注意,页面下方的提示框"Problems",请在尽量排除error和warning之后,再在MCU图形上点击鼠标右键,选"Generate Source",

完了就应该在Simplicity IDE看到自动生成的工程框架的系列文件:

现在应该在C:\Users\JackZhou\SimplicityStudio\v5_workspace\myProject目录下,能看到这些文件和文件夹:

继而在C:\Users\JackZhou\SimplicityStudio\v5_workspace\myProject\src目录下,能看到两个C文件:

主程序myProject main.c的main()只是调用了初始化函数enter_DefaultMode_from_RESET()就进入了while(1)死循环。

而初始化函数enter_DefaultMode_from_RESET()位于支持性文件InitDevice.c。可见是禁止了WDT0、配置了PORT0、ADC0、DAC0、VREF=2.4V等外设。

三、 Simplicity Studio编译项目并生成可烧录固件

好了,此刻我们已经获得了一个拥有简单功能的工程源码了,可以开始编译了。点击菜单Projct-Build,首先会弹个窗口说因为使用了Keil编译器所以需要到Keil官网去申请一个License ID:

第一次弹窗时我没管直接Skip掉了,接下来的编译居然也成功了。豆包说,未激活的Evaluation版本,也有编译hex不超过2kB的能力,看build输出日志,就会有这样的输出,而0800H刚好就是2kB。

所以,看到该弹窗,请大胆点击"this form"链接,呼出浏览器弹出来一个Keil官网页面,是用来申请license的页面,如截图:

请仔细看Computer ID (CID),是不是很眼熟?是不是和独立安装的Keil C51的CID是同一个序列号?豆包说CID是Keil C51基于你电脑的硬件信息(如硬盘序列号、网卡 MAC 等)计算得出。虽然豆包坚持说SS5的Keil C51的CID,和独立安装的Keil C51的CID,是两个不同的序列号。但是折腾了一上午,我实在没有办法把独立安装的Keil C51加入到SS5的ToolChain中去,或者即使偶然把独立安装的Keil C51加入到了SS5的ToolChain中去了然后编译又报错说找不到SI_EFM8LB1_Register_Enums.h头文件,我就只能回头来死磕如何获取到SS5的Keil C51的 License ID (LID)。还好,瞎猫碰到死耗子,我就觉得SS5的Keil C51的CID比较眼熟,经核对,这厮竟然和独立安装的Keil C51的CID一模一样,遂拷贝独立安装的Keil C51的LID,粘贴到SS5的Keil C51的LID框,遂OK!

豆包说,既然我之前独立安装并已激活了一个Keil C51,可以尝试让SS5去调用该独立Keil C51的编译器。比如,首先点击菜单Project---Properties,在弹出的Properties窗口中,配置更多的SDK:

然后会弹出Preferences窗口,请点击"Add..."按键,在弹出的Add ToolChains窗口中,点击"Brows"按键,选中已独立安装并激活的Keil C51的目录

编译前,SS5的Project Explorer是这样的:

编译前,工程文件夹(下图左)和工程文件夹(下图右)是这样的:

编译后,工程文件夹(下图左)和工程文件夹(下图右),都多了一个子目录<Keil 8051 v9.60.0 - Debug>:

进入该子目录<Keil 8051 v9.60.0 - Debug>,能看到刚生成的固件可烧录文件mySS5Project.hex。注意,如果我们不慎将此目录手工删除后,再次点击菜单Project-Build就会报错,说缺少\mySS5Project/Keil 8051 v9.60.0 -- Debug\sources.mk文件。此刻我们必须点击菜单Project-Clean,清除掉之前的build黑历史,这之后再build,就不会报错了。不用抱怨SS5的设计者咋会搞一个死循环出来,也许别人也是中了什么黑手,才出此昏招的呢?!

关键问题是,这个由SS5自带的Keil C51所编译出来的hex,到底对不对呢?我于是拿myI2C.exe做固件下载上位机程序,拿自治EFM8LB12评估板,通过CH341这个USB转I2C芯片,对评估板上的EOC8001单片机(完全兼容EFM8LB12,也自带了I2C bootloader)进行了固件烧录。然后拿万用表验证了固件功能P0.7 = P1.3 or P1.4,是正确的。

四、 Simplicity Studio烧录固件或debug代码

前面配置SS5组件的时候,不是看到JLINK仿真头了么,于是我问豆包:我运行SS5,然后外挂Jlink仿真头,走C2总线连接到EFM8LB12单片机,就可以在SS5中单步调试代码了么?

豆包回答:你只要完成环境配置和硬件连接,完全可以在 SS5 中通过 J-Link 外挂仿真头 + C2 总线对 EFM8LB12 进行单步调试,但需要注意几个关键前提和配置步骤 ------EFM8LB12 原生支持 C2 调试接口,J-Link 也兼容该接口,核心是要确保 SS5 识别 J-Link、调试配置指向 C2 总线。

豆包补刀说,J-Link 需是正版/兼容 EFM8 的版本(J-Link V8/V9/V10 均可,注意部分克隆版可能不支持 C2 总线)。等我连好线,在CMD窗直接运行jlink.exe,输入指令connect EFM8LB12F32E, C2, 500,再手动指定MCU型号,弄死都连接不上EFM8,走到下图第⑤步就100%报错。极有可能是我手中的Jlink仿真头,确实不是原装货,根本不支持非常规的C2总线。

而如果在SS5中,强行用鼠标右键点击project名,再选强行执行Debug as,则会弹窗报错:

后来试通了新华龙U-EC6仿真头,价廉物美。U-EC6仿真头的出品方是深圳新华龙,它是SiliconLabs的早期核心代理商。下图Jlink和简版U-EC6,我试了都用不上。只有新华龙U-EC6得行,淘宝采购链接是:https://item.taobao.com/item.htm?id=584411718732\&mi_id=0000wajvgXYroA5nhDXhJfDlYto97tDn9jYu57_eyYDRliI\&spm=tbpc.boughtlist.suborder_itemtitle.1.59a72e8dIagCTO。

欲在Simplicity Studio IDE中使用新华龙U-EC6仿真头,需要手工安装驱动程序,SiC8051F_uVision_V4.40。如果没安装驱动,则Simplicity Studio IDE是压根儿不认仿真头和目标MCU的------"It's a device not supported by Studio."。在安装U-EC6驱动时,请务必要手工指定安装目录,必须是你之前独立安装的Keil C51的那个目录,然后一路next,就不会报错,否则安装驱动程序时就报错,如下图所示。

比较遗憾的是,2026-03-03这天,我只能在Simplicity Studio IDE中通过U-EC6下载固件,但每次点击菜单Run-debug,再按F5准备单步调试时,一走到时钟从24.5MHz切换至72MHz的代码时(如下图line199),就报错退出不能继续debug了。估计U-EC6不是原厂原生的仿真头,怪不得Silicon Labs。

令人惊喜的是,2026-04-06这天,我再次import了mySS5Project工程准备复现这个故障写入文档。居然,哈哈哈,F5顺利通过Line199,可以继续debug下去了!不要问我为什么,我也搞不懂,我只知道科学的尽头是玄学,因为源代码没有变,仿真头没有变,笔记本没有变,Simplicity Studio没有变,目标板也没有变,唯一的变化是过了一个清明节......

在Simplicity Studio中debug代码的一个好处是,它不像Keil在debug代码时,会把I2C bootloader程序给顺手删除了。退出Simplicity Studio的debug模式后,短接C2D到GND再上电,仍然能搜索到I2C bootloader特有的I2C从机地址0xF0。看来原生的Simplicity Studio,就是比第三方的Keil好啊。

五、 Simplicity Studio导入原厂例程

要不是清明节,豆包、千问、Deepseek三大AI提供给我的代码,烧录到MCU之后总是测量不到PCA方波,我也未必会想到,必须得找到Simplicity Studio 5安装在本机目录SimplicityStudio\v5\developer\sdks\8051\v4.3.1\examples\EFM8LB1_SLSTK2030A\PCA下的原厂例程投喂给AI,才搞定的PCA编程。

然而,双击看似是Simplicity Studio 5工程文件,位于PCA\8bitCenterPWM\SimplicityStudio子目录下的EFM8LB1_PCA_8bitCenterPWM.slsproj,却并不能像双击*.uvproj文件那样就呼出keil然后顺利打开工程并展示层层递进的工程文件树,就很是令人费解,直到我发现我必须在Simplicity Studio 5中手动Import该slsproj文件才行。IDE怪难用的,这可能是Simplicity Studio比较小众的原因之一吧,虽然Silicon Labs早在2014年就发布了支持8位8051 MCU的V2.0。但话说回来,Simplicity Studio 5提供了大量的原厂立场,难用也得用。君不见职场这么卷,不着原厂找同事,那基本上就算是找死了。

下面展示如何使用Simplicity Studio 5,打开原厂例程的*.slsproj工程。第一步就很关键,运行Simplicity Studio 5,点击菜单File-Import,然后Browse找到*.slsproj所在文件夹,然后一路Next就可以import该例程了。

这是import了EFM8LB1_PCA_8bitCenterPWM.slsproj之后的Simplicity Studio 5界面,可见该有的文件都有了,比如图形配置文件.hwconf和文本源文件.c。

在Simplicity Studio 5左侧的工程树上双击EFM8LB1_PCA_8bitCenterPWM.c,然后会在右侧标签页的打开它,里面开篇就有该例程的功能描述和测试方法等描述。比如:

程序功能描述:

本程序通过可编程计数器阵列(PCA)的 8 位中心对齐脉冲宽度调制(PWM)输出模式,从两个输入输出(I/O)引脚输出两路中心对齐的 PWM 波形。在主循环中,波形的占空比会周期性调整,且两路波形的占空比呈反向增减的变化趋势。

本示例中,使用可编程计数器阵列(PCA)的 0 号和 1 号模块生成波形,同时配置交叉开关,将 CEX0 信号从 P1.4 引脚输出,将 CEX1 信号从 P1.5 引脚输出。

所使用的硬件资源:

系统时钟(SYSCLK)- 24.5 兆赫兹高频振荡器 0(HFOSC0)/ 1

可编程计数器阵列(PCA)- 8 位脉冲宽度调制(PWM)模块

P1.4 引脚 - 可编程计数器阵列(PCA)的 CEX0 信号输出端

P1.5 引脚 - 可编程计数器阵列(PCA)的 CEX1 信号输出端

P2.3 引脚 - 显示使能端

测试方法:使用 EFM8LB1 入门开发板,略。主要原因是美帝原厂也瞧不上咱小公司会免费送一张开发板,同时咱也确实没钱买美帝的开发板。

咱用的PIN-PIN兼容的EOC8001D6B0-Q24L芯片并自制的评估板哈,单价跟原厂的比,就是美元兑换人民币的汇率,这就是穷人有穷人的活法。

后记

促使我详细记录下我的学习过程,给后来人留一条可行的路,这其中的原因,除了我比较健忘需要备份提醒,还有一条,恰如拼多多刷到的一个冰箱贴,"成为你年轻时需要的那个老师"。在职场,卷只是生存之道,知识共享才是美德。

相关推荐
yong99903 小时前
基于STM32与TFTLCD的示波器设计
stm32·单片机·嵌入式硬件
我叫洋洋3 小时前
[ESP32-S3 点亮灯]
单片机·嵌入式硬件·esp32
搁浅小泽4 小时前
可靠性试验测试时间制定方法简介
单片机·嵌入式硬件·可靠性工程师
yoyobravery4 小时前
蓝桥杯第13届单片机(满分)
单片机·蓝桥杯
清风6666664 小时前
基于单片机的正弦波与方波峰峰值与频率测量系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
gihigo19984 小时前
基于51单片机的TB6600步进电机驱动程序
stm32·单片机·51单片机
搁浅小泽4 小时前
变频空调检修完整流程(通用版)
单片机·嵌入式硬件·可靠性工程师
笨笨饿13 小时前
29_Z变换在工程中的实际意义
c语言·开发语言·人工智能·单片机·mcu·算法·机器人
xiangw@GZ14 小时前
低功耗应用:BUCK的输入与输出环路
嵌入式硬件