在低功耗应用中有时会让MCU进入STOP模式以节省功耗,在有些芯片架构中,若要实现这种应用,往往会在进低功耗模式之前将串口的管脚设置成带外部中断模式的普通IO口。虽然这样也可以达到效果,但这样难免会丢失开头的一些数据。STM32家族里有些系列的芯片已经集成了低功耗UART,即LPUART,这样就能将低功耗、数据通信、正常唤醒完美结合。我们可以使用新的LPUART把MCU从STOP下唤醒,又可以不丢失通讯数据。当然基于LPUART唤醒STOP模式下的MCU也有一定使用限制。下面我们将详细介绍一下。
使用不同时钟下LPUART进行唤醒分析1、使用HSI16的LPUART使用HSI16作为LPUART的时钟,波特率就可以较高。不过使用LPUART来唤醒还是有个问题要注意,即高速的波特率与LPUART的唤醒时间差的问题。我们以STM32L431作为例子,根据其数据手册,它的LPUART唤醒时间如下:
结合某客户的实际案例探讨。他们反映LPUART在576000时唤醒会丢失首字节。来一起详细分析一下这个情况。
如果应用在STOP MODE 1/2 下,唤醒时间最大为8.5us,这个时间不能逾越串口异步通信所能承受的最大时间公差。毕竟,串口异步通信时是不会针对这个唤醒时间做等待的。那么现在需要做的就是在这样情况下,求得串口的最大安全通信波特率。首先我们需要需要以下两个参数:tWULPUART (MCU从STOP模式下的唤醒时间),这可从数据手册上查得(如上表)。LPUART接收的允许公差(如下表):
下面我们以8bit ,1 STOP bit,BRR ≥4096,STOP 2 mode作为例子:首先我们可以通过上表”Table 165: Tolerance of the LPUART receiver whenBRR[3:0] is different from 0000”得出LPUART在这情况下的接收容差是4.42%.
容错公式为 : DTRA + DQUANT + DREC + DTCL + DWU < USARTDTRA: 预期发送的容错率(这个包含发射器本身振荡器的偏差)DQUANT: 波特率接收的错误率DREC: 接收晶体的偏差DTCL: 发送的偏差率 (一般都是发送器采用不对称的上升沿和下降沿时序)DWU :是从stop mode 下唤醒后采样点的偏差而导致的错码率.
为了更容易计算,我们简化一下公式,假设DTRA,DQUANT,DREC和DTCL为0%,所以DWU是4.42%,为了更准确,我还要考虑晶体的误差,我们使用的HSI误差为1%,tWULPUART = 8.5uS(这里采用的是STOP2):
DREC + DWU < LPUART=>1% + DWU <4.42%=>DWU<3.42%因为我们这里采用的是8bit ,1stop,所以 :M[1:0] = 00 :DWU = tWUUSART/(10 × Tbit )Tbit min = 8.5us/( 10* 3.42%)Tbit min = 24.8us
所以在这个条件下异步串口允许的最大波特率是1/24.8us,即要小于40.3K的波特率.我们客户使用的是576000的波特率显然过高,丢失首字节就不难理解了。当修改为19200后,问题就解决了。
2、使用LSE的LPUART有了上面的分析,如果LPUART使用LSE就相对简单了。因为LSE只有32.768Khz,LPUART的波特率最大也只能到9600,速度下来了,自然就没有那么多问题了。
小结:时不时会有人问起类似问题,其实关于该问题在STM32芯片的相关参考手册中都有描述。总之,在开发中遇到问题时建议看看芯片技术手册的相关部分,有的可能是专门描述,有的是可能是旁注提醒【Note/Caution】等。
------ 微信公众号 融创芯城(一站式电子元器件、PCB/PCBA购买,项目众包,方案共享平台)
|