郑创学堂:MCU串口唤醒竟然可以这样玩?

郑创学堂:MCU串口唤醒竟然可以这样玩?

  在嵌入式领域中,低功耗设计已经成为不可忽视的要点,需要通过串口通信唤醒MCU的场合也越来越多,今天我们将介绍一种基于KL03串口不丢数据唤醒的方法,睡眠时功耗仅为2.4uA。

  由于在医疗、无线传感器网络、安防、家电、可穿戴设备等方向都具有相当诱人的应用前景,超低功耗MCU正在被众多的嵌入式工程师所关注。功耗低,性能优越的MCU更会被广大工程师所热爱,合理的低功耗设计同样也能让MCU的性能发挥的淋漓尽致,今天我们就介绍一种基于Freescale KL03的串口唤醒MCU的方法。

  KL03是新一代32位ARM Cortex-M0+内核,与最接近的8/16位架构相比,CoreMark/mA能效得分高两倍。那么如果用串口唤醒MCU的话,睡眠时的功耗会怎么样呢?


图1 KL03的CSP封装(1.6mm×2.0mm)

  我们查阅了KL03的数据手册, MCU在VLPS(Very Low Power Stop)模式下,功耗为2.2uA~2.7uA,唤醒后断点运行,不会产生复位,能满足绝大多数系统设计对于功耗的要求。在VLPS模式,要保持串口通讯正常,需要打开LPUART(Low Power UART)模块,但是会增加80uA左右的电流,这个数值对于一个对功耗敏感的系统来讲显然是不能接受的。那么有没有其他方式即能满足低功耗的要求,同时也能保证串口通信质量呢?

  我们从手册中得知,把MCU从VLPS模式唤醒至RUN模式,需要7.5~8us,可以采用I/O中断唤醒方式。而串口通信也是从一个下降沿开始数据传输,如图 2所示。默认串口的采样频率是波特率的16倍。那么有没有可能利用RXD引脚的下降沿中断唤醒MCU,然后马上切换到串口,并在串口中断中读出正确的数据呢?


图 2 串口时序图

为了验证这个想法,我们按照如下流程测试:

  1.初始化串口和低功耗配置;

  2.把RXD引脚配置为下降沿中断(重要);

  3.进入VLPS模式;

  4.电脑发送测试字符;

  5.MCU唤醒之后,禁用RXD引脚中断,并从串口中断读出电脑发送的字符;

  6.把接收到的字符回发给电脑。

  通过判断回发给电脑的字符是否为原来的字符,我们可以找出满足通信要求的最高波特率。

  经过多次测试我们发现,MCU在VLPS模式下功耗稳定在2.4uA,当我们设置波特率为28800及以下时,KL03都能够正确接收电脑发送的字符,并唤醒MCU。当我们把波特率设置为38400时发现,虽然MCU同样被唤醒了,但是接收到的字符却是错误的。这是为什么呢?

  现在我们将这种串口唤醒MCU的原理分析一下。在图 3中,展示了向MCU发送0x55的过程。下降沿开始数据传输,我们把MCU接收到Begin位的过程单独拿出来分析。RXD引脚下降沿唤醒MCU,从执行唤醒操作到MCU执行程序是需要时间的,我们称为唤醒时间x,而串口通信中每一位占用的时间我们称为y,前面说过串口的采样频率是固定的,如果唤醒时间x在MCU的Begin位中占的比例越大,则失真的概率也就越高。

  为了保证串口通信中的Begin位不失真,x/y值越小越好。如果y一定,即MCU的波特率一定时,则唤醒时间越短越好,这就跟MCU的性能有关了。KL03从VLPS模式唤醒至RUN模式时间大约为8us。但如果唤醒时间一定,那么y值越大越好,即波特率越小越好。经过我们实际测试,当波特率为28800及以下时,Begin位都不会失真。

  以串口通讯中最常用的波特率9600bps为例,唤醒时间x为8us,串口通信中每一位占用的时间y=1000000/9600=104us,则x/y=7.69%,此值非常小,在串口硬件16次采样中最多会丢失2次采样(2/16=12.5%),可以正常采集到begin位,确保不丢数据。


图 3 串口唤醒原理图

  飞思卡尔KL03在VLPS模式下,功耗仅为2.2uA~2.7uA,唤醒时间仅为7.5~8us,且唤醒后断点运行,不会产生复位。极低的功耗和极短的唤醒时间是此方案可行的关键参数。

飞  思卡尔KL系列功耗低,唤醒时间短,性能优越。在三表行业和一些传感器采集的场合都是不错的选择。

Tags: , ,