Stm32 veya Stm8 Bootloader

Başlatan yldzelektronik, 13 Mayıs 2015, 15:50:58

yldzelektronik

Merhabalar,

Stm32f veya Stm32l serisi için yada Stm8 serisi için bootloader konusunu araştırıyorum.

Gördüğüm kadarıyla genel olarak kullanılan yapı aynı.Ancak herhangi bir kod örneği henüz bulamadım.

Projelerinizde bootloader kullanıyor musunuz?

Bu denetleyici serilerinden herhangi birinde yaptığınız ve örnek olarak paylaşabileceğiniz kod var mı?

Konuyla ilgili malumatlarınızı paylaşır mısınız?

Not: Konuyu anlatan doküman buldum.Ancak henüz kod bulamadım.Yani bootloader için gerekli kodları bulamadım.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

X-Fi

Hocam içerisinde zaten kendi bootloaderı mevcut değilmi siz nasıl bir kod arıyorsunuz.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

yldzelektronik

Birkaç gündür dokümanlara bakıyordum da sanırım hatalı yöntem izliyorum.Mevzu şöyle;

Spi ile haberleşen bir rf modül var.Bu modülü kullanarak cihazları master slave şeklinde yapı oluşturup çalıştırmak istiyorum.Ancak cihazlar öyle yerde olacak ki sökmek sökmemekten daha iyi.O yüzden bootloader kullanmak istiyorum.

Aklıma gelen şey şu oldu;

Eğer master tarafta broad cast bir yayın yapıp aynı anda bütün cihazlara yüklemek istediğim programı gönderebilirsem harika olur.Ama tek tek de master taraftan rf üzerinden gönderedebilirim.

Şimdi hal böyle iken aklıma ilk gelen spi bootloader kullanmak oldu.Ama sanırım hatalı yol izledik.Sonuçta spi bootloader olduğunda yazılımı güncelleyecek mcuya spi ile bağlı olmalı.

Galiba benim ihtiyacım olan farklı.

Çok mu karıştırdım?Acelem olduğundan net ifade edememiş olabilirim.

Anlaşılır oldum mu :(
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

X-Fi

Kendi bootloader sisteminizi kurmak istiyorsanız hazır API ler sizin işinizi görmez,

önce güvenli bir RF protekol ile veri aktarımı yapmanız lazım sonra flash okuma yazma rutinlerini kullanarak bootloader tasarlayacaksınız.
örnek olarak size gerekli olan fonksiyonlar std library de var;

flash_if.c
stm32xxx_flash.c
stm32xxx_flash_ramfunc.c

yukarıdaki kütüpaneleri bulup inceleyin kendinize bir RF bootloader yazmanız için gerekli olan tüm fonksiyonlar içerisinde mevcut.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

yldzelektronik

Alıntı yapılan: X-Fi - 13 Mayıs 2015, 16:33:22
Kendi bootloader sisteminizi kurmak istiyorsanız hazır API ler sizin işinizi görmez,

önce güvenli bir RF protekol ile veri aktarımı yapmanız lazım sonra flash okuma yazma rutinlerini kullanarak bootloader tasarlayacaksınız.
örnek olarak size gerekli olan fonksiyonlar std library de var;

flash_if.c
stm32xxx_flash.c
stm32xxx_flash_ramfunc.c

yukarıdaki kütüpaneleri bulup inceleyin kendinize bir RF bootloader yazmanız için gerekli olan tüm fonksiyonlar içerisinde mevcut.

Teşekkürler.

Peki güvenli RF protokollerine verebileceğin örnekler var mı, kastın tam olarak nedir?Rf konusuna çok yabancıyım.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

X-Fi

RF konusunda yabancı isen Zigbee protokolünde modul kullanmanı öneririm. Hem kolay, hem güvenilir, hemde hazır bir sistem.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

yldzelektronik

#6
Alıntı yapılan: X-Fi - 13 Mayıs 2015, 16:58:54
RF konusunda yabancı isen Zigbee protokolünde modul kullanmanı öneririm. Hem kolay, hem güvenilir, hemde hazır bir sistem.

Çok pahalı.

mesaj birleştirme:: 13 Mayıs 2015, 17:14:43

Eğer kendi bootloader kodumu hazırlayacaksam sanırım iki farklı programa ihtiyacım olacak.Yani Flashda birbirinden bağımsız olacak şekilde iki farklı program yer alacak.Biri user program, diğeri boot loader program.Doğru mu?

Flashın son adresinden itibaren bootloaderi konumlandırmak mı mantıklı, ilk adresinden itibaren mi?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

z

Bootloaderı flasın sonuna koyarsan kim çalıştıracak onu?

Mecburen reset vektörüyle başlatacaksın. Yanı en basta olacak.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yldzelektronik

Alıntı yapılan: z - 13 Mayıs 2015, 19:18:31
Bootloaderı flasın sonuna koyarsan kim çalıştıracak onu?

Mecburen reset vektörüyle başlatacaksın. Yanı en basta olacak.

Abi ben bootloaderi boot esnasında çalıştırmak istemiyorum ki.Normal çalışma anında rf modülden alınan veri belli bir yapıda ise bootloader programı çalışsın istiyorum.Cihazların çalışacağı yerde butonuna vs basma imkanım yok.Hiç müdahele edemeyeceğim bir yer neredeyse.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

X-Fi

#9
Bootloader kodu romda başa koymak sona koymak diye birşey sözkonusu bile değil. Bu ayarı startup dosyası içerisinde reset vektörünü yönlendirerek zaten yapıyorsunuz. Eğerki ARM dan bahsediyorsak isterse external hafızada bile bootloader koşar.

Standart bootloaderlar Z'nin söylediği yöntemde çalışıyor ve harici ayrı bir program memory kullanıyor.

Sizin istediğiniz bootloader ı yazılıma entegre etmek ise o daha kolay ancak bu durumda bir buffer gerekiyor. Çözüm olarak eeprom yada  flash memory kullanılabilir.

Bir diğer çözümde şudur işlemcinin flash hafızası kullandığınız alanın 2 katından büyük ise o zaman rom'u 2 bank a ayırıp, RF ile alınan programı bu alanda saklayabilirsiniz.

Bir şekilde RF ile yeni yazılımı aldınız, depoladınız ve kontrol ettiniz herşey doğru ise işlemciyi ram de koşturmaya başlayıp program yüklenecek rom hafızayı önce siliyorsunuz daha sonra bufferdaki alınan programı yerine yazıyorsunuz.

Bu işlemleri yapacak fonksiyonalr ram üzerinde tutulmalı.

son verdiğim "stm32xxx_flash_ramfunc.c" yardımcı kütüpanesi bu işlemler için yazılmış. keşke inceleseydiniz.

Anlattığım sistemde bootloader kodu sabit biryerde olmuyor ve yazılım ile birlikte güncellenebiliyor. Ayrıca değiştirilebilir olması size standart bootloaderlara göre daha güvenli bir sistem tasarlama imkanı da veriyor.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

yldzelektronik

@X-FI

Önceki mesajında belirttiğin dosyaları flash_if.c olanı hariç söylediğinde incelemiştim.O da Stm32l0 da kütüphane içinde yoktu.Stm32f10x serisinden birisi için nette bulduğumu incelemiştim.Keşke bilmeden yargılamasaydın.

Bootloader tarafıyla ilgili daha önce picte incelemiştim.Minik denemelerim olmuştu.Onlarda bootloaderi flashın başına yada sonuna koymak gibi durumlar vardı.St için bu geçerli değil evet.

Ama sanırım benim burada ihtiyacım olan standarttan farklı?Boot1 pinine müdahele edilebildiğinde kendi boot moda giriyor da benim öyle bir durumum yok.

Şimdi sistem kalem pille çalışacağından enerji kesilmelerinde en kötü ihtimalle boot kodu korumak istiyorum.Bu sebeple kendi yazacağım bootloaderi flashın bir yerinde tutmak zorundayım.

Ama işin farklı tarafı ben bootloaderin resetten sonra değil normal çalışma esnasında çalışmasını istiyorum.Veya normal çalışma esnasında bootcode update talebi olursa bir flag set edip resete gidip resetten sonra boot code içinde o flagın durumuna göre jump user code yada update user code yapabilirim.

Ama işte kafam biraz karışık.Bilgi kirliliği var.Elimdeki düzen şu şekilde;

Kalem pil ile enerjilendirdiğim (5-6 v falan) kartlar sahada hiç müdahele etmek istemeyeceğim yerdeler.Örneğin tarla düşünün.Üzüm tarlası.Tarlada farklı yerlerde toprakta duruyorlar.Bu cihazlarda sensörler var.Sürekli ölçüm yapıp küçük hesap yapıp hesap sonuçlarını gönderecekler.Bir master cihaz ile bütün sensörlerden (100- 150 adet falan) sırayla verileri isteyerek topluyor.

Programı henüz bitirmediğimden arada güncellemek istiyorum.Cihazlar tarlada olduğundan gidip butona basmam falan mümkün değil.

Slave cihazlar normal çalışırken ya broad cast yayın ile yada tek tek her cihaz için yeni kodu güncellemek istiyorum.

Sizin önerileriniz neler?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

X-Fi

Yukarıda anlattığım sistem önerisi hala geçerli yaklaşık 3 yıldır RF okumalı su sayaçlarında wMBus üzerinden, GPRS okumalı kuyu sayaçlarınıda FTP üzerinden güncelleme yapıyorum. İki üründe pil ile çalışıyor yanına gitmiyoruz tuşa falan basmıyoruz.

Yapmak istediklerinizi önce kafanızda net olarak kararlaştırdıktan sonra işe koyulmalısınız iyi çalışmalar.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

mdargut

STM32f0 da uart üzerinden dahili bootloaderı kullandım. Çalışma esnasında boot komutu gelince bir tranzistör ile boot pinine bağlı kapasiteyi şarj edip hemen akabinde reset komutu ile resetliyorum. Kapasite boşalmadığı için boot moda giriyor. Bende STMnin programı ile uarttan yazılımı güncelliyorum. Gerçi bu devreyi sahada uzun süreli kullanmadım henüz. Bir sıkıntı çıkarır mı bilmiyorum.

X-Fi

#13
Alıntı yapılan: kim - 14 Mayıs 2015, 11:39:37
STM32f0 da uart üzerinden dahili bootloaderı kullandım. Çalışma esnasında boot komutu gelince bir tranzistör ile boot pinine bağlı kapasiteyi şarj edip hemen akabinde reset komutu ile resetliyorum. Kapasite boşalmadığı için boot moda giriyor. Bende STMnin programı ile uarttan yazılımı güncelliyorum. Gerçi bu devreyi sahada uzun süreli kullanmadım henüz. Bir sıkıntı çıkarır mı bilmiyorum.

Kullandığınız yöntem pratik ama çok sağlıklı değil. Doğru olan bootloader koda user program içerisinden jump yapılması olacaktır. Onuda şöyle yapıyoruz;

Bir backup register işaretlenerek işlemci resetlersiniz. Reset sonrası bu registerı koşullayıp flashda 1FFFxxxx adresindeki IAP bootloader programını başlatabilirsiniz.

Ben bu şekilde USB DFU bootloader'ı başlatıyorum sorunsuz çalışıyor.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

mdargut

Evet haklısınız. Heleki RF üzerinden yazılım güncellenecekse en ufak bir hata bütün yazılımı işlevsiz hale getirecektir. Sonuçta bir kontrol işlemi yapılmıyor bu yöntemle. O zamanlar pek uğraşamamıştım bu konu ile, ilk fırsatta bahsettiğiniz yöntemi deneyeceğim.