10. ünite / 11 · yaklaşık 3 saat
Düşük güç: Sleep, Stop ve Standby
Çalışma, uyku, durdurma ve bekleme kipleri; uyandırma kaynakları; görev döngüsüyle pil ömrü hesabı.
Bu ünitenin sonunda
- STM32'nin düşük güç kiplerini (Sleep, Stop, Standby) neyin açık kaldığına göre ayırt etmek
- Her kip için uyandırma kaynağını (kesme, EXTI, RTC, WKUP pini) seçmek
- Görev döngüsünden ortalama akımı ve pil ömrünü hesaplamak
- Stop'tan uyanınca saat ağacını yeniden kurmanın gerekliliğini açıklamak
Ders notları
Pille çalışan bir sensör düğümü zamanının %99'unu bekleyerek geçirir. O bekleme süresinde ne kadar akım çektiği, pilin günler mi yıllar mı dayanacağını belirler.
- Run: her şey açık; F4 sınıfında birkaç on mA.
- Sleep:
__WFI()ile çekirdek durur, çevre birimleri ve saatler çalışır; herhangi bir kesme uyandırır. Uyanış neredeyse anlıktır. - Stop: tüm yüksek hızlı saatler durur, RAM ve yazmaçlar korunur; EXTI ya da RTC uyandırır. Akım yüz mikroamper düzeyine iner. Uyanınca çekirdek HSI ile başlar: PLL'i yeniden kurmak gerekir.
- Standby: neredeyse her şey kapanır, RAM silinir; yalnız RTC, yedek yazmaçlar ve WKUP pini kalır. Uyanış sıfırlama gibidir, program baştan başlar. Akım birkaç mikroamper.
Hesap
Örnek: her saniye 10 ms ölçüm yapıp kalan sürede Stop'ta bekleyen bir düğüm, sürekli çalışan aynı düğümden onlarca kat uzun yaşar. Ama uyku akımı küçükse, kartın üzerindeki LED, regülatör ve ST-LINK gibi başka tüketiciler baskın hale gelir: ölçüm her zaman multimetreyle karttan yapılır.
Tasarım
Kullanılmayan pinleri analog kipe al (giriş tamponu akım çekmez), kullanılmayan çevre birimlerinin saatini kapat, ölçümleri topla ve tek seferde gönder. Kip seçiminde uyanış süresi ve RAM'in korunup korunmadığı da ödünleşimin parçasıdır.
Simülasyon
Düşük güç kipleri ve pil ömrü
Run, Sleep, Stop ve Standby arasında seç; görev döngüsünü (ne sıklıkla, ne kadar uyanık) ayarla ve ortalama akımla pil ömrünü hesapla. Akımlar ders içi tipik değerlerdir, gerçek değer veri sayfasındadır.
Kendin dene
Güç simülasyonunda 2000 mAh pil, 1 s periyot ve 10 ms uyanık süreyle dört kipi karşılaştır. Run ile Stop arasındaki pil ömrü oranını yaz. Uyanık süreyi 100 ms'ye çıkar: Standby'ın üstünlüğü neden azaldı? Periyodu 10 s yap ve hangi terimin baskın olduğunu açıkla.
Kod
void sleep_seconds(uint32_t s) {
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, s - 1, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); /* 1 Hz saat */
HAL_SuspendTick(); /* SysTick uyandırmasın */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
/* --- burada uyuyoruz; RTC kesmesi uyandırır --- */
SystemClock_Config(); /* uyanınca HSI'deyiz: PLL'i yeniden kur */
HAL_ResumeTick();
HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
}Sık yapılan hatalar
- Stop'tan uyandıktan sonra saati yeniden kurmamak: kod 16 MHz HSI'de devam eder, UART baud ve zamanlamalar bozulur.
- SysTick'i askıya almadan Sleep'e girmek: her 1 ms'de uyanırsın.
- Kullanılmayan pinleri yüzer giriş bırakmak: giriş tamponu akım çeker.
- Akımı yalnız veri sayfasından okumak: karttaki diğer bileşenler uyku akımını katlar.
Yazılım mühendisliği bağlantısı
Güç bir gereksinimdir ve ölçülebilir yazılmalıdır: "2000 mAh ile en az 6 ay".
- Pil bütçesini bir tabloda tut (kip, akım, süre); her yeni özellik bütçeye eklenir.
- Uyku/uyanma geçişini durum makinesi olarak yaz; uyanış nedenini günlüğe kaydet.
Kendini sına
Hangi kipte RAM içeriği korunur ve EXTI ile uyanılır?
Standby'dan uyanınca program nereden devam eder?
Run 20 mA, Stop 0,3 mA. Her 1 s'de 10 ms çalışan düğümün ortalama akımı yaklaşık?
Stop'tan uyandıktan sonra ilk yapılması gereken?