欲看图文版pdf文档,请用PC浏览器下载附件。
欲索取源码和驱动者,请电邮14518918@qq.com。

一、 下载安装SimpliCity Studio
2026春节返工第一周,重置了Win11并重新下载并安装了SimpliCity Studio 5。然后首次运行SS5,就发现自己不会用了,卡在了第一步。因为SS5此刻并没有直接打开上一次已经打开的历史项目,而是弹了个Installation Manager窗口出来让我三选一。

傻眼了,谁还记得几年前首次使用SS5就有的这一出啊?难道一个IDE安装完毕之后,不应该像Keil那样安装好就可以直接编译代码了么?好在第三个图标上的文字Install by technology type(wireless,Xpress, MCU,sensors)中,有一个MCU,误打误撞就选的这个,这才跌跌撞撞地往下走,然后是繁琐的配置和漫长的联网下载以及模块安装,搞得我都不晓得这第一步选对没得了。还好,事实证明,就该选它。

然后勾选8-bit Microcontrollers,因为我们的目标设备是EFM8,它确实是8bit C51核的单片机:

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

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

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

半小时+,安装完毕。遂参考我的历史文档《手把手教你用EFM8的CLU实现双输入或门 20241028》,准备new一个myProject出来。
先说结论。下图就是SS5工程向导为目标单片机自动生成的工程文件夹。截屏出来,心里直犯嘀咕,难道这个没头没脑的“.project”的文件,就是Simplicity Studio的项目文件?

把截图喂给了千问。千问说,这是一个基于 Eclipse 构建的 Simplicity Studio v5 项目目录,其中:
1,.cproject (CPROJECT 文件)
作用:这是最重要的文件之一。它定义了 C/C++ 项目的具体构建配置,包括编译器设置、包含路径 (inc 文件夹)、源文件路径 (src 文件夹)、预处理器定义等。Simplicity Studio 依靠它来知道如何编译你的代码。
2,.project (PROJECT 文件)
作用:这是 Eclipse 平台通用的项目描述文件。它定义了项目名称、使用的构建工具(Nature,例如 com.silabs.ss.framework.ide.project.sls.core)以及项目的基本结构。
3,custom_efm8lb12f64e-a-qfn32.hwconf 文件:
作用:这是 硬件配置文件。它非常重要,描述了你所选芯片的具体引脚映射、外设时钟配置等,但它本身不是“工程文件”,而是工程引用的一个关键资源。
好吧,是我少见多怪,蜀犬吠日了。终于可以继续与SS5愉快地玩耍了。

二、 使用SimpliCity Studio配置EFMLB12F32E的CLU实现一个硬件或门的完整项目
注意到,SFF-8472 MSA有一个硬性规定,其大致要求是,光模块必需实现一个发端被软硬件关断的功能,即所谓的Tx Disable。逻辑上是hardTxDis管脚(比如SFP金手指PIN3)状态与softTxDis寄存器(比如A2[110].bit6)状态的任意一个状态是高电平时,就必须关断发端。这本质上就是一个双输入的或门。EFM8为此专门内置了可编程逻辑单元CLU,使得用户可以实现一个可选输入管脚位号的两输入或门(注意,一旦选定了CLU[x]单元,基本上就决定了其输出管脚位号)。
下面将详细阐述,如何基于SS5进行CLU配置,来实现P0.7 = P1.3 or P1.4这个或门。其中,P1.3可以是softTxDis寄存器状态的输出管脚(这意味着P1.3从此绑定,不能再复用成其他功能管脚),P1.4可以是hardTxDis的输入管脚。

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

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

注意型号不要选成EFM8LB11F32ES0-C-QFN24。这里只有选EFM8LB11F32E-B-QFN24,CLU1OUT才将被映射倒P0.7,而选EFM8LB11F32ES0-C-QFN24,CLU1OUT在SS5软件中会被错误地映射倒P1.0,如下图,我估计这是Simplicity Studio Version: SV5.9.3.2的一个bug。

实际从EFM8的参考手册Figure 11.4. Full Crossbar Map可以看出,CLU1OUT在封装是24脚时是P0.7,在32脚时是P1.0。总之24脚的EOC8001的FAE告诉我,他验证过CLU1OUT就是P0.7,后来我也验证了确实是P0.7:

注意,EFM8LB11一共有4个CLU单元,每个CLU单元的输出管脚根据封装的不同都是固定死的,比如CLU1的输出就是P0.7:

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的代码。

三、 使用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或Keil烧录固件并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,则会弹窗报错:

然后换用Silicon FLASH Programming Utility软件,仿真头换成简版U-EC6,都仍然connect不到我的EFM8,如下图。但是我明确地记得,我曾经用同样的简版U-EC6仿真头,成功connect到C8051F320并下载过固件啊,见文档《淘宝C8051F320模组开发心得 20201125》。

做研发真的讲究机缘巧合。我昨天听说友商李工用U-EC6仿真头在Keil C51中居然可以单步debug代码,既然昨天我在SS5里面死磕Jlink连接EOC8001无果,那今天上午我就继续在SS5里面尝试U-EC6连接EOC8001,还是失败。今天下午等来了李工说的它用的驱动程序,SiC8051F_uVision_V4.40。注意,在安装这个驱动的过程中,务必要手工指定安装目录,必须是你之前独立安装的Keil C51的那个目录,然后一路next,就不报错,否则会报错。注意,这个安装程序会更新原独立安装的Keil C51安装目录中的Tools.ini文件,主要是会给该文件添加一行TDRV12=BIN\SiC8051F.dll (“Silicon Labs C8051Fxxx Driver”),或者参考网帖https://blog.csdn.net/yousfather/article/details/125077962,请接着往下看。

完了运行Keil C51,点魔术棒,在Debug标签页的仿真器列表中,就会发现仿真器列表新增了最后一行Silicon Labs C8051Fxxx Driver。由此,和Tools.ini就呼应上了吧。选它,再点Settings按键,能看到已连接的U-EC6仿真头的序列号。

然后在回到Keil C51主界面,点击Debug图标,就可以成功进入debug模式,看到双色箭头停在断点处了。

不过,即使新华龙U-EC6仿真头,在Keil C51中,能成功debug到EFM8,这并不意味着,同样一个仿真头,能在SS5中,被兼容接纳。毕竟是二妈生的仿真头,到正房这里是压根儿不认啊——“It’s a device not supported by Studio.”

现在回头看看去年尝试失败的记录文档《尝试用Jlink或SiiconLabs仿真头访问EFM8失败了 20250601.docx》,不禁感概万千,做研发居然靠碰运气。我去年用的是下图左边两个仿真头,即简版Jlink和简版U-EC6,都失败了。我今天试的是下图右,即友商工程师的同款仿真头,就O了。采购链接在这里,https://item.taobao.com/item.htm?id=584411718732&mi_id=0000wajvgXYroA5nhDXhJfDlYto97tDn9jYu57_eyYDRliI&spm=tbpc.boughtlist.suborder_itemtitle.1.59a72e8dIagCTO。注意,U-EC6的出品方是深圳新华龙,它是SiliconLabs的早期核心代理商。

今天终于在友商李工的帮助下,基于新华龙U-EC6仿真器,在Keil C51中实现了对EOC8001的单步debug。我几乎在十年前就开始摸EFM8了,但一直没有成功对C8051或EFM8单片机debug过,今天突然就O了,都有点喜不自禁了。做工程师不要怕露怯,不会就是不会,勇敢承认就是了,然后多方积极求助,总有一两个不那么卷的朋友愿意施予援手,救你于泥沼的。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐