【原创】关于Kinetis E系列底层驱动库内部时钟Trim问题
0赞较早之前就写过几篇文章介绍过飞思卡尔基于5v工艺制造的ARM Cortex-M0+产品Kinetis E系列(业界第一款哦,呵呵),如今距离其产品发布已经过去一年多了,KE系列还是颇受很多国内客户尤其是家电厂商和工业客户欢迎的,对家电厂商来说,考虑成本和可靠性的问题(我觉着主要是成本的问题,呵呵),目前很多家电的控制器仍然是以老的8位机为主(主要是Renesas,Freescale和Microchip等主要几家的产品),工业客户则范围比较广了,但是其老8位机和16位机也是依旧坚守阵地,而这些传统的应用仍然也是主要以5v供电和5v接口为主,随着产品的升级换代,为尽量减少BOM的改动,5v宽电压的ARM还是一个非常不错的选择,因此主打5v宽电压和EMC性能的KE系列自然混的不错了,哈哈。
废话说的有点多,有点植入广告的嫌疑了,哈哈,所以还是赶紧上点硬料,免得受广大博友吐槽。飞思卡尔在KE推出的时候破天荒的为KE系列写了一个非常好用的底层驱动库,不过最近在调试KE02串口通信的时候发现了一个容易被忽视掉的问题,那就是内部时钟TRIM的问题,这个问题只有在我们不使用外部晶振而是选择内部时钟作为FLL锁频环时钟源的时候才会发现,在提出这个问题之前,我们需要知道几个内部时钟相关的问题:
1. KE系列内部有一个动态范围在31.25~39.0625kHz之间RC震荡时钟,具体这个时钟大小可以通过trim来配置,但是这个trim值不同的芯片可能不一样,不过放心,在每一片芯片出厂前,都会被厂家trim到一个统一时钟大小(这个是必然的,不然岂不是不同的芯片我们都需要根据实际时钟大小来单独配置),对KE02来说,其出厂后其内部时钟被统一trim到31.25kHz,如下图:
2. 这个trim后的时钟精度在全温度范围为-1%~0.5%之间(因为其内部时钟为RC震荡时钟,其受温度影响较明显),不过这个精度对一般的串口通信来说是没有问题的,如果用的高速串口(115200bps以上)或者类似USB或者CAN通信等要求比较高的应用,还是强烈建议使用外部无源或者有源晶振的,trim后的精度如下图:
3. 对KE系列来说,其内部时钟管理模块比较简单,其内部的FLL锁频环的倍频系数是固定的1024倍,所以如果使用内部时钟的话其经FLL倍频后的时钟范围为32MHz~40MHz,而由于出厂统一被trim到31.25kHz,所以芯片默认状态时可以达到32MHz的。
该说的上面说完了,下面谈谈KE底层驱动库的问题,为了更好的利用芯片的资源,其库里面默认是通过主动写入TRIM值得方式把内部时钟重新Trim到39.0625,这样的话通过FLL倍频,正好可以将芯片运行在39.0625*1024=40MHz左右的时钟频率,这是驱动库好的初衷,如下图:
这个初衷是好的,但是这样会有一个潜在的隐患,那就是驱动库中这个Trim值是固定的一个经验值(即ICS_TRIM_VALUE这个宏表示一个常值),但是我在上面提到过由于R和C值得差异性(不可能像石英晶振那样准),我们不同的芯片trim到相同频率的值可能会不一样,这也是我们为什么芯片出厂时厂家会帮我trim到一个统一值(芯片厂家有专门的设备),因此在库中用一个统一的值来trim到一个时钟会带来潜在的时钟不一致的问题,由此带来的问题是系统主时钟的精度较差(使用内部时钟的情况下),如果用这个精度差的时钟去做通信波特率的计算自然也就带来了通信不稳定或不可靠的问题,这是使用内部时钟作为系统时钟源并且在软件中加入trim值会带来的一个问题。不过出现问题了,就要想着怎样解决问题,下面我给出几点建议如下:
1. 将手动TRIM的代码去掉,这样的话系统默认内部时钟为出厂trim好的31.25kHz,这个时钟是准确的,然后以这个时钟去倍频和计算通信波特率,自然会没有问题;
2. 如果要使用高速的异步串行通信(同步通信不会出现这个问题,因为有clock做同步),则建议还是把外部晶振加上,这样就不用担心其时钟精度的问题了。
好了,今天就写到这了,虽然有段时间没抽出时间写写了,但是手感还在啊一下子写了这么多,不错,继续发扬,哈哈。未完待续~