STM32L152 DFU ve Low Power Run Modlarının Testi
Bu yazımda Cortex-M3 ailesinde yeni geliştirilen ve düşük güç tüketimi sağlayan işlemciler hakkında kısaca bilgi vermek istedim.
Aslında 32 bit Cortex-M serisi işlemciler içerisinde en yeni ve en az güç tüketen seri M0 ve M0+ serileridir. Ben elimde olduğu ve üzerine çalıştığım için ST firmasının M3 serisi STM32L152RD işlemcisi ile denemeler yapacağım.
Bu yazıda sabit DFU (Device Firmware Update) özelliği sayesinde USB üzerinden yazılım güncelleme ve içerisindeki MSI (Middle speed OSC) düşük güç tüketen osilatörü ile çalışma akımlarını ve stop modundaki akım değerlerini göreceksiniz.
İşlemciyi tanıyalım;
STM32L152RD Cortex M3 core, 32Mhz(33DMIPS), 384KBbyte Flash ve 48Kbyte Ram bölgesine sahip, bunların yanı sıra dahili 12Kbyte da EEPROM bölgesi adreslenmiş durumda. üzerinde RTC, Custom LCD, MSI Osc ve USB donanımı var. USB donanımı dahili 16MHz HSI osilatörüyle kullanılabiliyor. Host olarak çalışabiliyor. Böylece USB haberleşmesi maliyetli zor bir donanım olmaktan çıkmış durumda, ileride bununla ilgili birkaç uygulama yayınlayabilirim. Ben bu uygulamada çipi 64 pin LQFN kılıf kullandım.
Kitimizi tanıyalım;
Expkits den aldığım header board’u değerlendirip kit oluşturdum. Amaç düşük güç kontrolünü kaybetmeden ilerlemek olduğunda ben genelde az eleman barındıran kitler tercih ediyorum, durum böyle olunca kendim uğraşıp program atılacak, haberleşilecek ve pinleri rahatca kullanılabilecek bir kit oluşturdum. Üzerine delikli plaketten donanımlar ekleyerek çalışacağım.
Düşük maliyetli ve kullanışlı olması size ilginç gelebilir 🙂
Kit üzerindeki kristallerin yük kapasiteleri yok zaten MSI kullanacağım için sorun değil. Resimden de görüldüğü gibi as close as possible metoduna uymaya çalıştım.
LSE kristalin bağlantısı;
Kit arka yüzün görüntüsü;
USB kablosu takıldığında işlemcinin USB voltajıyla çalışmasını sağlamak için bir LDO regulatör kullandım. Bu regulatör 200mA akım verebiliyor sabit akımı 1uA den az. Bu regulatör ile USB portundan besleme sağlayıp yine low power olarak kullanılabilirim. Tantal kondansetör beslemeyi filtreliyor MCU VDD, VSS pinlerinde birer 100nf dekublaj kondansetörleri var. Önemli bir nokta işlemcinin 4 dijital besleme girişi, 1 adet analog besleme girişi var analog belseme Core, PLL ve ADC için kullanılıyor. Ben kiti kolaylaştırmak için dijital beslemenin sadece bir çiftine gerilim verdim, diğerleri boşta bıraktım. Bu haliyle tam fonksiyon kullanabiliyorsunuz ancak, pcb tasarımında tüm beslemelerin bağlanıp filtrelenmesi EMC bağışıklığını arttıracaktır.
Bağlantı Şeması;
Bu kit üzerindeki ilk uygulamamızın bağlantı şemasına buradan ulaşabilirsiniz.
Güç Modları Test Programı Kaynak Kodu;
STM32L-DFU-LP-Tester.rar
Kit ile Low Power run modunu ve en düşük enerji tüketebildiğimiz STOP modu test ettiğimiz uygulama kaynak kodlarına yukarıdan ulaşabilirsiniz. Bu projede işlemcinin MSI kristalini adım adım yavaşlatarak düşük güçte çalışırken çekilen akımları kaydettim. Ayrıca STOP modda iken RTC yi hem LSI hem LSE kristal ile çalıştırarak akım değişikliklerini gösterdim. Programda IWDT çalıştırılıyor testler boyunca da açık idi. Programın main döngüsü aşağıda görülmektedir.
int main(void) { RCC_ClocksTypeDef RCC_Clocks; /* IWDT Counter initialize */ IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(IWDG_Prescaler_256); IWDG_SetReload(0xFFFF); // Periyodu 30sn IWDG_ReloadCounter(); IWDG_Enable(); /* Enable the PWR APB1 Clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); RCC_GetClocksFreq(&RCC_Clocks); if (SysTick_Config(RCC_Clocks.HCLK_Frequency / 100)) { for (;;) { } } Set_Lp_Gpio(); Buton_Interrupt_Init(); Mod=1; while(1) { if(Mod!=Mod_h) { Mod_h=Mod; IWDG_ReloadCounter(); switch(Mod) { case 1: { // 4.194 MHz (~1456 uA) RCC_MSIRangeConfig(RCC_MSIRange_6); break; } case 2: { // 2.097 MHz (~721 uA) RCC_MSIRangeConfig(RCC_MSIRange_5); break; } case 3: { // 1.048 MHz (~373 uA) RCC_MSIRangeConfig(RCC_MSIRange_4); break; } case 4: { // 524.288 Khz (~202 uA) RCC_MSIRangeConfig(RCC_MSIRange_3); break; } case 5: { // 262.144 Khz (~117 uA) RCC_MSIRangeConfig(RCC_MSIRange_2); break; } case 6: { // 131.072 Khz (~69 uA) RCC_MSIRangeConfig(RCC_MSIRange_1); break; } case 7: { // 65.536 Khz (~51 uA) RCC_MSIRangeConfig(RCC_MSIRange_0); break; } case 8: { // STOP with LSE RTC (~1.97 uA) Rtc_Init_LSE(); PWR_ClearFlag(PWR_FLAG_WU); PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); break; } case 9: { // STOP with LSI RTC (~1.57 uA) Rtc_Init_LSI(); PWR_ClearFlag(PWR_FLAG_WU); PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); break; } case 10:{ // STOP without RTC (~1.17 uA) RCC_RTCCLKCmd(DISABLE); PWR_ClearFlag(PWR_FLAG_WU); PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); Mod=1; break; } } } } }//void main
130nm teknolojisiyle üretilen cortex M3 serisi bir işlemcinin ~3uA sınırında RTC ile beraber çalışabilmesi ve 23 adet exti line kesmesi sayesinde farklı farklı tüm pinlerden uyanabilmesi, RTC Alarm, Wakeup timer,Comparator, gibi birimlerle uyanabilmesi pekçok pilli uygulamada kullanılmasını sağlıyor. Tabiki bazı eksi yönleri var Usart Rx kesmesi ile STOP moddan uyanamıyor. Bu durum usart haberleşmesini STOP modda askıya almak demek. Ben bu konuyu Usart Rx pinine kesme kurarak çözdüm başka bir yazımda bu konuya da değineceğim.
Bu modlar dışında uygulamaya eklemediğim ST-BY modu var. Ben bu moda dead-mod diyorum. Çünkü MCU ram hafızasını saklamıyor. Bu moddan çıktığında sadece kaldığı adres vektöründen devam edebiliyor. Kendimce pek kullanışlı olmadığı için test etme gereği duymadım. ST-BY modun bu eksik yönüne çözüm olarak RTC Backup adresleri RAM görevinde kullanılabilir. STOP mod akımları sizin için yeterliyse fazladan iş yüküne gerek yok.
Projenin derlendikten sonra DFU ile işlemciye yükleme aşamasına geçmeden önce yapılması gereken son bir işlem var oda *.dfu dosyasının oluşturulması. DfuSe yazılımıyla gelen DFU file Manager isimli çevirici programda bu dosyayı oluşturmak münmkün. Bunun için Intel’in protokolü*.hex veya Motorola’nın protekolü olan*.s19 derlenmiş çıktısına ihtiyaç var.
Bu işlemin şöyle bir kolay yolu var projenin dosyalarına bin2dfu.exe yamasınını ekledikten sonra Keil’in kurulumu ile gelen fromelf.exe yi kullanarak önce *.bin çıktısını elde ediyoruz. Daha sonra *.bin dosyasından bin2dfu.exe yaması ile *.dfu dosyasını oluşturabiliyoruz. Tabi bu işlemleri aşağıda gördüğünüz Keil / Options / User sekmesi içinde bulunan Run user program after build kısmına yaptırıyoruz. Her derlemeden sonra *.dfu çıktısı objectlerimize eklenmiş oluyor.
Gerekli ayarlar bu projede yapılı. Aşağıdaki komut satırından User command #1 de görüldüğü gibi önce binary daha sonra Command #2 satırında görüldüğü gibi dfu dosyası uygulamaları çalıştırılıyor. Sonraki satırdan da dfu dosyasının oluştuğunu boyutunu ve başlangıç adresini okuyoruz.
DFU dosyamızı ve projemizi hazırladığımıza göre artık DFU ile USB den kitimize program yükleme işlemine geçebiliriz.
MCU Bootloader donanımı Hakkında bilmemiz gerekenler;
İşlemci donanımında Usart ve USB(DFU) olmak üzere 2 adet dahili bootloader sistemi var.(Bazı çiplerde CAN bootloader mevcut ancak bizim çipimizde yok) Bootloader 0x1FF0 0000 adresinden itibaren hafızada 4 Kbyte yer tutuyor ve silinemiyor. Buradaki hazır Bootloader API’sini çalıştırarak işlemciyi programlıyoruz. Bu konudaki kaynağı buradan açabilirsiniz. System Memory’e giriş için aşağıdaki tabloda nasıl bir yol izleneceği anlatılmış. Tabloyu CPU Halted yapmadan bizi Sytem Memorye götürecek şekilde takip ediyoruz. BOOT-0 ve BOOT-1 pin durumları önemli. Bu pinleri ayarlayıp donanımsal reset yada enerjiyi kesip tekrar enerjilendirmemiz gerekiyor.
Yukarıdaki tabloda Options bitlerinin düzenide yer almış, BFB2 biti “0” ise banklarda kod yüklü olup olmaması durumuna göre System Memory erişimini etkiliyor. BFB2 bitinin asıl görevi reset sonrası program counter’ı bank2 ye yönlendirebilmektir. Bu özellik bootloader tabanlı projelerde kullanılabiliyor. Options bitleri kodun içinden veya ST-link Utility yazılımı sayesinde değiştirebiliyoruz. Bir bilgi vereyim düzenlemeyi J-link yazılımı olan FLASH-ARM desteklemiyor. Kod dışından işlem yapmak için elinizin altında bir adet st-link bulunması gerekiyor. Ayrıca protection level2 set edilirse işlemciyi birdaha debug yapamıyorsunuz. Bu ayarlar ile uğraşırken dikkatli olunuz.
Yukarıdaki tabloyu bootloader birimleri için donanım gereksinimlerini anlatmakta. Biz Usart bağlantılı olanı değil, USB olanını kullanacağız yani DFU’yu. DFU modülünün USART’dan farkı harici bir kristale ihtiyaç duymasıdır. Normalde kodlarımızda dahili HSI ile USB clock üretip USB arabirimini kullanabiliyoruz. Ancak tablodada görüleceği gibi DFU için HSE kristal zorunlu kılınmış ve takmanız gereken kristal aralıkları belirlenmiş; “2,3,4,6,8,12,16,24” Mhz. Ben kit üzerinde HSE kristalini header pinlere taktığım için olabildiğince küçük seçtim bu sebeple elimdeki küçük krsital olan 4MHz kristal ile DFU testlerini yapıyorum. DFU dışında HSE kristali kullanmıyorum.
Yukarıda gösterildiği gibi options bitleri default başlarsa sadece Boot-0 pini “1”ve boot-1 pini “0” yapılır resetlenir ise DFU başlatılacak demektir.
USB Bağlantısı;
Kolları sıvadık, aşağıdaki resimde görüldüğü gibi Boot1 pini “0” da, Usart1-RX(PA10) pini “1” de tutup Usart bootloader’ı atlamasını, DFU yazılımının başlamasını sağladım. (eğer 104 pin işlemci takarsanız USART2-RX(PD6) pinini de “1” de tutunuz ) Sırasıyla Boot-0 butonuna basarak pini ‘1″ e çekiyorum ve USB kablosunu kite bağlıyorum. Kit enerjileniyor ve bigisayar donanım değişikliklerini tarayıp DFU driverını otomatik yüklüyor. Herşey yolunda gitti mı?
Öyleyse bilgisayarınız cihazı “STM Device in DFU Mode” olarak Aygıt yöneticisinde görmesi lazım. Vendor ID’si 0x0483. Cihaz bulunduysa bağlantısı doğru olarak yapılmış demektir.
DfuSe Programı ile Yazılım yükleme;
Bu adresten DFU son versiyon programı indirip kuruyoruz. DfuSe Demo yazılımını çalıştırıyoruz karşımıza aşağıdaki ekran geliyor;
Yukarıda DFU devices kısmında cihazınızı bulmuş olduğunu test etmiş oluyoruz. Choose butonuna tıklayıp output.dfu dosyasını programa çağırıyoruz.
Upgrade tuşuna tıklayarak programı işlemciye gönderiyoruz. İstenirse Verifty after download çentiği seçilip kod doğrulaması da yaptırabilirsiniz.
İşlemcinin silinmesini ve programın yüklenmesini bekliyoruz.
Upgrade successfly mesajını gördüysek program yükleme tamamlanmış demektir. Quit veya Leave DFU mod diyerek DFU yu kapatabiliriz.
Yukarıdaki ekrandan yükleme sırasında bir hata oluştuğunu görüyoruz. Yükleme hataları DFU’ya zarar vermez. Buradaki hata bağlantı kesildiği için verildi. Tekrar bağlanıp yazılımı yeniden yükleyebilirsiniz.
Sonuç;
Genel olarak STM32L152RD hakkında görüşlerim olumlu yönde avantajlarına gelecek olursak ARM ailesinde bilindik yeniliklerin dışındaki artıları ve eksileri şöyledir;
Artilari;
– Büyük flash hafızası olması avantajı yazılım geliştirirken memory hafızasında log tutma veya yazılımsal bootloaderlar da ayrık tampon memory kullanmak için yeterli seviyede.
– HSI 16Mhz internal clock ile USB haberleşmesi yapılabilmesi.
– Donanımsal RTC sayaç registerları.
– Max 32Mhz (33.3 DMIPS) hızında işlem clock seviyesi diğer F serilerine göre geride kalsa da amaç düşük güç tüketimi olduğundan bu hız sınırı normal buluyorum.
– MSI kristali ve fabrika kalibrasyonu. Ayrıca dahili sıcaklık sensörü ve opamplar da fabrika kalibrasyonlu geliyor.
– 12 Kbyte EEprom hafızası bulunması.
Eksileri;
– STOP moddan Usart kesmesi ile uyanmıyor.
– SWD bağlantısını LP için kesmek gerekiyor. PA14-PA13 pinlerini analog input olarak ayarlamazsanız SWD detect çalışıyor ve fazladan 200uA akım tüketyor.
– PA13-PA14 pinlerini bir kez kurarsanız daha sonra program içerisinden SWD modunu aktif edemiyorsunuz. Resetleyip SWD bağlantısı kurabiliyorsunuz.
– STOP moda girildiğinde SWD bağlantısı kesiliyor ve 1 sn sonra IDE debug modundan çıkıyor.
– ADC ölçümü yapabilmek için HSI 16 MHz kristalin veya HSE kristalin çalıştırılması gerekiyor. Uygulamaya göre ölçüm yapmadan önce çalıştırıp, ölçüm bitince kapatmanız gerekebilir buda fazladan işlem yükü, zaman ve akım harcamak demek oluyor.
– Options bitlerini yazılımla değiştirdiğinizde işlemci resetlenip yeniden başlıyor. Reset atmasaydı daha akıcı kod yazılabilirdi.
Uygulama Videosu;
Bu yazımı da video ile sonlandırıyorum. Videoda kit harici bir kaynaktan besleyip çalışma modlarını PA0 butonuyla değiştirerek akım değişikliklerini göstermeye çalıştım.
[tube]http://www.youtube.com/watch?v=Sm6sRce-rC0[/tube]
Herkese iyi çalışmalar yeni teknolojilerde görüşmek üzere…
Çok güzel bir inceleme olmuş, teşekkür ediyoruz.