在低功耗應(yīng)用中有時(shí)會(huì)讓MCU進(jìn)入STOP模式以節(jié)省功耗,在有些芯片架構(gòu)中,若要實(shí)現(xiàn)這種應(yīng)用,往往會(huì)在進(jìn)低功耗模式之前將串口的管腳設(shè)置成帶外部中斷模式的普通IO口。雖然這樣也可以達(dá)到效果,但這樣難免會(huì)丟失開頭的一些數(shù)據(jù)。
STM32家族里有些系列的芯片已經(jīng)集成了低功耗UART,即LPUART,這樣就能將低功耗、數(shù)據(jù)通信、正常喚醒完美結(jié)合。
我們可以使用新的LPUART把MCU從STOP下喚醒,又可以不丟失通訊數(shù)據(jù)。當(dāng)然基于LPUART喚醒STOP模式下的MCU也有一定使用限制。下面我們將詳細(xì)介紹一下。
使用不同時(shí)鐘下LPUART進(jìn)行喚醒分析
1、使用HSI16的LPUART
使用HSI16作為L(zhǎng)PUART的時(shí)鐘,波特率就可以較高。不過使用LPUART來喚醒還是有個(gè)問題要注意,即高速的波特率與LPUART的喚醒時(shí)間差的問題。我們以STM32L431作為例子,根據(jù)其數(shù)據(jù)手冊(cè),它的LPUART喚醒時(shí)間如下:
結(jié)合某客戶的實(shí)際案例探討。他們反映LPUART在576000時(shí)喚醒會(huì)丟失首字節(jié)。來一起詳細(xì)分析一下這個(gè)情況。
如果應(yīng)用在STOP MODE 1/2 下,喚醒時(shí)間最大為8.5us,這個(gè)時(shí)間不能逾越串口異步通信所能承受的最大時(shí)間公差。畢竟,串口異步通信時(shí)是不會(huì)針對(duì)這個(gè)喚醒時(shí)間做等待的。那么現(xiàn)在需要做的就是在這樣情況下,求得串口的最大安全通信波特率。
首先我們需要需要以下兩個(gè)參數(shù):
tWULPUART (MCU從STOP模式下的喚醒時(shí)間),這可從數(shù)據(jù)手冊(cè)上查得(如上表)。
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%.
容錯(cuò)公式為 : DTRA + DQUANT + DREC + DTCL + DWU 《 USART
DTRA: 預(yù)期發(fā)送的容錯(cuò)率(這個(gè)包含發(fā)射器本身振蕩器的偏差)
DQUANT: 波特率接收的錯(cuò)誤率
DREC: 接收晶體的偏差
DTCL: 發(fā)送的偏差率 (一般都是發(fā)送器采用不對(duì)稱的上升沿和下降沿時(shí)序)
DWU :是從stop mode 下喚醒后采樣點(diǎn)的偏差而導(dǎo)致的錯(cuò)碼率。
為了更容易計(jì)算,我們簡(jiǎn)化一下公式,假設(shè)DTRA,DQUANT,DREC和DTCL為0%,所以DWU是4.42%,為了更準(zhǔn)確,我還要考慮晶體的誤差,我們使用的HSI誤差為1%,tWULPUART = 8.5uS(這里采用的是STOP2):
DREC + DWU 《 LPUART
=》1% + DWU 《4.42%
=》DWU《3.42%
因?yàn)槲覀冞@里采用的是8bit ,1stop,所以 :
M[1:0] = 00 :
DWU = tWUUSART/(10 × Tbit )
Tbit min = 8.5us/( 10* 3.42%)
Tbit min = 24.8us
所以在這個(gè)條件下異步串口允許的最大波特率是1/24.8us,即要小于40.3K的波特率。我們客戶使用的是576000的波特率顯然過高,丟失首字節(jié)就不難理解了。當(dāng)修改為19200后,問題就解決了。
2、使用LSE的LPUART
有了上面的分析,如果LPUART使用LSE就相對(duì)簡(jiǎn)單了。因?yàn)長(zhǎng)SE只有32.768Khz,LPUART的波特率最大也只能到9600,速度下來了,自然就沒有那么多問題了。
評(píng)論
查看更多