在低功耗應用中有時會讓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 < USART DTRA: 預期發送的容錯率(這個包含發射器本身振蕩器的偏差) 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購買,項目眾包,方案共享平臺)
|