雖然這個稱做出來的樣子不是可攜式,外觀有些簡陋(自己用木頭架子搭起來的),但是對於使用兩節3.7v的18650的鋰電池供電來說,還是需要設計一下低功耗的。
稱的使用頻率不高,不能讓觸控螢幕一直亮著,也不能讓微控制器一直處於工作狀態,那樣也太不節能、太不綠色了。
我想要的效果是在稱上沒有放任何東西的時候,如果持續30秒沒有放置,立即進入低功耗模式,但是sram和暫存器中的資料不要丟失,在這個基礎上,功耗盡量小就可以了。
對比上面的模式說明,我需要進入的是停止模式。
停止模式是在cortex™-m3的深睡眠模式基礎上結合了外設的時鐘控制機制,在停止模式下電壓
調節器可執行在正常或低功耗模式。此時在1.8v供電區域的的所有時鐘都被停止, pll、 hsi和
hse rc振盪器的功能被禁止, sram和暫存器內容被保留下來。
關鍵的一點是在停止模式下,所有的i/o引腳都保持它們在執行模式時的狀態。
確定了進入的是停止模式,那麼如何才能進入停止模式呢?
其實這麼多操作,st全都給我們封裝在了乙個庫函式中:void pwr_enterstopmode(uint32_t pwr_regulator, uint8_t pwr_stopentry)
具體內容是:
void我們只需要在需要低功耗的時候,呼叫這個函式就行了。pwr_enterstopmode(uint32_t pwr_regulator, uint8_t pwr_stopentry)
else
/*reset sleepdeep bit of cortex system control register
*/scb->scr &= (uint32_t)~((uint32_t)scb_scr_sleepdeep);
}
但是我們要選擇自己需要喚醒時的方式——中斷wfi(wait for interrupt) or 事件wfe(wait for event)
這兩個有點繞:事件是中斷的觸發源,開放了對應的中斷遮蔽位,則事件可以觸發相應的中斷。在stm32中,中斷與事件不是等價的,乙個中斷肯定對應乙個事件,但乙個事件不一定對應乙個中斷。
比如我想要使用外部按鍵喚醒停止中的stm32,那麼需要把按鍵引腳對映在了外部中斷線上,然後對應的上面配置成中斷喚醒方式:
pwr_enterstopmode(pwr_regulator_lowpower,pwr_stopentry_wfi);
在按鍵的中斷函式中配置退出低功耗時的操作即可。
hsi時鐘是板子上的8m晶振提供的,而我們使用的是72m的時鐘,所以還需要重新配置一下時鐘:
//使用的是hmi串列埠屏,乙個指令即刻讓螢幕進入sleep模式啟動並配置stm32
errorstatus hsestartupstatus;
//使能 hse
rcc_hseconfig(rcc_hse_on);
//等待 hse 準備就緒
hsestartupstatus =rcc_waitforhsestartup();
if(hsestartupstatus ==success)
//選擇pll作為系統時鐘源
rcc_sysclkconfig(rcc_sysclksource_pllclk);
//等待pll被選擇為系統時鐘源
while(rcc_getsysclksource() != 0x08
)
}
//還是檢視晶元手冊:hmi息屏
void hmi_sleep_mode(void
)
cs1237重新喚醒,sclk回到低電平並保持10us
void cs1237_restart(void
)一開始考慮使用定時器定時對比讀出的重量資料,如果資料在30s內沒有變化並且一直小於1g,則進入低功耗模式,但是又怕定時器的中斷正好發生在cs1237的讀寫過程中,
這樣會打斷時序,造成讀數誤差。
我看了一下我程式主迴圈迴圈一次的用時,大概在0.2s左右,其實這個也能當做乙個基準,因為每次迴圈的時間都是差不多的。
那麼我可以每迴圈一次就進行一次資料對比,每滿足上面的情況就+1,當迴圈計數150次的時候,進入低功耗。否則清零計數。
這樣每次進入低功耗的時間其實都是相差無幾,而且節省了乙個定時器。運用迴圈體本身的時間作為計時標誌。
//下面是關於進入低功耗的判斷
//**發現在沒有收到觸控螢幕的按下時,迴圈一次的時間大致為4s,這樣省去了乙個定時器,避免了中斷
low_power_weight_1 =now_weight;
if((low_power_weight_1 < 1) && ((low_power_weight_1-low_power_weight_2 < 1) || (low_power_weight_2-low_power_weight_1 < 1
)))
else
//重量低於1g並且在40秒內沒有變化,即開始進入低功耗
if(low_power_num >= 80
)
diango專案第二步
django 模板 使用 django.http.httpresponse 來輸出 hello world!該方式將資料與檢視混合在一起,不符合 django 的 mvc 思想。django 的模板是乙個文字,用於分離文件的表現形式和內容。模板應用例項,在 helloworld 目錄底下建立 tem...
python學習第二步
函式的呼叫 以絕對值函式abs 為例,可以直接從python的官方 檢視文件,也可以從互動介面利用help abs 檢視。常用或不好記函式 持續更新 hex 函式 將乙個整數轉換為十六進製制表示的字串。函式的定義 定義乙個函式要使用def語句,函式返回值用return語句返回。ep def my a...
成為ITer的第二步
斷斷續續的補習,對於網管 系統管理的知識算是有了個大概認識。今天小結幾個要點,算是對以前的失誤及現在的更新認識吧。1 選擇乙個主攻方向,太重要了!it行業往細處做真的技術多,而且更新快,說實在的跟不上時代的節奏。不是我不行,而是沒入行,閉門造車 的惡果就是習得一些過時的技術,沒用。得專注,專注在乙個...