STM32 In Application Programming/Bootloader Hakkinda

Başlatan Sepiroth, 22 Kasım 2011, 21:19:50

Sepiroth

merhabalar, merak ettigim bir konu var:)
Ileride kendi yaptigim projelerde kullanmak icin kullanacagim islemcide (suan icin STM32 Cortex M3 serisinden biri gozukuyor, baska islemciler de olabilir PIC/Atmel/Allah ne verdiyse:) ) calisma aninda yazilimi update etmek istiyorum. Cogu CortexM3 bootloader ile geliyor, ama benim merak ettigim kendime ait bir bootloader nasil yazilir?
Kisa ve oz olarak sunu yapmak istiyorum;
Alet calisirken eger ana islemciden update vs. mesaj geldiginde harici olarak baglayacagim SPI flash'ina gonderecegim binary dosyasini yazsin.
Eger CRC vs. dogru gelmis ise kendini bootloader'a reset edip bu spi flash'tan yeni yazilimi kendi uzerine yazsin.

Kisacasi basit bir bootloader/IAP nasil yazilir, yontemi nedir meraklar icerisindeyim:) ozellikle @bunalmis hocam'dan inciler bekleriz:)
Either you feel it, or not...

MC_Skywalker

NXP nin LPC1700 serisi için AN11071 - In-Application Programming for the LPC1700 (v.1.0) adında uygulama notu var. belki yardımcı olur.

http://www.nxp.com/documents/software/AN11071.zip

Sepiroth

merhaba, link icin tesekkurler, detayli olmasada biraz bakma firsatim oldu. STM32'nin kendi app. notelarina da baktim, tabi olaya akil almaz hakim olamadigimiz icin biraz fransiz kaldim:) nette biraz gezinmem sonucu sanirim baya bir ayar cekmek gerekiyormus, interrupt vector tablolarina, vs vs..
Bu isleri denemis biri aslinda bootloader-101 gibi bir yazi hazirlasa, raki balik benden valla:)
Either you feel it, or not...

elektrotasarim

STM32'yi USB üzerinden boot etmekle ilgili linkteki uygulamayı yapmıştım. Sizin bahsettiğiniz gibi çalışma anında değil de ilk enerji verildiğinde buton kontrolüyle (ya normal çalışma moduna ya da yükleme moduna dallanarak) çalışan bir uygulama. Belki işinize yarayabilir.
http://blog.elektrotasarim.com/?p=204

Sepiroth

@elektrotasarim, link için teşekkürler:)
aslında bootloader'a alan pini bir şekilde kullanıcı programından sabitleyebilirsem bootloader'a asıl programamdan erişmem mümkün olur diye düşünüyorum, bootloader'dan da çıkarken o pini vs. neyse artık resetlerim.. ama işlemci reset yiyince her türlü port bilgileri gidiyor, bunu engellemenin bir yolu varmıdır? (yazılımsal veya donanımsal olarak)
Either you feel it, or not...

Erol YILMAZ

ST ve NXP nin bootloader konusunda yazılmış birçok uygulama notu var.
Bunlar incelenmeli, hatta nette Bootloader nasıl tasarlanır diye uygulama notları görmüştüm...

Sepiroth

@Allegro hocam, ST'nin bazı uygulama notlarını inceledim, küçük notlarımı da aldım:) nette gördüğünüz o uygulama notlarını hatırlıyorsanız linklerini verebilmeniz mümkün müdür?
Either you feel it, or not...


Sepiroth

merhabalar,
STM32F2xx serisi icin yazilmis UART bootloaderin kodlarini inceliyordum, soyle bir kod'a denk geldim:

/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
    if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    { 
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
      Jump_To_Application = (pFunction) JumpAddress;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
      Jump_To_Application();
    }


C bilgim iyidir, ama cokta muazzam degil maalesef, yukaridaki kodda anlamadigim bir kac yer var;
*(__IO uint32_t*) (APPLICATION_ADDRESS + 4); > type cast mi yapilmakta?
Bir de __IO tam olarak nedir, bu tarz (__set_MSP(.. vs) tanimlari nerden bulabilirim?

Bootloaderin kodlari asagidaki linkte yer almaktadir;
http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f2xx_usart_fw.zip
Either you feel it, or not...

sakkan

kodda senin daha önceden belirttiğin bir adrese(user applicationa) zıplıyor. Bunu yapmadan önce de stack pointerı ve zıplayacağı adresi ayarlıyor. Ben STM32 de CAN bootloader yapmıştım UART bootloader kodlarını kullanarak. Yanlız genelde önce bootloader kodu çalışıyor sonra user application a geçiş yapılıyor. Ben tam tersini yapmıştım. Önce user application başlıyor sonra belli bir mesaj aldıktan sonra bootloader moduna giriyor. Bir de STM32 nin bir serisinde(connectivity line sanırım) gömülü bootloader kodları var işlemci üzerinde uart can ve usb için. Start da donanımda bir pini kontrol edip bootloader koduna zıplıyor. kod yazmanıza gerek kalmıyor bootloader için.

Sepiroth

cvplar icin tesekkurler, aydinlatici oldu baya:) aslinda benim yapacagim uygulama tam bi bootloader degil, normal user app.e bir msj geldimi spi flashindan firmwareini yazacak o kdr.. Gomulu bootloadera baktim baya, ama disardan bir pin kontrol etmesi beni sikintiya sokuyor, cunku o pinleri kontrol edecek ayri bir islemci yok:)
peki kendi bootloaderimizi yazarken, linker'da ve user applicationda yapmamiz gereken degisikler tam olarak nedir? App. note'da NVIC table adresi ile flash program adresini degistirin yaziyor sadece, sadece bu ikisi yetiyor mu? Hatta ben direk USART bootloader kodunu, SPI flashdan okuyacak sekilde modifiye etsem calisir mi? User app'da startup dosyasinda tanimliyoruz dimi program adresi ve vektor tablosu adresini?
Either you feel it, or not...

sakkan

ilk çalışacak program user application ise user application içinde sadece bootloader a zıplama rutinini eklemen yeterli. bootloader yazılımını flash memorynin sonuna koyacağını düşünerekten bootloader yazılımda vector offsetini ve hangi adrese yazılacağını ayarlaman yeterli oluyor.  Uzaktan hiç bir müdahele olmadan kodunu değiştirmek istiyorsan zaten ilk çalışan program user application olmalı. user application belli bir mesaj aldığında bootloader a zıplamalı.

Sepiroth

simdi benim app. note'larda anladigim bootloader 0x80000000'e yerlesiyor. sonra user app'da 0x80004000 gibi bir yere yerlesiyor. once user app. calisacaksa bunun tam tersi gibi bir durum mu soz konusu?
bir de google amcada arama yaparken bi yerde rastladim, bootloader dan veya bootloadera jump yaparken eleman tum cevre birimlerini deinit yapmadiginda alet sacmaliyormus, sizin boyle bir deneyiminiz oldumu?
bir de eger mumkun ise programlari nereye nasil yerlestirmem gerektigi ve algoritma hakkinda pseudo code tarzinda ornekler verebilirmisiniz?
Either you feel it, or not...