Arkadaşlar Stm32f4 için seri porttanveya usb gibi bir arabirimden gelen veriyi Flash'a yazmak istiyorum. Keilde Stm32f4 için nasıl bootloader yazarım çok zor bir işmidir?
zor bir iş değildir bootloader api lerini inceleyebilirsiniz mantık flash adresini adreslemekten geçiyor daha sonra flash verilerini değiştirmek için ram de koşmanız gerekiyor bu iki işlemi gerçekleştirirseniz kendi bootloaderınızı yazabilirsiniz.
Alıntı yapılan: X-Fi - 29 Temmuz 2013, 08:29:42
zor bir iş değildir bootloader api lerini inceleyebilirsiniz mantık flash adresini adreslemekten geçiyor daha sonra flash verilerini değiştirmek için ram de koşmanız gerekiyor bu iki işlemi gerçekleştirirseniz kendi bootloaderınızı yazabilirsiniz.
dahili bootloader yok mu zaten , bu işi yapan ?
Pei kaynak nereden bulabilirim? :-\
Alıntı yapılan: camby - 29 Temmuz 2013, 08:36:43
dahili bootloader yok mu zaten , bu işi yapan ?
Hocam dahili bootloader var external boot pini ile aktif olan. Ancak diyelimki gprs kontrollü bir sistem kurdunuz. Güncel yazılımı soket üzerinden çekip boot etmek istiyorsunuz. Böyle durumlarda bootloader sistemini kendiniz yazmanız gerekir. Sanıyorum arkadaşın sorduğu soruda bu yönde.
Kaynak için st nin sitesinden application notlara bakınız. Hazır usart bootloader yazılımları mevcut.
Ben kendim yazmak istiyorum. Öğrenmek amaçlı ;D
Hocam eğer öğrenmek istiyorsanız mantığı basit, temel donanımları kullanmayı biliyorsanız (usart, flash gibi) basit bir bootloader yazabilirsiniz.
Öncelikle Flash'ın ilk sektöründe (bilgisayardaki MBR gibi) sizin yazılımınız olacak ve ilk olarak sizin yazılımınız çalıştırılacak. Yazdığınız program öncelikle USART modülünü başlatacak ve hazır olduğunu bildiren bir veri yollayacak. Eğer karşıdan programlama emri gelirse, ki bunu da bilgisayar tarafında yazdığınız program yollayacak, USART üzerinden bloklar halinde program yazılımını alacaksınız. Flash modülünü başlatıp aldığınız programı flash'a yazacaksınız. Eğer USARTta herhangi bir aygıt yoksa veya programlama emri bir gelmemişse önceden yazılımı flasha yazdığınız noktaya programı atlatacaksınız. Bunu C de function pointer ile yapabilirsiniz. Asıl yazılım kendi kendine çalışacaktır. Program yükleme işini bir pine de bağlayabilirsiniz. Eğer çip çalıştığında PA.0 pini lojik 1 ise program alınacak gibi.
İkinci olarak firmware update durumu var. Yani bootloader'ın kendi yazılımını güncellemesi. Burada mantığı kendiniz kurabilirsiniz. Mesela yeni bootloader'ı son sektöre veya ikinci sektöre kaydedersiniz. Açılışta doğrudan ikinci sektöre atlarsınız. Ya da ikinci sektördeki bootloaderı çalıştırırsınız o da kendini ilk sektöre kopyalar.
Kolay gelsin, iyi çalışmalar hocam...
Alıntı yapılan: fatih6761 - 29 Temmuz 2013, 14:47:47
Hocam eğer öğrenmek istiyorsanız mantığı basit, temel donanımları kullanmayı biliyorsanız (usart, flash gibi) basit bir bootloader yazabilirsiniz.
Öncelikle Flash'ın ilk sektöründe (bilgisayardaki MBR gibi) sizin yazılımınız olacak ve ilk olarak sizin yazılımınız çalıştırılacak. Yazdığınız program öncelikle USART modülünü başlatacak ve hazır olduğunu bildiren bir veri yollayacak. Eğer karşıdan programlama emri gelirse, ki bunu da bilgisayar tarafında yazdığınız program yollayacak, USART üzerinden bloklar halinde program yazılımını alacaksınız. Flash modülünü başlatıp aldığınız programı flash'a yazacaksınız. Eğer USARTta herhangi bir aygıt yoksa veya programlama emri bir gelmemişse önceden yazılımı flasha yazdığınız noktaya programı atlatacaksınız. Bunu C de function pointer ile yapabilirsiniz. Asıl yazılım kendi kendine çalışacaktır. Program yükleme işini bir pine de bağlayabilirsiniz. Eğer çip çalıştığında PA.0 pini lojik 1 ise program alınacak gibi.
İkinci olarak firmware update durumu var. Yani bootloader'ın kendi yazılımını güncellemesi. Burada mantığı kendiniz kurabilirsiniz. Mesela yeni bootloader'ı son sektöre veya ikinci sektöre kaydedersiniz. Açılışta doğrudan ikinci sektöre atlarsınız. Ya da ikinci sektördeki bootloaderı çalıştırırsınız o da kendini ilk sektöre kopyalar.
Kolay gelsin, iyi çalışmalar hocam...
İlk önce çok teşekkür ederim sadece 2 noktayı anlamadım
*Verileri nasıl Flash'a yazacağım. Keil kullanıyorum
*Anlatımınızdaki belii bir sektöre atlamayı nasıl yapabilirim.
Saygılar..
@Farukc hocam en kolay yöntem StdPeriph standart kütüphanelerini kullanmak. Orada zaten EraseSector, WriteDoubleWord gibi gerekli temel fonksiyonlar var. Eğer hazır kullanmayacağım derseniz ve ingilizceniz yeterliyse datasheet'leri iyice karıştırmanız gerekiyor. İsterseniz StdPeriph kodunu da inceleyerek kendi fonksiyonlarınızı yazabilirsiniz.
Sektöre atlama işi kolay. Flash bellek zaten adres uzayında. RAM adresi gibi görünüyor diye biliyorum.
Mesela şöyle bir uygulama var:
http://markdingst.blogspot.com/2012/06/make-own-bootloader-for-arm-cortex-m3.html (http://markdingst.blogspot.com/2012/06/make-own-bootloader-for-arm-cortex-m3.html)
Yapılan işlem basit. Dahili flash'a önceden programladığınız kodun adresinden itibaren programın bir sektörünü ram'e kopyalıyorsunuz ve ramdeki kopyaladığınız adrese atlıyorsunuz. Program kendi .text ve .data kısımlarını kendisi rame kopyalayıp devam edecek. Atlama işini Assembly Branch komutlarıyla veya C için function pointer ile yapabilirsiniz.
Türkçe kaynak bulabilmem mümkünmü? :-\
Alıntı yapılan: Farukc - 29 Temmuz 2013, 16:30:00
Türkçe kaynak bulabilmem mümkünmü? :-\
değil.
ancak burada tecrübesini yazan vardır belki. ST'nin tüm kaynakları ingilizce.
Hocam lpc23xx bootloader yazdım epey uğraştırıyor , baştan hex son bin çevir flsah yaz programı oraya dallandır. VS.....
Örnek kod payşabilme imkanı olan varsa bir el atsın?
Veyatta kendi bootloaderini kullanabilirim
https://www.picproje.org/index.php/topic,43551.msg317841.html#msg317841 (https://www.picproje.org/index.php/topic,43551.msg317841.html#msg317841)
Ya ben bu işten hiç anlamdım pes ediyorum dahli bootloader nasıl kullanılıyor.
hocam kusura bakma bootloader nedir biliyorsun dimi ?
O kadarda düşmedik canım. Sorun şuki ingilizcem kötü ve sayfalarca kod görünce gözüm korkuyor.
Örnek kod üzerine odaklanma bu iş bir flash hapis oyunu gibidir öncelikle;
- keil programını iyi kullanman gerekiyor flash adreslemelerini oradan yapacaksın. (scatter dosyası üzerinde durman gerekicek)
- 2 adet proje olacak; daimi bootloader yazılımı ve ana program.
- Vektör adreslerini bootloader yazılımındaki startup dosyası belirler. Çünkü ilk yazılan program odur yüklenecek ana program bu vektör adreslerini kullanır.
- kullanmadığın bir ram adresi bölümlersin.
- ram üzerinde çalışacak fonksiyonları kütüpaneler __RAM olarak tanımlıyor. Bu fonksiyonları içeren .c dosyasını options/memory assignment ile bölümlediğin ram adresine taşımalısın.
- Güncelleme yapmadan önce flash adresini sileceksin. (bu bir flash memory kuralı) Flash yazma silme işlemleri sırasında tüm keslemleri kapatmalısın systick timer dahil.
- yeni yazılımı adreslerine dolduracaksın .hex protekolü kullanırsan adresler her paketin içinde geliyor .s19 da kullanabilirsin ikiside checksum güvenlikli.(fazladan önlem olarak aktarım bitince tüm flashın CRC32 bilgisini alıp karşılaştırabilirsin)
- yazma işlemi bitince bootloaderı tekrar kullanmaması için oluşturduğun giriş anahtarını değiştirip nvic system reset fonksiyonuyla işlemciyi resetlersin.
Bu standart bir yöntem eksi yönleri bootloader kısmını güncelleyemezsiniz ve vektör adreslerini değiştiremezsiniz. Benim kullandığım bir yöntem var oda şöyle flash hafızası geniş işlemcilerde hafızayı 2 ye bölmek. İlk kısmı main diğer kısmı buffer olarak kullanmak. Güncellenecek yazılım önce buffer kısmına doldurulur, kontrol edilir. Doğru ise ram e atlayıp ana programı silip buffer'ı main bölümüne kopyalıyorum. Bootloader da ana programın içinde bulunduğu için tek proje üzerinden yürüyorsunuz vektörler de sabit kalıyor.
Bilgiler sana dağınık gelebilir sistem biraz karmaşık çalışıyor. Sadece kod kopyalamak yeterli değil. Böyle bir iş yapılacaksa çok araştıracaksın demektir. Elimden gelen bu kadar ben kod vermem ama yardımcı olmaya çalışırım.
Kolay gelsin.
:-\ Kfam karıştı. iyice tırstım ben bu işten dahili bootloader nasıl kullanılıyor?
işlemciyi usart1 veya usb yoluyla bilgisayara bağla boot0 pinini 1 e çekip işlemciyi resetle cihaz dfu modunda başlar.
Dfuse demonstration yazılımıyla programı yüklersin youtube da örnekleri var.
Teşekkkürler ;D