CW32單片機UART低功耗模式介紹
在嵌入式系統(tǒng)的設計中,低功耗設計(Low-Power Design)是許多設計人員必須面對的問題,其原因在于嵌入式系統(tǒng)被廣泛應用于便攜式和移動性較強的產(chǎn)品中去,而這些產(chǎn)品不是一直都有充足的電源供應,往往是靠電池來供電,所以設計人員從每一個細節(jié)來考慮降低功率消耗,從而盡可能地延長電池使用時間。因此,大部分芯片都會有低功耗模式,以CW32L083為例,它就是一個32位低功耗微控制器。
一、芯片模式介紹
1.CW32L083工作模式
CW32L083 支持三種工作模式,由內(nèi)嵌的電源管理模塊自動完成電源的統(tǒng)一管理。三種工作模式是:?
? 運行模式(Active mode)?
? 休眠模式(Sleep mode)?
? 深度休眠模式(DeepSleep mode)?
電源上電后,系統(tǒng)自動進入運行模式。用戶可通過軟件程序,進入休眠或深度休眠兩種低功耗運行狀態(tài);在低功耗運行狀態(tài)時,可通過硬件中斷觸發(fā)喚醒機制,使系統(tǒng)返回到運行模式。
2.進入休眠模式或深度休眠模式
使用 M0+ 內(nèi)核的 ARM 等待中斷專用指令,WFI(Wait for Interrupt),配合 M0+ 內(nèi)核的系統(tǒng)控制寄存器(SCR, System Control Register)的 SLEEPONEXIT 和 SLEEPDEEP 位域,可實現(xiàn)立即進入或退出(中斷服務程序)時進 入休眠模式或深度休眠模式。?
? 立即進入?
執(zhí)行 WFI 指令,MCU 將立即進入休眠模式(SLEEPDEEP 為 0 時)或深度休眠模式(SLEEPDEEP 為 1 時)?
? 退出時進入?
將 SLEEPONEXIT 位置 1,當退出最低優(yōu)先級的中斷服務程序后,MCU 會進入休眠模式(SLEEPDEEP 為 0 時) 或深度休眠模式(SLEEPDEEP 為 1 時),而不需執(zhí)行 WFI 指令 。
在深度休眠模式下,系統(tǒng)將自動關閉高速時鐘。如用戶需要在深度休眠模式下使部分外設仍保持運行,則須在進入深度休眠模式前,啟動相應的低速時鐘并將該外設時鐘設置為此低速時鐘。
3.退出休眠模式或深度休眠模式
在休眠模式或深度休眠模式下,均可通過中斷來喚醒 CPU,返回到運行模式。但是,值得注意的是,如果用戶在中斷服務程序中執(zhí)行 WFI 命令進入休眠(包括深度休眠),則需要比此中斷更高優(yōu)先級的中斷才能喚醒 CPU,因此,我們強烈建議用戶在準備進入休眠前,應先處理完所有中斷服務程序,并且清除所有中斷請求和中斷標志。
使用中斷退出休眠模式,用戶必須在進入休眠(包括深度休眠)前使能此中斷的允許位。
中斷喚醒退出深度休眠模式時,CPU 運行狀態(tài)與退出休眠模式相同。
4.UART控制深度休眠模式
UART控制器工作在雙時鐘域下,支持在深度休眠模式下進行正常的數(shù)據(jù)收發(fā),并通過接收完成中斷喚醒 MCU回到運行模式。
如果設置了傳輸時鐘 UCLK來源為低速時鐘,當系統(tǒng)進入深度休眠模式后,高速時鐘將停止,低速時鐘保持運行,UART仍可以進行正常的數(shù)據(jù)收發(fā)(波特率僅支持 2400 bps、4800 bps 和 9600 bps)。要實現(xiàn)深度休眠模式下使用 UART 喚醒功能,需在進入深度休眠模式之前使能 UART 接收完成中斷(即設置 UARTx_IER.RC 為 1),數(shù)據(jù)接收完成時,接收完成中斷將喚醒MCU恢復到運行模式。
如果設置了傳輸時鐘 UCLK 來源為高速時鐘,當系統(tǒng)進入深度休眠模式后,高速時鐘會停止運行,UAR不會接收數(shù)據(jù)。此時,仍可通過GPIO中斷喚醒 MCU,實現(xiàn)在深度休眠模式下接收數(shù)據(jù),參考配置步驟如下:?
步驟 1:使能 UARTx_RXD 對應引腳的 GPIO 下降沿中斷;?
步驟 2:設置 UARTx_CR1.START 為 1,選擇 RXD 信號起始位判定方式為低電平;?
步驟 3:使能 UART 接收(即設置 UARTx_CR1.RXEN 為 1);?
步驟 4:進入深度休眠模式;?
步驟 5:等待主機發(fā)送數(shù)據(jù),產(chǎn)生 GPIO 下降沿中斷,喚醒 MCU;?
步驟 6:關閉 RXD 對應引腳的 GPIO 中斷功能,等待 RXD 接收完成。
二、實例演示:UART深度休眠模式示例(傳輸時鐘為LSI)
程序運行一段時間后進入深度休眠模式,PC發(fā)送數(shù)據(jù)可喚醒MCU,喚醒后UART輪詢接收數(shù)據(jù),并存儲到TxRxBuffer緩沖區(qū),UART接收到'\n'后不再接收數(shù)據(jù),然后將TxRxBuffer緩沖區(qū)中的數(shù)據(jù)回傳至PC。傳輸結束后,LED1閃爍5s,并再次進入深度休眠模式。
1.外設時鐘使能
2.配置GPIO
3.配置UART
4.配置低功耗模式
5.配置NVIC中斷
6.發(fā)送8位數(shù)組
7.接收8位數(shù)組
8.主程序
9.測試結果
結果顯示,通過PC發(fā)送123456后喚醒MCU, 喚醒后UART輪詢接收數(shù)據(jù),并存儲到TxRxBuffer緩沖區(qū),UART接收到'\n'后不再接收數(shù)據(jù),然后將TxRxBuffer緩沖區(qū)中的數(shù)據(jù)回傳至PC收到123456。傳輸結束后,LED1閃爍5s,并再次進入深度休眠模式。
