EFM8LB11三周入门

EFM8LB11三周入门

不是很会用CSDN的模板,我还是习惯在word中记录学习过程,最后再拷贝过来。但是图片难以直接粘贴,所以,读者只能将就着看了。欲获取图文版pdf,请email 14518918@qq.com。
有个很奇怪的现象,会用EFM8的程序员应该不下千人,但网帖相关内容极其稀少,学习成本陡然升高。众所周知的,光模块行业的固件工程师,大都用过EFM8,但为何网上关于EFM8的技术帖的数量,相比于GD32,都不提STM32了,都是屈指可数的。这侧面反应出光模块行业的固件工程师,真是本能的卷,自己懂了但就不愿形成图文拿出来分享,……(此处作者删去N个字)。就这种断子绝孙式的行业,大量研发人员主观上不愿意带新人,客观上不讲究传承,导致一颗EFM8芯片仅凭一个crossbar就可以构成入门的壁垒,让很多小白止步于此,就太XX(注册商标的英文缩写)锤子了。

前言

51核单片机,咱是在大四时选修的兴趣班才开始接触。请注意到,当年成电机房尚未普及windows图形化操作系统,还是黑窗DOS命令行当道的上世纪。要在51核单片机上配合几个7段码显示模块,实现一个跑马灯显示文本的功能,都是需要我们先在纸上写汇编程序,然后人肉编译成16进制机器码,再烧录进去,最后观察效果。这是一种极其落后的生产力,像极了咱在大一时深以为然的对计算机的误解——学计算机嘛,就是去书店买一个1:1的纸件盘,然后死记硬背五笔输入法的字根,最后敲键盘打出中文——只搞得兴趣全无。
美国SiliconLabs公司前些年推出的EFM8系列51核单片机,因为自带了I2C bootloader,性价比又高,一举打败了价格高企的ARM7内核的ADuC7020,深受光模块行业推崇。EFM8同时也打败了我,我十多年前首次接触时就从入门到放弃了,主要是被同事代码大量的宏定义代码就拦在了第一步,也未见同事主动站出来科普一下,遂一棵树吊死在了之前就学会了的资源丰富功能强大编程简单的ADuC7020上,以至于后来台湾新唐专门针对25G前传光模块开发的拥有硬件调顶技术的M030G,我竟然也没有自学进去最终也始乱终弃了。
因为前两年芯片缺货潮,任意涨价和断供等非常规操作直接把用户整不会了,厦门EOC公司遂应运推出了全面兼容美国SiliconLabs公司的EFM8单片机。这里所说的“全面兼容”,除了常规意义的PIN-PIN兼容,还有固件级别的兼容,据说拿EFM8的hex文件,可以直接烧录到对应的EOC8单片机中,就能直接运行。这种兼容到寄存器的程度,就差直接照着别人的芯片线路进行晶圆刻蚀了。这也导致了EOC技术支持人员天生的傲慢——有问题请自行去查EFM8的解决方案,幸好有些坑是EFM8参考手册上明文讲了的。而没有明文讲的,就需要用户自己看到异常情况后,蒙头猜了再去试,再去网上查类似问题的讲解,才会知道原来还有这个讲究。
总之,从0开始学EFM8LB1编程,连评估板都要自己画,而EOC的FAE只是聊胜于无,小白的自学之路真的好难。幸得行业资深大拿罗大师的点拨,我得以屡次从深坑中爬上来,真是多个朋友多条路啊。

工具

SiliconLabs原厂的软件下载地址链接是:https://www.silabs.com/developers/8-bit-8051-microcontroller-software-studio?tab=downloads
欲开发EOC8单片机,IDE软件首选Keil C51。关于Keil,有一种说法,是当某人发帖抱怨Keil不智能功能不强大时,就会有跟帖反驳说,那是你没有用过比Keil更难用的IDE,而实际上Keil的编译效率还是相当高的。
FAE推荐用Keil C51 9.59或更高版本,我先去下载了一个Keil C51 9.61结果安装出来是Keil ARM 5.38。然后又老老实实地找了一个Keil C51 9.59,重新安装才对的。但SS5推荐用Keil 8051 5.60。但恼火的时,安装出来的Keil C51的exe和Keil ARM的exe,两个文件的icon图标以及filename都是一模一样的,所以在安装后一个Keil时,务必要重新定义一个目标文件夹名,免得覆盖了前一个Keil可执行文件哈。
遇到APP写坏了且C2D强制到GND后进入I2C Bootlaoder也无法erase FLASH的MCU,就只能上C2仿真器,才能挽狂澜于既倒,扶大厦之将倾。C2仿真头U-EC6的淘宝采购链接如下,便宜还包邮的那款我在SiliconLabs FLASH Utility软件中用过,OK的:
1,https://item.taobao.com/item.htm?id=680583434098&spm=a1z0d.6639537/tb.1997196601.50.e8247484RPVGtP
2,https://item.taobao.com/item.htm?id=584411718732&spm=a1z0d.6639537/tb.1997196601.4.e8247484RPVGtP
首先请安装仿真头的USB驱动程序,注意安装了driver 3.6之后,Keil就可能找不到EFM8系列MCU了,但是USB驱动是OK的,keil生成的hex文件可以在SiliconLabs FLASH Utility软件中成功烧录。要是换成最新的4.40,这个驱动装了之后,Keil是能识别EFM8系列MCU,但是USB驱动就被搞成串口的了,在SiliconLabs FLASH Utility软件中不能烧录hex。注意安装目录,一定请Change到keil C51所在的那个目录下,不然待会儿Keil里面就找不到这个仿真头。
安装好驱动后,插入C2仿真头,应该在“人体学输入设备”栏,发现新增了一个“USB输入设备”,对,就是这么低调,是所谓“善战者无赫赫之功”,别人压根儿不图名啊。
安装完上述驱动后,会同步出现一个FLASH Programming Utility软件,运行它,应可见“Debug Interface”为“C2”的“USB Debug Adapter”,其序列号如“EC600MCU123”了。
之后可尝试“Connect”(迫使MCU进入C2下载状态)连接到目标MCU,识别EOC8001D6B0-Q24L,识别成EFM8BB31F16G-QFN24,而不是EFM8LB11F32ES0-C-QFN24。我只能暗自怀疑,EOC8001D6B0的ID没有改得和EFM8LB11F32ES0完全一致吧?
再之后就可以下载固件可烧录文件hex到EOC8001了,先选一个hex文件,然后“Donwload”(这就是烧录FLASH),最后“Go”(这就是离开C2下载状态,MCU开始运行APP程序)。注意,这里务必注意,不要尝试去勾选Erase all Code Space before download,勾选后也许会把存储在高区FLASH的I2C Bootloader程序也擦除了,就得不偿失了哈。

Simplicity Studio软件

据EOC的FAE说,开发EFM8,应配合上原厂提供的Siplified Studio软件才够好用。我用过SS5之后,感觉确实是打开了一个新世界。
打开官网,https://www.silabs.com/developers/simplicity-studio,用个人邮箱注册、登录后下载Windows Installer的.iso文件。
安装的时候软件会自动安装驱动程序,可能是仿真头所需。
安装Siplified Studio软件时请选8-bit Microcontrollers:
安装完毕,运行Simplicity Studio,在Get Started页面,需要确定目标Starter Kit Board型号或目标MCU型号。注意,如果选原厂评估板,则可以继续选择原厂例程;如果自定义MCU型号,就没有原厂例程可参考了。此刻先选择目标设备为Starter Kit Board:
然后就可以选择例程了,这便是我在CSDN上遍寻不得的DAC例程:
如果C盘不让保存工程文件夹,就换到D盘,然后点击Finish:
然后我们得到的simplicity studio IDE的例程,不仅可以build,还能debug。
SS5默认字号是11号,对老年人不友好,可参考下图更改字号到16,舒坦些:
欲探寻更多Starter Kit Board的例程,可以点击File—New—SiliconLabs Project Wizard…:
敲黑板。如果在Get Started时,我们没有选评估板,而是准备选择自己板子上的某个MCU型号,就需要点击的“All Products”,然后下面的文本框输入 “EFM8LB11F32ES0-C-QFN24”,点击“Start”确认。
然后点击“create new project”,准备生成例程框架,但就没有DAC例程了:
进入SS 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等外设。
注意,当把Vref配置到P0.0之后,应该同时配置P0.1为AGND,所以两个管脚都要配成Analog。
这也是为什么generate出来的代码,P0.0/P0.1是配置成ANALOG的原因,同时注意要skip掉crossbar。
PORTS_0_enter_DefaultMode_from_RESET (void)
{
P0MDIN = P0MDIN_B0__ANALOG | P0MDIN_B1__ANALOG
| P0MDIN_B2__DIGITAL | P0MDIN_B3__DIGITAL
| P0MDIN_B4__DIGITAL | P0MDIN_B5__DIGITAL
| P0MDIN_B6__DIGITAL | P0MDIN_B7__DIGITAL;

P0SKIP = P0SKIP_B0__SKIPPED | P0SKIP_B1__SKIPPED
| P0SKIP_B2__NOT_SKIPPED | P0SKIP_B3__NOT_SKIPPED
| P0SKIP_B4__NOT_SKIPPED | P0SKIP_B5__NOT_SKIPPED
| P0SKIP_B6__NOT_SKIPPED | P0SKIP_B7__NOT_SKIPPED;
}

Crossbar

注意到,EFM8内置了一个绕不开的神秘兮兮的Crossbar,用于配置管脚到Digital外设资源。
EFM8的crossbar,绝对是一只拦路虎,会让很多小白望而生畏然后直接从入门到放弃。我蒙头查阅了EFM8原厂的datasheet和reference guide,也是看得云山雾罩的,求不了甚解。
经过和Andy与FAE的讨论,我获知crossbar实际上是一个矩阵开关。crossbar存在的意义,就是让用户可以灵活地将某个IO管脚,配置到期望的某个Digital资源或到某个Analog资源上去。其中,P0.0~P2.3 可定义为General Purpose I/O (即GPIO),也可通过crossbar或专用通道(“专用通道”可能是指上图橙色的特殊功能信号)被指定到一个Digital资源,或被指定到一个Analog资源;而P2.4~P3.7 仅能用作 GPIO。此外,C2 接口的数据信号 (C2D) ,还可与QFN24的 P3.0 或QFN32的P3.7共享。
我以为,初学者一定会对EFM8的crossbar大惑不解,从入门到放弃都是秒秒钟的事情。为了解惑,请继续看上图,一幅reference guide中出现的俄罗斯方块,它显示了在已启用 UART0和 SPI0,且要跳过 P0.3(P0SKIP = 0x08)的情况下,EFM8的引脚分配示例。这里,UART0 优先级最高,将首先分配到固定位置P0.4/P0.5。其次启用的外设是 SPI0,将首先占用P0.0、P0.1 和 P0.2这三个引脚,而SPI0_NSS 的位置就特殊了,因为P0.3 是skip被跳过了且P0.4/P0.5 已被 UART0 占用,故而只能占用P0.6。
更具体的,请看如下crossbar矩阵表。显然,SMBus0_SD可以从P0.0开始被分配,但原厂规定支持I2C bootloader的SDA必须位于P0.2,所以用户需要利用crossbar的配置功能,跳过P0.0/ P0.1即设置P0SKIP.bit0=1 且P0SKIP.bit1=1,才能让SMBus0_SDA位于P0.2且SMBus0_SDA位于P0.3。
注意,上表表头橙色的这些特殊功能信号,比如P0.0的Vref,P0.1的AGND,它们不受crossbar支配。当用户需要启用这些管脚的特殊功能时,应手动配置PnSKIP.bitx=1,意思是跳过crossbar,则该管脚将不被crossbar支配。
注意,把一个数字引脚配置成GPIO口,或该引脚具有不属于crossbar的数字功能,则应设 PnSKIP.bitx=1,以确保crossbar不为该引脚分配其他资源。这是因为,当PnSKIP.bitx=0时,对应的引脚的输出驱动器都会立即被禁用。
比如,欲把P0.0/P0.1配置成的Vref/AGND这种特殊功能信号,就需要跳过crossbar。同时把P0.4/P0.5p配置成UART0的这种Digital资源时,就不能跳过crossbar。
//把P0.0/P0.1配置成的Vref/AGND特殊功能信号,把P0.4/P0.5p配置成UART0
SFRPAGE = 0x00;
P0MDIN =P0MDIN_B0__ANALOG | P0MDIN_B1__ANALOG | //analog
P0MDIN_B4__DIGITAL | P0MDIN_B5__DIGITAL;//digital
P0MDOUT=P0MDOUT_B0__OPEN_DRAIN | p0__OPEN_DRAIN
P0MDOUT_B4__PUSH_PULL | P0MDOUT_B5__OPEN_DRAIN;//UART_Tx =PP
P0SKIP =P0SKIP_B0__SKIPPED | P0SKIP_B1__SKIPPED //Vref/AGND
P0SKIP_B4__NOT_SKIPPED|P0SKIP_B5__NOT_SKIPPED//UART_Tx/UART_Rx
注意到,部分MCU引脚可配置为Analog资源管脚。
欲将某引脚配置为模拟引脚,首先应PnMDIN.bitx=0,即设置该引脚为模拟模式。其次应设应设PnMDOUT.bitx=0,即设置该引脚为开漏输出。最后应设PnSKIP.bitx=1,以确保crossbar不为该引脚分配外设资源。比如欲将QFN24的EFM8LB的P2.1配置成DAC1,则需要:
//把P2.1配置成DAC1
SFRPAGE = 0x20;
P2MDIN = P2MDIN_B1__ANALOG;
P2MDOUT = P2MDOUT_B1__OPEN_DRAIN;
P2SKIP = P2SKIP_B1__SKIPPED;
注意到,部分MCU引脚也可配置为Digitial资源管脚。
欲将某引脚配置为数字输入,首先应设PnMDIN.bitx=1,即设置该引脚为数字模式。其次应设PnMDOUT.bitx=0,即设置该引脚为开漏输出。然后应设PnSKIP.bitx=1,以确保crossbar不为该引脚分配外设资源。最后应设Pn.bitx=1,需要先设Pn.bitx=1使开漏输出‘1’从而使该引脚可以跟随外部输入信号电平:
//把P0.4配置成输入IO
SFRPAGE = 0x00;
P0MDIN = P0MDIN_B4__DIGITAL;
P0MDOUT = P0MDOUT_B4__OPEN_DRAIN;
P0SKIP = P0SKIP_B4__SKIPPED;
取一个.h文件,定义一个sbit变量P0_4来代表P0.4:
sbit P0_4 = P0^4;
完了就可以在.c文件中,用如下代码来回读P0.4状态了:
P0_4 = 1;
return P0_4;
欲将某引脚配置为数字推挽输出,首先应设PnMDIN.bitx=1,即设置该引脚为数字模式。其次应设 PnMDOUT.bitx=1,即设置该引为推挽输出。然后应设PnSKIP.bitx=1,以确保crossbar不为该引脚分配外设资源。比如把P2.3配置成推挽输出管脚:
//把P2.3配置成推挽输出IO
SFRPAGE = 0x20;
P2MDIN = P2MDIN_B3__DIGITAL;
P2MDOUT = P2MDOUT_B3__PUSH_PULL;
P2SKIP = P2SKIP_B3__SKIPPED;
取一个.h文件,定义一个sbit变量P2_3来代表P2.3:
sbit P2_3 = P2^3;
完了就可以在.c文件中,用如下代码来使P2.3=1了:
P2_3 = 1;
欲将某引脚配置为数字I/O端口,首先应设PnMDIN.bitx=1,即设置该引脚为数字模式。其次应设 PnMDOUT.bitx=0,即设置该引为开漏输出。然后应设PnSKIP.bitx=1,以确保crossbar不为该引脚分配外设资源。最后,在用做输出端口前,需要先设Pn.bitx=1使开漏输出‘1’从而使该引脚可以跟随外部输入信号电平。
比如把P2.4配置成开漏输出管脚:
//把P2.4配置成开漏输出IO
SFRPAGE = 0x20;
P2MDIN = P2MDIN_B4__DIGITAL;
P2MDOUT = P2MDOUT_B4__OPEN_DRAIN;
P2SKIP = P2SKIP_B4__SKIPPED;
取一个.h文件,定义一个sbit变量P2_4来代表P2.4:
sbit P2_4 = P2^4;
完了就可以在.c文件中,用如下代码来使P2.4=1了:
P2_4 = 1;
完了就可以在.c文件中,用如下代码来回读P2.4状态了:
P2_4 = 1;
return P2_4;
欲设置P0.2和P0.3到SMBus0,设置P0.4和P0.5到UART0,还会用到XBR0/XBR2寄存器:
//设置P0.2和P0.3到SMBus0,设置P0.4和P0.5到UART0
SFRPAGE = 0x00;
XBR2= XBR2_WEAKPUD__PULL_UPS_ENABLED | XBR2_XBARE__ENABLED |
XBR2_URT1E__DISABLED | XBR2_URT1RTSE__DISABLED |
XBR2_URT1CTSE__DISABLED;
XBR0= XBR0_URT0E__ENABLED | XBR0_SPI0E__DISABLED |
XBR0_SMB0E__ENABLED | XBR0_CP0E__DISABLED |
XBR0_CP0AE__DISABLED | XBR0_CP1E__DISABLED |
XBR0_CP1AE__DISABLED | XBR0_SYSCKE__DISABLED;

内置资源

实战例程

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值