丁月林
摘要:STM32是一款基于Cortex M3內(nèi)核的微控器,在嵌入式領(lǐng)域有著重要應(yīng)用。本文介紹了一種基于STM32的低功耗溫濕度采集器的硬件設(shè)計(jì)及其低功耗實(shí)現(xiàn)。傳感器使用SHT10溫濕度傳感器,介紹并實(shí)現(xiàn)了其通訊時(shí)序。該低功耗采集器經(jīng)試驗(yàn)測(cè)試可連續(xù)工作近30天,滿足長時(shí)間工作的設(shè)計(jì)要求。該低功耗實(shí)現(xiàn)方法可應(yīng)用于基于STM32的其他控制系統(tǒng)。
關(guān)鍵詞:STM32;低功耗電源管理
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:B DOI:10.3969/j.issn.1003-6970.2015.05.018
0 引言
STM32嵌入式系統(tǒng)在許多控制領(lǐng)域有著廣泛的應(yīng)用。STM32是一款基于Cortex-M3內(nèi)核的微控器,該控制器在性能和成本以及低功率操作和硬實(shí)時(shí)控制方面設(shè)定了新的標(biāo)準(zhǔn)。Cortex系列是一個(gè)完整的處理器核心,一個(gè)標(biāo)準(zhǔn)的CPU和系統(tǒng)架構(gòu)。Cortex系列共有三個(gè)主要的配置系列:A高端應(yīng)用系列,R為實(shí)時(shí)應(yīng)用系列,M為成本敏感和微控器應(yīng)用系列。STM32屬于M配置系列,專為高系統(tǒng)性能與低功耗相結(jié)合設(shè)計(jì)。
盡管市場(chǎng)上已有多種溫濕度采集系統(tǒng),但具有低功耗且自帶數(shù)據(jù)記錄功能的采集器較少,并且費(fèi)用較高。本文中采用STM32F103RET6設(shè)計(jì)了溫濕度采集系統(tǒng)。該系統(tǒng)工作時(shí)間長約30天,低功耗模式采用了停止模式實(shí)現(xiàn),溫濕度傳感器使用SHTIO溫濕度傳感器。結(jié)合實(shí)際使用環(huán)境,采集周期為5分鐘。采用18650鋰電池供電,具有SD卡存儲(chǔ)功能,且能實(shí)現(xiàn)USB全速通信和串口通信。
1 溫濕度采集器設(shè)計(jì)
1.1 硬件設(shè)計(jì)
采集器的結(jié)構(gòu)框架如圖l所示,主要有供電模塊,USB全速通信模塊,STM32芯片,SD卡存儲(chǔ)模塊,溫濕度傳感器,串口通信模塊,JTAG在線調(diào)試模塊組成。
考慮體積因素,系統(tǒng)采用18650充電鋰電池供電,單節(jié)2400mah電池充滿電后可以工作2個(gè)月左右時(shí)間。
STM32以合秦公司的HT7333降壓模塊供電。通過RTC實(shí)時(shí)時(shí)鐘控制,每5分鐘喚醒一次,進(jìn)行數(shù)據(jù)采集。以自定義的通信協(xié)議通過SHT10溫濕度傳感器獲取數(shù)據(jù)。采集到的溫濕度數(shù)據(jù)以16進(jìn)制形式寫入SD卡。SD卡中的數(shù)據(jù)可以經(jīng)由串口通信模塊和USB全速通信模塊導(dǎo)出,也可以直接由SD卡讀出。
1.2 SHT10溫濕度傳感器通信時(shí)序
SHT10溫濕度傳感器的通信時(shí)序如圖2所示。
傳感器以不小于1V/ms的上電速率供電后,首先進(jìn)入11ms的休眠狀態(tài),在此期間不允許對(duì)傳感器發(fā)送任何指令。當(dāng)準(zhǔn)備傳輸數(shù)據(jù)時(shí),需用一組“啟動(dòng)時(shí)序”完成數(shù)據(jù)傳輸?shù)某跏蓟T搯?dòng)時(shí)序?yàn)椋寒?dāng)SCK時(shí)鐘為高電平時(shí),DATA翻轉(zhuǎn)為低電平,緊接著SCK變?yōu)榈碗娖?,隨后在SCK時(shí)鐘高電平時(shí),DATA翻轉(zhuǎn)為高電平。后續(xù)命令包含三個(gè)地址位和五個(gè)命令位。傳感器接收到命令后,會(huì)在第8個(gè)SCK下降沿后將DATA下拉為低電平(ACK位)。在第9個(gè)SCK下降沿后,釋放DATA,將其恢復(fù)為高電平。
其5位的命令集如表1所示。
在“啟動(dòng)時(shí)序”發(fā)送溫濕度測(cè)量的命令(00000101表示相對(duì)濕度,00000011表示溫度)后,控制器等待測(cè)量結(jié)束。過程大約為20/80/320ms,分別對(duì)應(yīng)8/12/14bits測(cè)量。傳感器通過下拉DATA至低電平并進(jìn)入空閑模式表示測(cè)量結(jié)束??刂破髟谠俅纬霭l(fā)SCK前必須等待“數(shù)據(jù)備妥”信號(hào)讀取數(shù)據(jù)。溫濕度數(shù)據(jù)可以先被存儲(chǔ),這樣控制器可以繼續(xù)指向其他任務(wù),在需要時(shí)再讀出數(shù)據(jù)。
接著傳輸2個(gè)字節(jié)的測(cè)量數(shù)據(jù)和1個(gè)字節(jié)的CRC奇偶校驗(yàn)。傳感器下拉DATA為低電平,以確認(rèn)每個(gè)字節(jié)。所有數(shù)據(jù)從MSB開,右值有效。收到CRC確認(rèn)位之后,表示通訊結(jié)束。若不使用CRC-8校驗(yàn),過保持ACK高電平終止通訊。測(cè)量和通訊完成后,傳感器進(jìn)入休眠模式。
1.3 通訊接口配置
溫濕度傳感器與STM32的GPIOB PIN6和GPIOB PIN7連接,其中PIN6為時(shí)鐘通訊端口,PIN7為數(shù)據(jù)通訊端口。STM32的PIN6腳為傳輸速度50MHz的推挽輸出,PIN7腳為傳輸速度50MHz的推挽輸入輸出模式(接受數(shù)據(jù)時(shí)為輸入,發(fā)送應(yīng)答指令時(shí)為輸出)。
“啟動(dòng)時(shí)序”通過寫SHT10的SCK和DATA實(shí)現(xiàn)。先將PIN7腳配置為推挽輸出,速率為50MHz,然后通過拉低SCK時(shí)鐘,拉高SCK,拉低DATA,拉低SCK,拉高SCK,拉高DATA,拉低SCK的順序進(jìn)行操作,操作之間設(shè)置一段延遲。在“啟動(dòng)時(shí)序”完成后,通過寫0x03和0x05來實(shí)現(xiàn)發(fā)送命令,進(jìn)行溫度測(cè)量和濕度測(cè)量。
2 時(shí)鐘系統(tǒng)及功耗測(cè)試分析
2.1 STM32的時(shí)鐘系統(tǒng)
時(shí)鐘系統(tǒng)正常工作是使STm32及其外設(shè)正常運(yùn)行的前提,且系統(tǒng)時(shí)鐘頻率及外設(shè)時(shí)鐘頻率配置的高低對(duì)采集器耗電量有著很大影響。STm32有內(nèi)部RC振蕩器,其能夠?yàn)閮?nèi)部提供PLL時(shí)鐘,可以達(dá)到微控器最高頻率72MHz的要求。但是內(nèi)部時(shí)鐘不及外部晶振準(zhǔn)確和穩(wěn)定,所以在溫濕度采集系統(tǒng)中選用了外部時(shí)鐘源,這個(gè)外部時(shí)鐘源被稱為外部高速振蕩器(HSE)。外部時(shí)鐘源用來為Cortex處理器和STM32外設(shè)提供時(shí)鐘。由于內(nèi)部PLL時(shí)鐘是用整數(shù)值乘以HSE振蕩頻率,因此外部時(shí)鐘頻率需能被72MHz。實(shí)際采集系統(tǒng)中選用了振蕩頻率為8MHz的晶振。
其中外部晶振HSE振蕩后,產(chǎn)生8MHz的時(shí)鐘信號(hào),經(jīng)PLL鎖相環(huán)9倍頻后至72MHz。系統(tǒng)時(shí)鐘以72MHz運(yùn)行,并將APBI外設(shè)時(shí)鐘配置為系統(tǒng)時(shí)鐘的2分頻,將APB2外設(shè)時(shí)鐘配置為系統(tǒng)時(shí)鐘的1分頻。
STM32有兩個(gè)電源域:主系統(tǒng)和外圍設(shè)備的電源域,備份域。備份域中包括10個(gè)16位寄存器,RTC和獨(dú)立看門狗。在低功耗模式下,RTC和獨(dú)立看門狗可以保持繼續(xù)運(yùn)行以喚醒STM32主系統(tǒng)或執(zhí)行系統(tǒng)復(fù)位。STM32包含一個(gè)基本的實(shí)時(shí)時(shí)鐘,它是優(yōu)化了的32位計(jì)數(shù)器,當(dāng)有32.768kHz時(shí)鐘源提供時(shí)鐘時(shí),它會(huì)在每一秒到來時(shí)計(jì)數(shù)。配置時(shí)鐘樹時(shí),RTC時(shí)鐘源可以選擇來自:內(nèi)部低速振蕩器,外部低速振蕩器或外部高速振蕩器的128分頻。通過RTC可以得到準(zhǔn)確的秒計(jì)數(shù),計(jì)數(shù)器本身可以產(chǎn)生三種中斷:一秒鐘中斷,溢出中斷和鬧鐘中斷。采集器中選擇外部低速時(shí)鐘作為RTC時(shí)鐘,通過鬧鐘中斷的方式對(duì)主電源域進(jìn)行喚醒,鬧鐘寄存器中存儲(chǔ)的值為32767。
在有電池備份的條件下,RTC可以在主電源域進(jìn)入低功耗模式時(shí)繼續(xù)運(yùn)行。通過EXTI他可以在NVIC中產(chǎn)生時(shí)間終端,喚醒STM32的主電源域。但是處于體積的考慮,本采集器并未設(shè)計(jì)備用電池,而是通過直接通過HT7333模塊輸出管腳為RTC供電。
2.2 功耗測(cè)試分析
STM32芯片電源供電框圖如圖3。
溫濕度采集器選用4.2v單節(jié)鋰電池供電,鋰電池容量約為2600mah。由于鋰電池電壓輸出大于芯片供電電壓,且鋰電池使用過程中電壓不斷波動(dòng)變化,影響數(shù)據(jù)采集準(zhǔn)確性。故采集器中選用了降壓模塊,將電壓降且穩(wěn)定至3.3V,為芯片和外設(shè)供電。
該芯片轉(zhuǎn)換效率約為90%,通過估算方式可得其在3.3V供電時(shí)容量約為3000mah。當(dāng)系統(tǒng)時(shí)鐘運(yùn)行在最高速72MHz時(shí),用萬用表測(cè)量采集系統(tǒng)電流約為100ma。待鋰電池充滿電后進(jìn)行測(cè)試,采集周期5分鐘。STM32每次將測(cè)量獲得的溫度數(shù)據(jù)、濕度數(shù)據(jù)通過SDIO接口協(xié)議寫入SD卡中。該狀態(tài)下采集時(shí)間約為26小時(shí)。由此可知,未使用低功耗模式的采集系統(tǒng)耗電量較大。該試驗(yàn)要求的密閉環(huán)境中進(jìn)行采集時(shí),不能滿足長時(shí)間持續(xù)工作的設(shè)計(jì)要求。
3 低功耗模式的實(shí)現(xiàn)
3.1 STM32的低功耗模式
STM32共有睡眠、停止以及待機(jī)三種低功耗工作模式:
a睡眠模式:默認(rèn)情況下,當(dāng)一個(gè)WFE指令或WFI指令被執(zhí)行時(shí)Cortex處理器將停止內(nèi)部時(shí)鐘,并停止執(zhí)行應(yīng)用程序代碼。該模式下,STM32其余部分將繼續(xù)運(yùn)行。當(dāng)某個(gè)外設(shè)產(chǎn)生一個(gè)中斷時(shí),其將退出睡眠模式。理論上,若STM32首先禁用所有外設(shè)時(shí)鐘(除了喚醒Cortex的外設(shè)以外),再到HSI振蕩器,且將HSI時(shí)鐘頻率1MHz一下,可將功耗降低至大約為5ma。
b停止模式:停止模式是Cortex-M3的深睡眠模式基礎(chǔ)上結(jié)合了外設(shè)的時(shí)鐘控制機(jī)制。在停止模式下,電壓調(diào)節(jié)器可以運(yùn)行在正?;蛘叩凸哪J?。此時(shí)1.8V供電區(qū)域的所有時(shí)鐘被停止。PLL、HSI和HSE振蕩器功能被禁。本采集器采用停止模式實(shí)現(xiàn)低功耗工作。通過設(shè)置Cortex控制寄存器的SLEEPDEEP位,清除S電源控制寄存器的PDDS位,設(shè)置LPDS為選擇電壓調(diào)節(jié)器的模式,STM32即可進(jìn)人低功耗停止模式。該模式下,WFI或WFE指令的執(zhí)行將停止Cortex處理器,并且關(guān)閉HSE和HSI振蕩器。停止模式下,任意的外部中斷都會(huì)將STM32喚醒。
c待機(jī)模式:待機(jī)模式可實(shí)現(xiàn)系統(tǒng)最低功耗,該模式是在Cortex-M3睡眠模式時(shí)關(guān)閉電壓調(diào)節(jié)器,整個(gè)1.8V供電區(qū)域被斷電。PLL、HIS和HSE振蕩器也被斷電。SRAM和寄存器內(nèi)容丟失,只有備份的寄存器和待機(jī)電路維持供電。待機(jī)模式下STM32僅消耗2uA。通過設(shè)置Cortex電源控制寄存器中的SLEEPDEEP位和STM32的PDDS位可進(jìn)入待機(jī)模式??梢允褂肦TC鬧鐘喚醒待機(jī)模式,也可以使用外部STM32復(fù)位或獨(dú)立看門狗復(fù)位喚醒,也可以通過PORTA引腳0的上升沿退出待機(jī)模式,但是該引腳必須被配置為喚醒引腳WAKEUP。相應(yīng)的,該模式退出時(shí)間花費(fèi)最長,約為50us。
3.2 低功耗停止模式的軟件實(shí)現(xiàn)
首先使能電源控制時(shí)鐘和RTC后備寄存器時(shí)鐘,之后使能RTC和后備寄存器訪問。然后使能外部32.768kHz低速晶振,待外部晶振振蕩穩(wěn)定之后,配置外部32.768kHz低速晶振作為RTC時(shí)鐘,配置完成后使能RTC時(shí)鐘。使能RTC時(shí)鐘后,等待RTC寄存器同步。對(duì)于RTC任何寄存器的寫操作,都必須在前一次寫操作結(jié)束后進(jìn)行。通過查血RTC CR寄存器中的RTOFF狀態(tài)位,判斷RTC寄存器是否處于更新中。當(dāng)且僅當(dāng)RTOFF狀態(tài)位為“1”時(shí),方可寫入RTC寄存器。RTC寄存器配置過程如圖4。
3.3 對(duì)比測(cè)試分析
在未開啟低功耗停止模式下,取滿電的2600mAh鋰電池進(jìn)行電量測(cè)試,采集要素為戶外溫濕度環(huán)境。采集數(shù)據(jù)過程中對(duì)電池電流進(jìn)行測(cè)試,電流為103mAh。采集點(diǎn)數(shù)為316個(gè)點(diǎn),即采集了26小時(shí)20分鐘。試驗(yàn)測(cè)試采集的數(shù)據(jù)如圖5所示。
在開啟低功耗停止模式下,取滿電的2600mAh鋰電池進(jìn)行電量測(cè)試,采集要素也為戶外溫濕度環(huán)境。采集數(shù)據(jù)過程中對(duì)電池電流進(jìn)行測(cè)試,低功耗模式下電流為4mA,喚醒啟動(dòng)時(shí),工作電流為54mA。試驗(yàn)開始10天后,測(cè)試電源電壓。電壓顯示為3.96V,這表明10天后溫濕度采集器仍在工作。讀取SD卡數(shù)據(jù)。采集點(diǎn)數(shù)為2936個(gè)點(diǎn),即采集了10天4小時(shí)40分鐘。試驗(yàn)測(cè)試采集的數(shù)據(jù)如圖6所示。
按電壓每天下降0.3V速度計(jì)算,當(dāng)電壓下降的工作下限3.35V時(shí),其工作時(shí)間約為60天??梢詽M足長時(shí)間工作需要,達(dá)到設(shè)計(jì)要求。
4 結(jié)語
介紹了基于STM32F03RET6的低功耗溫濕度采集系統(tǒng)的設(shè)計(jì)原理,簡述了SHTIO溫濕度傳感器通訊配置,并給出了“啟動(dòng)時(shí)序”的部分程序?qū)嵗?。描述了STM32的低功耗模式,并予以實(shí)現(xiàn)。通過實(shí)際測(cè)試,發(fā)現(xiàn)低功耗模式可以使其工作周期延長接近25倍。實(shí)現(xiàn)了長時(shí)間連續(xù)采集的設(shè)計(jì)要求。該低功耗方法適用于其他STM32控制系統(tǒng),具有較大意義。