最近在接手一个nRF51822的项目,找到一篇文章,写得很有意思,总结非常通俗易懂,于是转过来了。
文章出处:http://blog.sina.com.cn/s/blog_9fff1f140102w87s.html
最近一年时间一直在做一个比较高端的运动设备的传感器——自行车功率计的开发,主控芯片自然选的是当前最火功能最强大的智能穿戴设备的SOC芯片NRF51422,跑蓝牙4.0和ANT+用于无线数据传输。经过这一年的折腾,基本算比较熟悉了,今天抽空总结总结对这款芯片的感受。
来个实物图~~
首先先大体介绍下这款芯片情况:
内核:ARM Cortex M0
主频:16MHz
内存:16/32KB
闪存:128/256KB
外设:UART,IIC,ADC,TIMER,SPI,RADIO,RTC,GPIOTE,TEMP,RTC
封装:48PIN QFN,也有超小超小的CSP封装的
从硬件上来看,基本就是一款自带2.4GHz射频无线收发器的MCU罢了。而主要特殊之处还是在软件上面,厂商提供了一套完善的蓝牙,ANT协议的处理代码,而这部分预先编译好,和用户应用部分程序分别烧录在芯片不同位置,彼此之间通过软件中断进行通信。相比于TI的CC254X系列提供源码和用户代码一起编译而言,这种方式更简洁,不容易出错,基本上协议栈程序和用户应用程序,虽然运行在一个处理器上,但基本处于类似井水不犯河水这种情况,无论是学习还是开发调试都带来了非常巨大的便捷,也无怪于成为目前最火热的智能可穿戴设备的主控SOC。
今天呢就主要讲讲硬件相关部分的感受~~~
首先先上Summary:
1、DCDC真有用,不是搞笑的
2、功耗控制略菜,要么浅睡,要么休眠启动就复位*了
3、外设和端口连接可以随意映射,麻麻再也不用担心我布局布线啦
4、时钟体系8051feel,少挂不少脑细胞
5、各种外设易用功能少,寄存器配置傻瓜型,研发狗之友
6、定时器略菜,实时时钟调试器管不住,调试时候会坑成狗
7、IIC静态功耗有1mA,1mA,1mA!!不用赶紧关
8、温度外设有点搞笑的.......远看高端而已
供电:
和一般ARM Cotex M系列MCU差不多,都是1.8V~3.3V酱紫。也就是对于CR2032这种最常用纽扣电池而言是可以直接供电的,如果使用1节干电池或者可充电锂电池,就需要外围稳压芯片来升降压了。芯片实际内核工作电压就是1.8V。
比较特殊的在于这款芯片自己具有DCDC,即开关式稳压器,仅需外接一个电感一个电容就可以了。这个可以大大提高电源效率,对于寸电寸金的可穿戴智能设备而言是非常友好的一个设计。不过捏,很多人可能都没注意,这个DCDC其实仅能给片内的模拟部分提供电能,并且仅在无线收发器工作时候才开启,数字部分仍然是LDO,即线性稳压器提供。不过一般来讲,这种可穿戴设备也不需要多大运算量,绝大部分时候CPU都是睡眠的,因此这个也没多大影响。根据我们实测结果,跑蓝牙3.3v供电时候,峰值电流不开DCDC大概13个mA,开了之后差不多就9mA了,效果还是很明显的。
布局布线相关:
博主之前比较多时间都做STM32相关开发,那个引脚端口排布简直就跟随机分配一样。连接个啥LCD显示器,外扩内存闪存需要一排信号线过去时布局布线简直就是煎熬。NRF51422就非常友好,直接按顺序0-31排过去了。而且模拟信号相关的比如射频,晶振基本都在一侧,数字的在另一侧,布局布线相对都比较好处理,这个从图片里面也可以看出来。
然而最最最重要的,也是最最最特别的,就是外设和外端口的连接可以随意映射,而且是彻彻底底的随意映射(除ADC外),这个简直就是爽飞了啊,板子怎么安排走线都顺了,用了这个都有再也不想用其他MCU的感觉了哈哈哈哈。
下面谈谈芯片内部的~~来一发内部框图先
这个MCU时钟体系很简单,8051风格,16MHz跑遍全芯片,基本就不用管啦。一般芯片配置个时钟都要烧不少脑细胞,真心是研发狗之友啊哈哈。
功耗控制(PWR):
就两种模式,System ON和System Off,前者都工作,后者都不工作,然后后者切换到前者之后系统等于复位了。这个略菜。一般MCU都是4,5种不同级别的低功耗模式,不少恢复了可以从休眠点继续跑。这个要达到这个效果只能保持在System ON模式,然后用CPU的WFI或者WFE让CPU停掉。Datasheet上面说可以到2.4uA,不过跑了协议栈之后咋都到不了了.....如果放在systemoff还要能唤醒之后继续跑,那就只能软件保存各种外设,CPU寄存器内容状态,然后开内存数据保存,然后再进入Off模式,复位之后自己判断情况来恢复,超级蛋疼。还好我们设备要求也没那么高,就前者搞掂了~~~后者的话,估计又得挂不少脑细胞。
无线收发器(RADIO):
这个无线收发器还是非常易用的,基本可以看作是内嵌了一个NRF24L01。自带功放,外围接一个匹配网络之后直接接50欧姆阻抗的天线就完事了,基本不需要多少射频相关开发经验就可以达到不错的性能,只需要把走线的阻抗匹配好就可以。发射功率最大可以软件设置到+4dbm,基本上我们在楼道里面可以传个几十m都是妥妥的。
一般跑协议栈之后,这个外设就被MPU保护住不能访问了,也不需要管他。不跑协议栈时候,直接操作也是挺方便的,有一些简单数据传输,或者需要大吞吐量数据传输啥的,也可以自己直接操作。无线收发器内置了一个简易DMA用于数据传输,操作也很方便。
此外这个外设内部自带了一个信号强度检测的功能RSSI,拿来玩蓝牙定位啥的不错哦。
通用输入输出端口(GPIO,GPIOTE):
端口模式很全,上拉下拉,开漏,推挽,模拟。需要注意的就是如果有外设连接到选定端口,基本上GPIO模块就管不了它了,也不需要去配置,配置也没用。外设和端口连接除ADC外可以随便映射,前面说过了,这个很爽。然后这里可以设置用GPIO唤醒MCU,不过只能高低电平唤醒,不能边沿唤醒。
然后GPIOTE算是GPIO的扩展吧,有一些没有直连GPIO的外设可以通过PPI再通过这个模块控制GPIO,比如反转,置低拉高的。此外也可以让GPIO以此控制这些外设,比如GPIO高低电平或者上升下降边沿触发外设执行某些操作啥的。这些具体在PPI里面讲了。
啥外设内部互联啥啥的(PPI):
这个也算是这款芯片一个卖点吧,不过一般也就是一些功耗要控制非常非常非常非常低设备才有用的必要。这玩意大概是个啥情况捏,官方那破说明我也是看了老半天才看明白,其实炒鸡简单,且听我讲讲。
芯片内每个外设都有两种比较特殊的寄存器,里面只有一位可用。他们叫任务寄存器(Task)和事件寄存器(Event)。Task就像个按钮,给它写1就可以控制外设去开始一项任务,比如ADC转换一次,定时器捕获一次之类的。事件寄存器就像个灯泡,外设完成一项工作,比如ADC完成一次转换,GPIO捕获到一次下降沿,就点个灯。然后捏,PPI就是个通道,你可以随意配置源和端,就好比放了个人在这里看到亮灯就去按一下开关这种感觉,以此把外设工作串联起来。比如GPIO捕获到一个下降沿就开启一次模数转换,模数转换玩就触发一个GPIO反转啥啥的就自己去发挥啦。
这个还是很能玩的开的,有32个通道,而且各个通道开关本身都还是一个任务,可以组成很多很复杂操作。
这个好处呢,就是让CPU有更多时间睡眠,很多很简单的一系列连续工作就纯靠这个PPI内部机制来完成了,速度快,功耗低。此外很多外设内部还有很多short功能,和这个原理一样,只是将外设内部一些操作串联起来罢了。
模数转换器(ADC):
8,9,10位可配置,貌似是逐次逼近型,功能也比较少,8通道输入,就能开启一次转换,然后获取数据,最多再开个中断。不像某STM32那个ADC单次连续扫描错位连续这个触发那个触发啥啥乱七八糟看得眼花缭乱的,这个基本几行代码就跑起来了。准确度的话还是非常不错的,跟我们安捷伦六位半的表比对,误差基本最多+-1,也就是千分之一酱紫,所以我们产品上面也直接就用片内的模数转换器来进行转换了。射频都能做的厂商,模拟肯定不在话下了哈哈。
此外这个功耗也还好,貌似仅转换时候有功耗,不使用的时候也没有多少必要去关掉它电源,也可能内部自动关的。
定时器(TIMER):
这个也是MCU必备一个外设。不过51422这款的定时器功能也比较单一,简单来讲就捕获和比对俩功能,而且还要和GPIOTE结合在一起使用才能控制到外围管脚,要不然就自己在片内晃荡了。我用TIMER几乎就俩目的,一个产生个Tick中断用来定时触发啥啥的,这个一般就用ARM内核里面那个定时器就好,结果51422居然把这个阉掉了,也是无语。一个就是发生PWM拿来当DAC(数模转换)用。这个和GPIOTE结合起来也能实现硬件PWM,但问题很多,改PWM时候必须要重启定时器,比较坑。而还有个很奇葩的,居然这个定时器的计数寄存器是不能读取写入的,那好吧.......反正后面好像都没怎么用过这个了。
实时时钟(RTC):
这个吧跟上面那个没啥特别区别,就是掉电还能跑就是了。此外这个的计数寄存器总算可以读取了,真不容易。这个自带Tick中断功能,可以代替被阉掉的SysTick那个定时器用来跑系统啥的。我用这个一般也是结合他们提供的驱动代码的AppTimer来使用,可以虚拟出一堆软件定时器,很方便。
不过捏,也有超级超级坑爹事情,就是这个时钟是不能被调试器暂停的。因此跑了协议栈,或者用了AppTimer之后,调试一旦开始,暂停过一次之后就不能在运行了,程序一定会出现神奇问题或者直接挂。原因也很简单就是了,下一篇讲软件部分讲讲这个。
串口(UART):
感觉Nordic就是走简洁易用路线,就像iOS和ARM一样哈哈。这个也还真心就个串口功能........记得一般单片机或者应用处理器,那个UART简直就是个万能通信端口,SPI,IIC,红外都给叠进来了,就介绍这部分Datasheet就有快100页了。这个串口就设置下波特率,停止位,就完事了,然后就发发收收最多加个中断。而且设置波特率还很爽,不用自己去算了,几乎就是直接波特率打进去就行,估计也是得益于8051一样的时钟体系缘故吧哈哈。
串行外设接口(SPI/SPIS):
和串口类似,做主机的话,配置分频配置下采样和输出边沿就能工作了,然后就是发发收收加中断。
做SPI从机很易用,但是功能很有限。内部有个简易DMA,大致就是你先把数据放好,把DMA指针指过去,然后主机选中开始通信之后就自动把这部分数据传出去,同时传进来的也保存在预先设定好位置。搞掂之后根据需求给个中断,完事。这个的话如果需要类似W25Q64那样通信效果就肯定搞不了啦,不过一般芯片之间互传还是都没问题的。
IIC接口(他们叫TWI,两线接口):
这个貌似各个MCU都差不多样子........需要说明的就是,这破玩意静态功耗好高啊,居然有1个mA,不知道是我那个芯片问题还是啥的。反正后面不用的时候就立刻关掉。
闪存控制器(NVMC):
这名字有点帅,老是看成NVIC(Nested Vector Interrupt Controler,嵌套向量中断控制器),哈哈哈。很简单用,解锁,擦,写。不过擦除和写时候CPU会被卡住,因此在跑协议栈时候不能直接用,一般都是通过协议栈的api接口间接控制。
温度传感器(TEMP):
Easy度仅次于8051的IO控制,开启转换,读取数据,完事。而且输出值直接就是两位二进制小数的摄氏度。不过实测这个测温不太准,差别5到10摄氏度不等,而且斜率还不是1.......要拿来测温的话,自己标定吧。线性度倒是很好。
其他还有一些外设,都是不太常用的非主流玩意,也没啥好说啦。总的来讲,这款芯片硬件部分对开发者还是相当友好,不过功能相对而言有限一些。易用性和功能性永远成反比,这个也可以理解。此外这些寄存器配置也相当方便,不需要自己老算来算去的。大致就这样吧,晚些时候再写一篇软件部分感受总结出来~~~