Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: gokhangokcen - 26 Ekim 2020, 13:55:48

Başlık: Uzaktan yazılım güncelleme
Gönderen: gokhangokcen - 26 Ekim 2020, 13:55:48
Merhabalar, günümüzün gelişen teknolojisi ile artık yaptığımız kartlar, ürünler yeri geliyor dünyanın öbür ucuna kadar ulaşıyor. Merak ettiğim konu sizin de başınıza gelmiştir muhakkak. Yaptığınız bir üründe hata/sıkıntılı bir durum sezdiniz ya da kullanıcı farklı bir değişiklik istedi. Bu durumun üstesinden gelmek için neler yapıyorsunuz?

Son zamanlarda benimde oldukça ihtiyaç duyduğum konu biraz bu konu üzerine eğilmek istiyorum. Ethernet üzerinden mi yoksa bir sd kart ile mi ya da rs232 bağla bir bilgisayara uzaktan bağlanıp yazılım mı güncelliyorsunuz? Neler yapılabilir? Fikirlerinizi bekliyorum.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: triyak - 26 Ekim 2020, 14:14:28
Artık birçok işlemcinin usb desteği var, biz usb kullanıyoruz. Cihaz ilk açılışta usb bellekteki yazılımı kontrol ediyor eğer usbde daha yüksek versiyonlu yazılım varsa onu yükleyip öyle çalışmaya başlıyor.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: bsenguler - 26 Ekim 2020, 15:54:23
OTA(Over The Air)'yı araştırınız, 21.yüzyıldayız artık tüm cihazlar internete bağlı eğer kapalı bir sistem kullanıyorsanız usb-sd kart gibi ortamlardan başka çareniz yok.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: JOKERAS - 27 Ekim 2020, 13:27:44
gokhangokcen hangi yol ile (OTA,RS232,USB vs) Update yapıldığını değil,
bunun işlemci tarafını,nasıl yapıldığını Yani Boot mantığını soruyor sanırım.

RS232'den işlemci programlayan arkadaş varmı?Varsa o bize bunun mantığını anlatabilirmi?


Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: gokhangokcen - 27 Ekim 2020, 14:04:23
Alıntı yapılan: wanted0035 - 26 Ekim 2020, 14:14:28Artık birçok işlemcinin usb desteği var, biz usb kullanıyoruz. Cihaz ilk açılışta usb bellekteki yazılımı kontrol ediyor eğer usbde daha yüksek versiyonlu yazılım varsa onu yükleyip öyle çalışmaya başlıyor.
hocam flash disk ile program güvenliğini nasıl sağlıyorsunuz? O programın size ait olup olmadığını belirleyen ne gibi tedbirler alıyorsunuz? biraz açıklama şansınız mümkün mü? Örneğin Pakistandaki adama bir dosya göndermeliyim tek tek cihazları gezecek mi? Bazen makine üzerindeki cihazlarımda sök tak işlemi çok meşakatli bir işlem oluyor.

Rs232 ile zamanında çok program yükledim (önceden bootloader olan işlemcilere). Örneğin, şu an genelde kullandığım STM32F103 serisi işlemci var. Bu işlemciye fiziki olarak orada bulunmadan program atmam gerekiyor. Buda internet olan ortamda olacak. ESP serisi olur ya da türevleri ya da kartımda bulunan ethernet/spi dönüştürücüler ile kart bir şekilde internete bağlı. Bunu uzaktan nasıl güncelleyebilirim? Veyahut bir işletmede aynı ağda bulunan 10 cihazım var diyelim ip ve mac'leri birbirinden farklı ve ben bunları biliyorum. Orada bulunan ağa bağlandığımda oturduğum yerden 10 cihazıda nasıl güncelleyebilirim? Cihazın içerisine nasıl bir bootloader yazmam gerekir? internette biraz araştırma yaptım genelde arduino ile ilgili döküman var. STM mimarisine çok hakim değilim yeni yeni tanıştım projeler geliştiriyorum. Öncesinde pic ve atmega kullandım yeterli bilgiye sahibim. Stm için ethernetten güncelleme ile ilgili örnek olan ya da nasıl yapılacağına dair bir şeylerin anlatıldığı döküman web sitesi olan var mıdır?
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: tunayk - 27 Ekim 2020, 15:06:12
Eğer yeni yapacağın kartlar ile ilgili bir planın varsa, yapman gereken Uzaktan göndereceğin yeni firmware'i alıp bir kenarda tutacak bir hafıza alanı eklemen ve kodlarına, uzak bağlantı ile ilgili komutları gönderip boot moda soktuktan sonra yeni dosyayı alacak rutinleri eklemen olacaktır.  Bundan sonrası zaten kolay.

Güncelleme yapılacağı zaman sahadaki kullanıcı çevre güvenliğini alır, cihazı belirleyeceğin duruma sokar. Sonrasında sen bağlanıp gerekli komutları ve dosyayı gönderirsin.

Cihazın dosyayı aldıktan sonra CRC vb. kontrolü yapar. Dosya sağlam ve kendisine ait ise, hafızasına kaydeder, reset atar iş biter.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: JOKERAS - 27 Ekim 2020, 15:22:20
Sorum havada kaldı galiba.
PC arayüzü,yükleyici Programmer olmadan Sadece RS232 ve Terminal ile İşlemciye yazılım yükleyebilen varmı?
Deneyen,uğraşan oldumu?

Örnek çok basit bir Pgm olabilir.İşlemcide hali hazırdaki yüklü olan yazılım,Mesela Matrix süren bir
bir yazılım olsun.Matrix'te "Ahmet" yazıyor olsun.Yeni Update yazılımında ise "Mehmet" yazacağımızı varsayalım.Veya başkaca herhangi basit bir örnekte olabilir.
Bunu RS232 ile nasıl Yükleriz?Boot Loaderini nasıl yazarız mantık silsilesi nedir?
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: fide - 27 Ekim 2020, 15:29:40
Alıntı yapılan: JOKERAS - 27 Ekim 2020, 15:22:20Sorum havada kaldı galiba.
PC arayüzü,yükleyici Programmer olmadan Sadece RS232 ve Terminal ile İşlemciye yazılım yükleyebilen varmı?
Deneyen,uğraşan oldumu?

Örnek çok basit bir Pgm olabilir.İşlemcide hali hazırdaki yüklü olan yazılım,Mesela Matrix süren bir
bir yazılım olsun.Matrix'te "Ahmet" yazıyor olsun.Yeni Update yazılımında ise "Mehmet" yazacağımızı varsayalım.Veya başkaca herhangi basit bir örnekte olabilir.
Bunu RS232 ile nasıl Yükleriz?Boot Loaderini nasıl yazarız mantık silsilesi nedir?
Arduino kartların tamamına yakını (bildiğim kadarıyla due ve leonardo hariç) hepsi önce seri port dtr hattı üzerinden reset atıp sonra işlemci hazır olana kadar bekliyor. Arada birkaç karakter karşılıklı alıp verdikten sonra programlama moduna geçip programı atmel çip üzerine yazıyor. Sonra reset atıp çalışmaya başlıyor.
Seri port bootloader örneği arıyorsanız arduino kartlara bakabilirsiniz.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: magnetron - 27 Ekim 2020, 15:31:09
STM32 de seri porttan kod yüklenebiliyor

flash loader demo diye bir program var ben onunla yüklüyorum
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: JOKERAS - 27 Ekim 2020, 15:51:01
Anlamaya çalıştığım Boot Loader mantığı.Mesela herhangi bir işlemciyle devre tasarladınız,bunu sattınız.
Gün oldu Devran döndü Takke düştü Kel göründü vs.Bu sattığınız Devrelerdeki yazılımları güncellemeniz gerekti.
Bunlara tek tek Üreticinin uğraşması mümkün değil.Ürünü kullanan vatandaş Sitenize koyduğunuz güncel hex'i
indirip RS232,USB vs ile bunu İşlemciye yükleyebilmeli.
İşlemciye Kodu yazarken içine Boot Loaderini de yazmamız ve gömmemiz gerekki bunu yapabilelim.
Bunu nasıl yaparız?

Hali hazırda ilgili özel işlemcilere göre yapılmış Boot Loaderler olabilir.Ama biz onu kendimiz her hangi bir işlemciye yazmamız gerek.Bunu nasıl yaparız?

aslında gökhangökçen'de bunu soruyor diye anladım.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: tunayk - 27 Ekim 2020, 16:08:19
Alıntı yapılan: JOKERAS - 27 Ekim 2020, 15:51:01Anlamaya çalıştığım Boot Loader mantığı.Mesela herhangi bir işlemciyle devre tasarladınız,bunu sattınız.
Gün oldu Devran döndü Takke düştü Kel göründü vs.Bu sattığınız Devrelerdeki yazılımları güncellemeniz gerekti.
Bunlara tek tek Üreticinin uğraşması mümkün değil.Ürünü kullanan vatandaş Sitenize koyduğunuz güncel hex'i
indirip RS232,USB vs ile bunu İşlemciye yükleyebilmeli.
İşlemciye Kodu yazarken içine Boot Loaderini de yazmamız ve gömmemiz gerekki bunu yapabilelim.
Bunu nasıl yaparız?

Hali hazırda ilgili özel işlemcilere göre yapılmış Boot Loaderler olabilir.Ama biz onu kendimiz her hangi bir işlemciye yazmamız gerek.Bunu nasıl yaparız?

aslında gökhangökçen'de bunu soruyor diye anladım.

Bootloader yazmanız için öncelikle işlemcinizin içerden kendi flash belleğine / program alanına yazabilmesi gerekiyor. İkincisi, code protect ayarlarının bu alana yazmaya izin vermesi gerekiyor veya içeriden değiştirilebiliyor olması gerekiyor.  Bunları yapabiliyor ise, bundan sonrası yapılan tasarıma göre planlanabilir. Standart bir bootloader işlemcinin reset vektörü denen ilk çalışma kısmına yerleştirilir. Kalan kısma da programın kendisi yazılır. Boot modda gelen haberleşmeden gelen program parçacıkları doğrudan program hafıasına yazılır. İşlem yarıda kesilirse hafızadaki program çöp olmuş olabilir.  Bootloader sağlam kalacağı için yeniden yükleme yapılabilir.

Lakin programda oluşturulacak farklı bir mekanizma ile boot moda geçip uzaktan gelen veriyi doğrudan veya harici bir hafıza alanına da yazılabilir. Sonrasında da harici alandan program hafızasına transfer edilir.

 
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: JOKERAS - 27 Ekim 2020, 16:28:31
tunayk,Teşekkürler.Şimdiki işlemcilerin çoğunda Self Flash Write-Read özelliği var.
Ram alanları eskiye nazaran nispeten daha geniş.
Aslında basit bir iş yapan yazılımla işlemciye bunun nasıl yapıldığını anlamak lazım.

Şöyle bir yol izlesek.
Run Time'da Kullanılamasa bile...

*Donanımsal veya yazılımsal yapılmış RS232 kodumuz her halukarda var.
*İnterrupt kodumuz her halukarda var.
*CRC,Check Sum Hata denetim kodumuz her halukarda var.
*Falsh Read/write her halukarda var.
*Boot Moduna soktuğumuz Kod parçacığımız da var.
*İşlemcinin Ram Rom Bellek haritasını,yüklediğimiz İlk Programın Bellekte hangi adreslerden
başladığı,bittiği veya Taştığı noktaları biliyoruz.
*Boot moduna sokulan işlemciye yazılımı ne yapacağını söylediğimiz Kodumuzda var diyelim.

iş sadece dışardan gelen veriyi Ram'e kopyalayıp Flash Write işlemi Flash'a yazmak yer değiştirmek değilmidir?Bayağı karışık bir iş olduğu aşikar.

El birliğiyle bu işi çözelim!Bu güzel bir şey:)
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: gokhangokcen - 27 Ekim 2020, 17:03:32
@JOKERAS üstad basic programlama dili kullanırken tıpkı bahsettiğin gibi bir program yapmıştım kayan yazı uygulaması. Proton derleyici kullanıyordum. Kendi içinde olan bootloader dosyasını bir kere programlayıcı vasıtası ile yazdıktan sonra direkt derleyiciden rs232 ile gönder gibi bir seçenek vardı programlayıcı ile uğraşmadan direkt proton üzerinden programı güncelleyip denemelerimi yapıyordum. Hatta help kısmında devrenin nasıl olacağına ilişkin kısımda vardı. Helpindeki sayfa 28'de.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: JOKERAS - 27 Ekim 2020, 17:31:22
Alıntı yapılan: gokhangokcen - 27 Ekim 2020, 17:03:32@JOKERAS üstad basic programlama dili kullanırken tıpkı bahsettiğin gibi bir program yapmıştım kayan yazı uygulaması. Proton derleyici kullanıyordum. Kendi içinde olan bootloader dosyasını bir kere programlayıcı vasıtası ile yazdıktan sonra direkt derleyiciden rs232 ile gönder gibi bir seçenek vardı programlayıcı ile uğraşmadan direkt proton üzerinden programı güncelleyip denemelerimi yapıyordum. Hatta help kısmında devrenin nasıl olacağına ilişkin kısımda vardı. Helpindeki sayfa 28'de.
Help hangi help?
Madem böyle bir uygulama yaptınız bunun mantığını anlatırmısınız?
Bu işi öğrenmemiz lazım.Bu iş gerçekten çok önemli ve gerekli diye düşünüyorum.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: mufitsozen - 27 Ekim 2020, 22:27:27
AN4657 Application note
STM32 in-application programming (IAP) using the USART
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: kantirici - 27 Ekim 2020, 23:12:15
http://ww1.microchip.com/downloads/en/AppNotes/Atmel-42141-SAM-AT02333-Safe-and-Secure-Bootloader-Implementation-for-SAM3-4_Application-Note.pdf

Yukarıdaki dokümanda tüm soruların cevapları var arkadaşlar. Fakat bu iş ilk başlarda karışık gelebilir. Bu yüzden en basit haliyle başlamak en iyisi.

Öncelikle bir led blink uygulamasını uygun şekilde geliştirip binary dosyayı direk bootloader yazılımında kullanabilmek için C array'e çevirip bootloader programına gömün. Ardından bootlader bu datayı yeni uygulama olarak flash'a yazıp bu kodu çalıştırsın. Gerisi kolayca gelir diye düşünüyorum.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: gokhangokcen - 28 Ekim 2020, 10:37:15
Alıntı yapılan: JOKERAS - 27 Ekim 2020, 17:31:22Help hangi help?
Madem böyle bir uygulama yaptınız bunun mantığını anlatırmısınız?
Bu işi öğrenmemiz lazım.Bu iş gerçekten çok önemli ve gerekli diye düşünüyorum.


Proton programının helpinde üstad. Zor bir devre değil klasik max232 tarzındaki rs232 ttl converter devresi. işlemciye önce bootloader yüklüyorsun programlayıcı ile sonra rs232'den bağlantı kuruyorsun oradan yazdırıyorsun programı.


@mufitsozen  üstad seri port ile değilde ethernet bootloader olsa benim işimi daha çok görecek gibi. Ya da bir fikir genelde W5500 kullanıyorum uygulamalarımda. ModbusTCP ile iletişim kuruyorum endüstriyel cihazlar ile. W5500 yerine Ethernet to RS232 bir cihaz kullansam işimi görür mü acaba= Hem ethernet iletişimi olacak hemde bootloader olacağı için tcp'den gelen paketler ile program güncelleyebilir miyiim? tecrübe eden var mıdır?
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: tunayk - 28 Ekim 2020, 11:22:27
Olayın mantığı açısından ethernet veya seriport bişeyi değiştirmiyor. Bence siz önce mantık kısmını bi halledin. Sonrasında isterseniz bluetooth ile bile güncellersiniz.
Tüm haberleşme tipleri (burada konuştuklarımız) işlemciye bir Rx pininden seri olarak veri basar.

Siz seriyi halledin, hepsi halolur :D
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: JOKERAS - 28 Ekim 2020, 13:30:46
Alıntı yapılan: gokhangokcen - 28 Ekim 2020, 10:37:15Proton programının helpinde üstad. Zor bir devre değil klasik max232 tarzındaki rs232 ttl converter devresi. işlemciye önce bootloader yüklüyorsun programlayıcı ile sonra rs232'den bağlantı kuruyorsun oradan yazdırıyorsun programı.
Boot Loaderi nasıl yazacağız onu soruyorum.


 
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: power20 - 28 Ekim 2020, 14:24:54
Boot Loader, mcu ya göre fark gösterir. Her defasında flash üzerine yazılacak paket boyutu değişebiliyor. 1 bayt değil de 64 veya 128 bayt gibi.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: mufitsozen - 28 Ekim 2020, 22:19:55
Alıntı yapılan: JOKERAS - 28 Ekim 2020, 13:30:46Boot Loaderi nasıl yazacağız onu soruyorum.

ARM: How to Write a Bootloader
https://www.keil.com/support/docs/3913.htm
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: z - 29 Ekim 2020, 01:19:02
Bootloader yazmanin hic bir esprisi yok.

Dikkat edilmesi gereken bazi konular var. Aslinda bu bootloaderdan ziyade bootloader ile yukleyecegin uygulama programini nasil yazacagin ile ilgili.

Cunku ciplak bir mcu'ya kod yazmakta sorun yok.

Memory basi sonu belli, int vektorlerini tutan adres belli.

Fakat boot loader yazdiginda ramin bir kismini kullanmis oluyorsun ve uygulama programinin ram ofseti kayiyor. Boyle ofsetli mi kullanacaksin yoksa bootloader ram alanini uygulama programina devretmek uzere bosa mi cikartacaksin.

Ayni sekilde eger bootloader int vektoru kullaniyorsa int vektor tablosunun, ugulama programi isletilmeden once yeniden duzenlenmesi gerekecek.

Bootloader isin kolay kismi, herhangi bir iletisim kanalindan gelen verileri flashta uygun bir alana yazacaksin. Yani flash'a yazma programi sadece. Programi baslatmak icin de uygulama programinin start noktasina jump edeceksin.

Gozden kacirmamaniz gereken bir konu da uygulama programiniz guvenlimi degilmi?

1) Birileri sizin adiniza MCU'ya kendi kodunu yukleyebilsin mi yukleyemesin mi?

2) Uygulama programinizi mesela internete koydunuz ve musteriler kodu kendileri yuklesin istediniz. Rakipleriniz sizin kodunuzu alip inceleyebilsin mi inceleyemesin mi?

Asil trikler bunlar.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: mufitsozen - 29 Ekim 2020, 01:28:44
Alıntı yapılan: z - 29 Ekim 2020, 01:19:02Bootloader yazmanin hic bir esprisi yok.


Gozden kacirmamaniz gereken bir konu da uygulama programiniz guvenlimi degilmi?

1) Birileri sizin adiniza MCU'ya kendi kodunu yukleyebilsin mi yukleyemesin mi?

2) Uygulama programinizi mesela internete koydunuz ve musteriler kodu kendileri yuklesin istediniz. Rakipleriniz sizin kodunuzu alip inceleyebilsin mi inceleyemesin mi?

Asil trikler bunlar.


Burada bir ekleme yzapmak isterim. @z'nin bahsettigi konularin dogru bir sekilde tasarlanarak cozulmesi urununuzun clonelarinin yapilmasini da engelleyecektir.

en basitinden mcu-id kullanarak ytapilan bir sifreleme islemi ile bootloder'a gonderilen bilginin her mcuya farkli olmasini saglar. Boylece hwi kopyalayan birisi calusan sistemin bootload datasini baska bir mcuda kullanamaz.

Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: z - 29 Ekim 2020, 01:47:21
Uygulama programinizin kesinlikle kriptolanmis olmasi gerekiyor.

Boylece internete cirilciplak koydugunuz uygulama programi disassembler ile incelenmeye kalkildiginda asla programiniz makine kodu gibi gorulmemeli.

Bir ara forumun asagidaki linkinde acik kaynak programlara aykiri bir baslik acmistim. Orda detaylar hakkinda fikir cimlastigi yapmistik.

https://www.picproje.org/index.php/topic,52838.msg400327.html#msg400327

Eger kriptolama kullanmayacaksaniz bu kez PC'lerdeki BIOS fonksiyonlari gibi bazi fonksiyonlar yazip bunu bootloader programina gommek, uygulama programinizda da bios fonksiyonlarini kullanmak bir miktar guvenligi artiracaktir. Cunku uygulama programi debug edilse bile zirt pirt ortalikta olmayan bazi fonksiyonlarin calgriliyor olmasi programin anlasilmasini zorlastiracaktir.

Ote yandan MCU'ya hic bir sekilde trojan ati sokulmamasini da garanti altina almaniz gerekiyor.


Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: JOKERAS - 29 Ekim 2020, 15:07:16
Siz aşmışsınız.Hele bir Boot edelimde Şifrelemeyi sonra düşünürüz:)
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: gokhangokcen - 30 Ekim 2020, 08:54:09
Alıntı yapılan: JOKERAS - 28 Ekim 2020, 13:30:46Boot Loaderi nasıl yazacağız onu soruyorum.


 
protonun içerisinde gömülü geliyor üstad. dosyalarının içerisinde var hazır olarak. Yazma konusunu bende öğrenmeye çalışıyorum şu an
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: gokhangokcen - 07 Kasım 2020, 10:36:48
Alıntı yapılan: kantirici - 27 Ekim 2020, 23:12:15http://ww1.microchip.com/downloads/en/AppNotes/Atmel-42141-SAM-AT02333-Safe-and-Secure-Bootloader-Implementation-for-SAM3-4_Application-Note.pdf

Yukarıdaki dokümanda tüm soruların cevapları var arkadaşlar. Fakat bu iş ilk başlarda karışık gelebilir. Bu yüzden en basit haliyle başlamak en iyisi.

Öncelikle bir led blink uygulamasını uygun şekilde geliştirip binary dosyayı direk bootloader yazılımında kullanabilmek için C array'e çevirip bootloader programına gömün. Ardından bootlader bu datayı yeni uygulama olarak flash'a yazıp bu kodu çalıştırsın. Gerisi kolayca gelir diye düşünüyorum.

@kantirici üstad binary dosyasını nasıl açarım array yaparım?

@z hocam bir elimizden tut, yol göster şu işi bitirelim.
Olayın mantığı bahsi geçtiği gibi çok zor bir işlem değil. Verilen kaynakları araştırdım. Sanırım işleyiş şu şekilde. -*Hex/Bin dosyasını bir array haline getiriyoruz (bunu nasıl yaparız bilgim yok).
*Ardından işlemciye bu array dosyasını x alanından itibaren yaz diyoruz.
*Restart ederek yeni kodların çalışmasını sağlıyoruz.

kodların kripto vs olaylarına hiç girmiyorum. Şu an yapmak istediğim aşina olduğum için ve elimde stm32f103c8 kartı olduğu için bir ethernet ile güncelleme yapan bootloader yazmak. Örneğin işlemciye bir bootloader yükleyeyim. Ardından ethernet arayüzünden attığım kod ile led yakıp söndüreyim. Bana bu konuda yol gösterir misiniz?

İlk takıldığım nokta binary dosyasını nasıl array yaparız? (bin dosyasını herhangi bir program ya da notpad ile anlamlı olarak açamadım) belli ki bir program vs ihtiyacımız var.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: z - 07 Kasım 2020, 12:52:51
Forumda STM32 icin flash write flash delete gibi C fonksiyonlari vardi.

Asagidaki linkteki Flash dokumani da isine yarayacaktir.

http://www.cncdesigner.com/wordpress/?page_id=4096
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: JOKERAS - 07 Kasım 2020, 13:03:56
z, Boot Loader yazmak bu kadar kolaymı?Yani Flash Read/Write yaptığımız zaman olay bitiyormu?

Basit bir kaç Örnek C kodu versen mesela bir 1 Saniyede led yak söndür.
Update yazılımında 3 saniye yak söndür vs gibi.
 
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: z - 07 Kasım 2020, 14:09:19
Hemen hemen flasha write kadar basit.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: gokhangokcen - 07 Kasım 2020, 14:10:55
Alıntı yapılan: z - 07 Kasım 2020, 12:52:51Forumda STM32 icin flash write flash delete gibi C fonksiyonlari vardi.

Asagidaki linkteki Flash dokumani da isine yarayacaktir.

http://www.cncdesigner.com/wordpress/?page_id=4096


@z hocam, benim tıkandığım nokta *.bin dosyasını işlemciye nasıl yazdıracağım? Stlink utility bu işi nasıl yapıyor? Bin dosyası not defteri ya da başka bir şeyle açılan uzantı değil. Bin dosyasının içeriğinde 0x8000 adresinin içeriği şu 0x8001 içeriği bu diye yazıyor mu? Nasıl görebilirim? Bunu işlemciye nasıl yazdırırım?
Bu sorunun cevabını arıyorum şu an için
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: JOKERAS - 07 Kasım 2020, 14:12:23
Alıntı yapılan: z - 07 Kasım 2020, 14:09:19Hemen hemen flasha write kadar basit.
Tamam,anladım çok basit diyorsun.Basit bir örnek C kodu yazarmısın?
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: z - 07 Kasım 2020, 14:17:59
Ben asmciyim.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: JOKERAS - 07 Kasım 2020, 14:23:34
Alıntı yapılan: z - 07 Kasım 2020, 14:17:59Ben asmciyim.
Vay arkadaş ya.Asm'ci olduğunu biliyoruz.Sanki C yazamıyorsun.
Asm'de olabilir.Örnek olsun.

Hala bekliyorum @z .
Sen istesen C'de yazarsın.Sen ki Ortadoğu ve Balkanların en haşin Embededçilerindensin.
Haydi bekliyorum-ruz.  Bu olayı anlamam lazım.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: kantirici - 07 Kasım 2020, 18:22:22
Alıntı yapılan: gokhangokcen - 07 Kasım 2020, 10:36:48@kantirici üstad binary dosyasını nasıl açarım array yaparım?

Bu iş için kendinizde bir program yazabilirsiniz veya hazır programlarda bulabilirsiniz internetten.

Denemeler için aşağıdaki web sitesini kullanabilirsiniz. Bin dosyayı C array'e çeviriyor.

https://www.netzmal.de/bin2hex/
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: gokhangokcen - 08 Kasım 2020, 13:26:31
@kantirici üstad, link için teşekkür ediyorum. Peki bu dönüşümü kendimiz yapmak istersek nasıl yazarız? İşlem/ işleyiş nasıldır? Bu vermiş olduğunuz linki yarın deneyeceğim haberdar ederim
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: gokhangokcen - 10 Kasım 2020, 13:16:07
Alıntı yapılan: gokhangokcen - 08 Kasım 2020, 13:26:31@kantirici üstad, link için teşekkür ediyorum. Peki bu dönüşümü kendimiz yapmak istersek nasıl yazarız? İşlem/ işleyiş nasıldır? Bu vermiş olduğunuz linki yarın deneyeceğim haberdar ederim

@kantirici hocam verdiğiniz linki denedim array formatında byte-byte olarak veri oluşturuyor. Peki bu bilgilerin hangi adrese yazılacağını nereden bileceğim?
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: kantirici - 10 Kasım 2020, 13:30:40
Merhaba,

Herhangi bir dosyayı C array'e çevirmek için kullandığınız programlama dilinde ilgili dosyayı açıp dosya sonuna kadar byte byte okuyup bu verileri string olarak başka bir dosyaya kayıt yapmalısınız.

İkinci sorunuza gelince; O adres bilgisi sizin tasarımınıza göre değişecektir. Mesela bootloader 0x8000 adresinde başlayıp 0x8500 adresinde bitiyorsa, bootloader'ın bitişi sizin programınızın başlangıç adresi olabilir. Bu zorunlu değildir. 0x9000 adresinde de sizin asıl programınız başlıyor olabilir. Her iki durumda da bootlaoder ilgili adrese jump edeceği için sorun olmaz. Sadece flash alanını iyi kullanmamış olursunuz.

Tabi  linker dosyalarını bu adreslere göre düzenlemeniz gerekecektir.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: gokhangokcen - 19 Kasım 2020, 09:08:31
Öncelikle neredeyse 1 haftadır foruma giremiyordum. Bu yüzden cevap yazamadım. Sebebini bir türlü çözemedim..

@kantirici üstad verdiğin bilgiler için teşekkür ederim. Yönlendirmelerin sayesinde bir bootloader oluşturup içerisine ledblink kodu gömdüm ve çalıştırabildim. İlgilenen arkadaşlar illaki olacaktır. Yaptığım adımlarla birlikte elimden geldiğince anlatmaya çalışayım.

Bootloder main dosyası;
(diğer header dosyalarını paylaşmadım. Çünkü cubemx ile osc ayarlarını vs yaptım. İşlemci 72mhz clock hızı ile çalışmakta girişte 8mhz kristal var)

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
typedef  void (*pFunction)(void);
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define APPLICATION_START_ADDRESS  0x0800C000 //(FLASH_BASE+ 48*1024)
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void Write_Flash (uint32_t adr, uint16_t data);
void programUpdate(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  pFunction appEntry;
  uint32_t appStack;
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  programUpdate();

  /*pFunction Jump_To_Application = *( (pFunction*) (APPLICATION_START_ADDRESS + 4) );


  __set_CONTROL(0);

  SysTick->CTRL = 0; //disable SysTick

  SCB->VTOR = APPLICATION_START_ADDRESS;

  programUpdate();*/

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */



  /* Initialize user application's Stack Pointer */
  /*__set_MSP( *( (uint32_t*) APPLICATION_START_ADDRESS ) );

  Jump_To_Application();*/

  /* Get the application stack pointer (First entry in the application vector table) */
  appStack = (uint32_t) *((__IO uint32_t*)APPLICATION_START_ADDRESS);

  /* Get the application entry point (Second entry in the application vector table) */
  appEntry = (pFunction) *(__IO uint32_t*) (APPLICATION_START_ADDRESS + 4);

  /* Reconfigure vector table offset register to watch the application bootloader */
  SCB->VTOR = APPLICATION_START_ADDRESS;

  /* Set the application stack pointer */
  __set_MSP(appStack);

  appEntry();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */
void programUpdate(){
uint8_t array[4624] = {
  0x00,0x50,0x00,0x20,0x1d,0xd1,0x00,0x08,0x05,0xc3,0x00,0x08,0x11,0xc3,0x00,0x08,0x17,0xc3,0x00,0x08,
  0x1d,0xc3,0x00,0x08,0x23,0xc3,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x29,0xc3,0x00,0x08,0x35,0xc3,0x00,0x08,0x00,0x00,0x00,0x00,0x41,0xc3,0x00,0x08,
  0x4d,0xc3,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,
  0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,
  0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,
  0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,
  0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,
  0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,
  0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,
  0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,
  0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x65,0xd1,0x00,0x08,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x5f,0xf8,0x08,0xf1,0x10,0xb5,0x05,0x4c,0x23,0x78,0x33,0xb9,0x04,0x4b,0x13,0xb1,
  0x04,0x48,0xaf,0xf3,0x00,0x80,0x01,0x23,0x23,0x70,0x10,0xbd,0x0c,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
  0xc0,0xd1,0x00,0x08,0x08,0xb5,0x03,0x4b,0x1b,0xb1,0x03,0x49,0x03,0x48,0xaf,0xf3,0x00,0x80,0x08,0xbd,
  0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x20,0xc0,0xd1,0x00,0x08,0x80,0xb5,0x00,0xaf,0x00,0xf0,0x08,0xf9,
  0x00,0xf0,0x0e,0xf8,0x00,0xf0,0x50,0xf8,0x4f,0xf4,0x00,0x51,0x03,0x48,0x00,0xf0,0xd7,0xfb,0x4f,0xf4,
  0xfa,0x70,0x00,0xf0,0x5d,0xf9,0xf5,0xe7,0x00,0x10,0x01,0x40,0x80,0xb5,0x90,0xb0,0x00,0xaf,0x07,0xf1,
  0x18,0x03,0x28,0x22,0x00,0x21,0x18,0x46,0x01,0xf0,0x14,0xf8,0x3b,0x1d,0x00,0x22,0x1a,0x60,0x5a,0x60,
  0x9a,0x60,0xda,0x60,0x1a,0x61,0x01,0x23,0xbb,0x61,0x4f,0xf4,0x80,0x33,0xfb,0x61,0x00,0x23,0x3b,0x62,
  0x01,0x23,0xbb,0x62,0x02,0x23,0x7b,0x63,0x4f,0xf4,0x80,0x33,0xbb,0x63,0x00,0x23,0xfb,0x63,0x07,0xf1,
  0x18,0x03,0x18,0x46,0x00,0xf0,0xc4,0xfb,0x03,0x46,0x00,0x2b,0x01,0xd0,0x00,0xf0,0x65,0xf8,0x0f,0x23,
  0x7b,0x60,0x02,0x23,0xbb,0x60,0x00,0x23,0xfb,0x60,0x00,0x23,0x3b,0x61,0x00,0x23,0x7b,0x61,0x3b,0x1d,
  0x00,0x21,0x18,0x46,0x00,0xf0,0x30,0xfe,0x03,0x46,0x00,0x2b,0x01,0xd0,0x00,0xf0,0x51,0xf8,0x00,0xbf,
  0x40,0x37,0xbd,0x46,0x80,0xbd,0x00,0x00,0x80,0xb5,0x88,0xb0,0x00,0xaf,0x07,0xf1,0x10,0x03,0x00,0x22,
  0x1a,0x60,0x5a,0x60,0x9a,0x60,0xda,0x60,0x1e,0x4a,0x1e,0x4b,0x9b,0x69,0x43,0xf0,0x10,0x03,0x93,0x61,
  0x1b,0x4b,0x9b,0x69,0x03,0xf0,0x10,0x03,0xfb,0x60,0xfb,0x68,0x18,0x4a,0x18,0x4b,0x9b,0x69,0x43,0xf0,
  0x20,0x03,0x93,0x61,0x15,0x4b,0x9b,0x69,0x03,0xf0,0x20,0x03,0xbb,0x60,0xbb,0x68,0x12,0x4a,0x12,0x4b,
  0x9b,0x69,0x43,0xf0,0x04,0x03,0x93,0x61,0x0f,0x4b,0x9b,0x69,0x03,0xf0,0x04,0x03,0x7b,0x60,0x7b,0x68,
  0x00,0x22,0x4f,0xf4,0x00,0x51,0x0c,0x48,0x00,0xf0,0x40,0xfb,0x4f,0xf4,0x00,0x53,0x3b,0x61,0x01,0x23,
  0x7b,0x61,0x00,0x23,0xbb,0x61,0x02,0x23,0xfb,0x61,0x07,0xf1,0x10,0x03,0x19,0x46,0x04,0x48,0x00,0xf0,
  0xd7,0xf9,0x00,0xbf,0x20,0x37,0xbd,0x46,0x80,0xbd,0x00,0xbf,0x00,0x10,0x02,0x40,0x00,0x10,0x01,0x40,
  0x80,0xb4,0x00,0xaf,0x00,0xbf,0xbd,0x46,0x80,0xbc,0x70,0x47,0x80,0xb4,0x85,0xb0,0x00,0xaf,0x15,0x4a,
  0x14,0x4b,0x9b,0x69,0x43,0xf0,0x01,0x03,0x93,0x61,0x12,0x4b,0x9b,0x69,0x03,0xf0,0x01,0x03,0xbb,0x60,
  0xbb,0x68,0x0f,0x4a,0x0e,0x4b,0xdb,0x69,0x43,0xf0,0x80,0x53,0xd3,0x61,0x0c,0x4b,0xdb,0x69,0x03,0xf0,
  0x80,0x53,0x7b,0x60,0x7b,0x68,0x0a,0x4b,0x5b,0x68,0xfb,0x60,0xfb,0x68,0x23,0xf0,0xe0,0x63,0xfb,0x60,
  0xfb,0x68,0x43,0xf0,0x00,0x73,0xfb,0x60,0x04,0x4a,0xfb,0x68,0x53,0x60,0x00,0xbf,0x14,0x37,0xbd,0x46,
  0x80,0xbc,0x70,0x47,0x00,0x10,0x02,0x40,0x00,0x00,0x01,0x40,0x80,0xb4,0x00,0xaf,0x00,0xbf,0xbd,0x46,
  0x80,0xbc,0x70,0x47,0x80,0xb4,0x00,0xaf,0xfe,0xe7,0x80,0xb4,0x00,0xaf,0xfe,0xe7,0x80,0xb4,0x00,0xaf,
  0xfe,0xe7,0x80,0xb4,0x00,0xaf,0xfe,0xe7,0x80,0xb4,0x00,0xaf,0x00,0xbf,0xbd,0x46,0x80,0xbc,0x70,0x47,
  0x80,0xb4,0x00,0xaf,0x00,0xbf,0xbd,0x46,0x80,0xbc,0x70,0x47,0x80,0xb4,0x00,0xaf,0x00,0xbf,0xbd,0x46,
  0x80,0xbc,0x70,0x47,0x80,0xb5,0x00,0xaf,0x00,0xf0,0x4e,0xf8,0x00,0xbf,0x80,0xbd,0x80,0xb4,0x00,0xaf,
  0x00,0xbf,0xbd,0x46,0x80,0xbc,0x70,0x47,0x80,0xb5,0x00,0xaf,0x08,0x4a,0x08,0x4b,0x1b,0x68,0x43,0xf0,
  0x10,0x03,0x13,0x60,0x03,0x20,0x00,0xf0,0x27,0xf9,0x00,0x20,0x00,0xf0,0x08,0xf8,0xff,0xf7,0x8e,0xff,
  0x00,0x23,0x18,0x46,0x80,0xbd,0x00,0xbf,0x00,0x20,0x02,0x40,0x80,0xb5,0x82,0xb0,0x00,0xaf,0x78,0x60,
  0x12,0x4b,0x1a,0x68,0x12,0x4b,0x1b,0x78,0x19,0x46,0x4f,0xf4,0x7a,0x73,0xb3,0xfb,0xf1,0xf3,0xb2,0xfb,
  0xf3,0xf3,0x18,0x46,0x00,0xf0,0x31,0xf9,0x03,0x46,0x00,0x2b,0x01,0xd0,0x01,0x23,0x0e,0xe0,0x7b,0x68,
  0x0f,0x2b,0x0a,0xd8,0x00,0x22,0x79,0x68,0x4f,0xf0,0xff,0x30,0x00,0xf0,0x07,0xf9,0x06,0x4a,0x7b,0x68,
  0x13,0x60,0x00,0x23,0x00,0xe0,0x01,0x23,0x18,0x46,0x08,0x37,0xbd,0x46,0x80,0xbd,0x00,0x00,0x00,0x20,
  0x08,0x00,0x00,0x20,0x04,0x00,0x00,0x20,0x80,0xb4,0x00,0xaf,0x05,0x4b,0x1b,0x78,0x1a,0x46,0x05,0x4b,
  0x1b,0x68,0x13,0x44,0x03,0x4a,0x13,0x60,0x00,0xbf,0xbd,0x46,0x80,0xbc,0x70,0x47,0x08,0x00,0x00,0x20,
  0x28,0x00,0x00,0x20,0x80,0xb4,0x00,0xaf,0x02,0x4b,0x1b,0x68,0x18,0x46,0xbd,0x46,0x80,0xbc,0x70,0x47,
  0x28,0x00,0x00,0x20,0x80,0xb5,0x84,0xb0,0x00,0xaf,0x78,0x60,0xff,0xf7,0xf0,0xff,0xb8,0x60,0x7b,0x68,
  0xfb,0x60,0xfb,0x68,0xb3,0xf1,0xff,0x3f,0x05,0xd0,0x09,0x4b,0x1b,0x78,0x1a,0x46,0xfb,0x68,0x13,0x44,
  0xfb,0x60,0x00,0xbf,0xff,0xf7,0xe0,0xff,0x02,0x46,0xbb,0x68,0xd2,0x1a,0xfb,0x68,0x9a,0x42,0xf7,0xd3,
  0x00,0xbf,0x10,0x37,0xbd,0x46,0x80,0xbd,0x08,0x00,0x00,0x20,0x80,0xb4,0x85,0xb0,0x00,0xaf,0x78,0x60,
  0x7b,0x68,0x03,0xf0,0x07,0x03,0xfb,0x60,0x0c,0x4b,0xdb,0x68,0xbb,0x60,0xba,0x68,0x4f,0xf6,0xff,0x03,
  0x13,0x40,0xbb,0x60,0xfb,0x68,0x1a,0x02,0xbb,0x68,0x13,0x43,0x43,0xf0,0xbf,0x63,0x43,0xf4,0x00,0x33,
  0xbb,0x60,0x04,0x4a,0xbb,0x68,0xd3,0x60,0x00,0xbf,0x14,0x37,0xbd,0x46,0x80,0xbc,0x70,0x47,0x00,0xbf,
  0x00,0xed,0x00,0xe0,0x80,0xb4,0x00,0xaf,0x04,0x4b,0xdb,0x68,0x1b,0x0a,0x03,0xf0,0x07,0x03,0x18,0x46,
  0xbd,0x46,0x80,0xbc,0x70,0x47,0x00,0xbf,0x00,0xed,0x00,0xe0,0x80,0xb4,0x83,0xb0,0x00,0xaf,0x03,0x46,
  0x39,0x60,0xfb,0x71,0x97,0xf9,0x07,0x30,0x00,0x2b,0x0a,0xdb,0x0d,0x49,0x97,0xf9,0x07,0x30,0x3a,0x68,
  0xd2,0xb2,0x12,0x01,0xd2,0xb2,0x0b,0x44,0x83,0xf8,0x00,0x23,0x0a,0xe0,0x09,0x49,0xfb,0x79,0x03,0xf0,
  0x0f,0x03,0x04,0x3b,0x3a,0x68,0xd2,0xb2,0x12,0x01,0xd2,0xb2,0x0b,0x44,0x1a,0x76,0x00,0xbf,0x0c,0x37,
  0xbd,0x46,0x80,0xbc,0x70,0x47,0x00,0xbf,0x00,0xe1,0x00,0xe0,0x00,0xed,0x00,0xe0,0x80,0xb4,0x89,0xb0,
  0x00,0xaf,0xf8,0x60,0xb9,0x60,0x7a,0x60,0xfb,0x68,0x03,0xf0,0x07,0x03,0xfb,0x61,0xfb,0x69,0xc3,0xf1,
  0x07,0x03,0x04,0x2b,0x28,0xbf,0x04,0x23,0xbb,0x61,0xfb,0x69,0x04,0x33,0x06,0x2b,0x02,0xd9,0xfb,0x69,
  0x03,0x3b,0x00,0xe0,0x00,0x23,0x7b,0x61,0x01,0x22,0xbb,0x69,0x02,0xfa,0x03,0xf3,0x5a,0x1e,0xbb,0x68,
  0x1a,0x40,0x7b,0x69,0x9a,0x40,0x01,0x21,0x7b,0x69,0x01,0xfa,0x03,0xf3,0x59,0x1e,0x7b,0x68,0x0b,0x40,
  0x13,0x43,0x18,0x46,0x24,0x37,0xbd,0x46,0x80,0xbc,0x70,0x47,0x80,0xb5,0x82,0xb0,0x00,0xaf,0x78,0x60,
  0x7b,0x68,0x01,0x3b,0xb3,0xf1,0x80,0x7f,0x01,0xd3,0x01,0x23,0x0f,0xe0,0x0a,0x4a,0x7b,0x68,0x01,0x3b,
  0x53,0x60,0x0f,0x21,0x4f,0xf0,0xff,0x30,0xff,0xf7,0x92,0xff,0x05,0x4b,0x00,0x22,0x9a,0x60,0x04,0x4b,
  0x07,0x22,0x1a,0x60,0x00,0x23,0x18,0x46,0x08,0x37,0xbd,0x46,0x80,0xbd,0x00,0xbf,0x10,0xe0,0x00,0xe0,
  0x80,0xb5,0x82,0xb0,0x00,0xaf,0x78,0x60,0x78,0x68,0xff,0xf7,0x4b,0xff,0x00,0xbf,0x08,0x37,0xbd,0x46,
  0x80,0xbd,0x80,0xb5,0x86,0xb0,0x00,0xaf,0x03,0x46,0xb9,0x60,0x7a,0x60,0xfb,0x73,0x00,0x23,0x7b,0x61,
  0xff,0xf7,0x60,0xff,0x78,0x61,0x7a,0x68,0xb9,0x68,0x78,0x69,0xff,0xf7,0x92,0xff,0x02,0x46,0x97,0xf9,
  0x0f,0x30,0x11,0x46,0x18,0x46,0xff,0xf7,0x61,0xff,0x00,0xbf,0x18,0x37,0xbd,0x46,0x80,0xbd,0x80,0xb5,
  0x82,0xb0,0x00,0xaf,0x78,0x60,0x78,0x68,0xff,0xf7,0xb0,0xff,0x03,0x46,0x18,0x46,0x08,0x37,0xbd,0x46,
  0x80,0xbd,0x00,0x00,0x80,0xb4,0x8b,0xb0,0x00,0xaf,0x78,0x60,0x39,0x60,0x00,0x23,0x7b,0x62,0x00,0x23,
  0x3b,0x62,0x27,0xe1,0x01,0x22,0x7b,0x6a,0x02,0xfa,0x03,0xf3,0xfb,0x61,0x3b,0x68,0x1a,0x68,0xfb,0x69,
  0x13,0x40,0xbb,0x61,0xba,0x69,0xfb,0x69,0x9a,0x42,0x40,0xf0,0x16,0x81,0x3b,0x68,0x5b,0x68,0x12,0x2b,
  0x34,0xd0,0x12,0x2b,0x0d,0xd8,0x02,0x2b,0x2b,0xd0,0x02,0x2b,0x04,0xd8,0x00,0x2b,0x31,0xd0,0x01,0x2b,
  0x1c,0xd0,0x48,0xe0,0x03,0x2b,0x43,0xd0,0x11,0x2b,0x1b,0xd0,0x43,0xe0,0x89,0x4a,0x93,0x42,0x26,0xd0,
  0x87,0x4a,0x93,0x42,0x06,0xd8,0x87,0x4a,0x93,0x42,0x20,0xd0,0x86,0x4a,0x93,0x42,0x1d,0xd0,0x36,0xe0,
  0x85,0x4a,0x93,0x42,0x19,0xd0,0x85,0x4a,0x93,0x42,0x16,0xd0,0x84,0x4a,0x93,0x42,0x13,0xd0,0x2c,0xe0,
  0x3b,0x68,0xdb,0x68,0x3b,0x62,0x28,0xe0,0x3b,0x68,0xdb,0x68,0x04,0x33,0x3b,0x62,0x23,0xe0,0x3b,0x68,
  0xdb,0x68,0x08,0x33,0x3b,0x62,0x1e,0xe0,0x3b,0x68,0xdb,0x68,0x0c,0x33,0x3b,0x62,0x19,0xe0,0x3b,0x68,
  0x9b,0x68,0x00,0x2b,0x02,0xd1,0x04,0x23,0x3b,0x62,0x12,0xe0,0x3b,0x68,0x9b,0x68,0x01,0x2b,0x05,0xd1,
  0x08,0x23,0x3b,0x62,0x7b,0x68,0xfa,0x69,0x1a,0x61,0x08,0xe0,0x08,0x23,0x3b,0x62,0x7b,0x68,0xfa,0x69,
  0x5a,0x61,0x02,0xe0,0x00,0x23,0x3b,0x62,0x00,0xbf,0xbb,0x69,0xff,0x2b,0x01,0xd8,0x7b,0x68,0x01,0xe0,
  0x7b,0x68,0x04,0x33,0x7b,0x61,0xbb,0x69,0xff,0x2b,0x02,0xd8,0x7b,0x6a,0x9b,0x00,0x02,0xe0,0x7b,0x6a,
  0x08,0x3b,0x9b,0x00,0x3b,0x61,0x7b,0x69,0x1a,0x68,0x0f,0x21,0x3b,0x69,0x01,0xfa,0x03,0xf3,0xdb,0x43,
  0x1a,0x40,0x39,0x6a,0x3b,0x69,0x01,0xfa,0x03,0xf3,0x1a,0x43,0x7b,0x69,0x1a,0x60,0x3b,0x68,0x5b,0x68,
  0x03,0xf0,0x80,0x53,0x00,0x2b,0x00,0xf0,0x96,0x80,0x59,0x4a,0x58,0x4b,0x9b,0x69,0x43,0xf0,0x01,0x03,
  0x93,0x61,0x56,0x4b,0x9b,0x69,0x03,0xf0,0x01,0x03,0xbb,0x60,0xbb,0x68,0x54,0x4a,0x7b,0x6a,0x9b,0x08,
  0x02,0x33,0x52,0xf8,0x23,0x30,0xfb,0x60,0x7b,0x6a,0x03,0xf0,0x03,0x03,0x9b,0x00,0x0f,0x22,0x02,0xfa,
  0x03,0xf3,0xdb,0x43,0xfa,0x68,0x13,0x40,0xfb,0x60,0x7b,0x68,0x4b,0x4a,0x93,0x42,0x13,0xd0,0x7b,0x68,
  0x4a,0x4a,0x93,0x42,0x0d,0xd0,0x7b,0x68,0x49,0x4a,0x93,0x42,0x07,0xd0,0x7b,0x68,0x48,0x4a,0x93,0x42,
  0x01,0xd1,0x03,0x23,0x06,0xe0,0x04,0x23,0x04,0xe0,0x02,0x23,0x02,0xe0,0x01,0x23,0x00,0xe0,0x00,0x23,
  0x7a,0x6a,0x02,0xf0,0x03,0x02,0x92,0x00,0x93,0x40,0xfa,0x68,0x13,0x43,0xfb,0x60,0x3a,0x49,0x7b,0x6a,
  0x9b,0x08,0x02,0x33,0xfa,0x68,0x41,0xf8,0x23,0x20,0x3b,0x68,0x5b,0x68,0x03,0xf4,0x80,0x33,0x00,0x2b,
  0x06,0xd0,0x39,0x49,0x38,0x4b,0x1a,0x68,0xbb,0x69,0x13,0x43,0x0b,0x60,0x06,0xe0,0x35,0x49,0x35,0x4b,
  0x1a,0x68,0xbb,0x69,0xdb,0x43,0x13,0x40,0x0b,0x60,0x3b,0x68,0x5b,0x68,0x03,0xf4,0x00,0x33,0x00,0x2b,
  0x06,0xd0,0x2f,0x49,0x2e,0x4b,0x5a,0x68,0xbb,0x69,0x13,0x43,0x4b,0x60,0x06,0xe0,0x2b,0x49,0x2b,0x4b,
  0x5a,0x68,0xbb,0x69,0xdb,0x43,0x13,0x40,0x4b,0x60,0x3b,0x68,0x5b,0x68,0x03,0xf4,0x80,0x13,0x00,0x2b,
  0x06,0xd0,0x25,0x49,0x24,0x4b,0x9a,0x68,0xbb,0x69,0x13,0x43,0x8b,0x60,0x06,0xe0,0x21,0x49,0x21,0x4b,
  0x9a,0x68,0xbb,0x69,0xdb,0x43,0x13,0x40,0x8b,0x60,0x3b,0x68,0x5b,0x68,0x03,0xf4,0x00,0x13,0x00,0x2b,
  0x06,0xd0,0x1b,0x49,0x1a,0x4b,0xda,0x68,0xbb,0x69,0x13,0x43,0xcb,0x60,0x06,0xe0,0x17,0x49,0x17,0x4b,
  0xda,0x68,0xbb,0x69,0xdb,0x43,0x13,0x40,0xcb,0x60,0x7b,0x6a,0x01,0x33,0x7b,0x62,0x3b,0x68,0x1a,0x68,
  0x7b,0x6a,0x22,0xfa,0x03,0xf3,0x00,0x2b,0x7f,0xf4,0xd0,0xae,0x00,0xbf,0x2c,0x37,0xbd,0x46,0x80,0xbc,
  0x70,0x47,0x00,0xbf,0x00,0x00,0x21,0x10,0x00,0x00,0x11,0x10,0x00,0x00,0x12,0x10,0x00,0x00,0x31,0x10,
  0x00,0x00,0x32,0x10,0x00,0x00,0x22,0x10,0x00,0x10,0x02,0x40,0x00,0x00,0x01,0x40,0x00,0x08,0x01,0x40,
  0x00,0x0c,0x01,0x40,0x00,0x10,0x01,0x40,0x00,0x14,0x01,0x40,0x00,0x04,0x01,0x40,0x80,0xb4,0x83,0xb0,
  0x00,0xaf,0x78,0x60,0x0b,0x46,0x7b,0x80,0x13,0x46,0x7b,0x70,0x7b,0x78,0x00,0x2b,0x03,0xd0,0x7a,0x88,
  0x7b,0x68,0x1a,0x61,0x03,0xe0,0x7b,0x88,0x1a,0x04,0x7b,0x68,0x1a,0x61,0x00,0xbf,0x0c,0x37,0xbd,0x46,
  0x80,0xbc,0x70,0x47,0x80,0xb4,0x85,0xb0,0x00,0xaf,0x78,0x60,0x0b,0x46,0x7b,0x80,0x7b,0x68,0xdb,0x68,
  0xfb,0x60,0x7a,0x88,0xfb,0x68,0x13,0x40,0x1a,0x04,0xfb,0x68,0xd9,0x43,0x7b,0x88,0x0b,0x40,0x1a,0x43,
  0x7b,0x68,0x1a,0x61,0x00,0xbf,0x14,0x37,0xbd,0x46,0x80,0xbc,0x70,0x47,0x00,0x00,0x80,0xb5,0x86,0xb0,
  0x00,0xaf,0x78,0x60,0x7b,0x68,0x00,0x2b,0x01,0xd1,0x01,0x23,0x6c,0xe2,0x7b,0x68,0x1b,0x68,0x03,0xf0,
  0x01,0x03,0x00,0x2b,0x00,0xf0,0x87,0x80,0x92,0x4b,0x5b,0x68,0x03,0xf0,0x0c,0x03,0x04,0x2b,0x0c,0xd0,
  0x8f,0x4b,0x5b,0x68,0x03,0xf0,0x0c,0x03,0x08,0x2b,0x12,0xd1,0x8c,0x4b,0x5b,0x68,0x03,0xf4,0x80,0x33,
  0xb3,0xf5,0x80,0x3f,0x0b,0xd1,0x89,0x4b,0x1b,0x68,0x03,0xf4,0x00,0x33,0x00,0x2b,0x6c,0xd0,0x7b,0x68,
  0x5b,0x68,0x00,0x2b,0x68,0xd1,0x01,0x23,0x46,0xe2,0x7b,0x68,0x5b,0x68,0xb3,0xf5,0x80,0x3f,0x06,0xd1,
  0x80,0x4a,0x80,0x4b,0x1b,0x68,0x43,0xf4,0x80,0x33,0x13,0x60,0x2e,0xe0,0x7b,0x68,0x5b,0x68,0x00,0x2b,
  0x0c,0xd1,0x7b,0x4a,0x7a,0x4b,0x1b,0x68,0x23,0xf4,0x80,0x33,0x13,0x60,0x78,0x4a,0x77,0x4b,0x1b,0x68,
  0x23,0xf4,0x80,0x23,0x13,0x60,0x1d,0xe0,0x7b,0x68,0x5b,0x68,0xb3,0xf5,0xa0,0x2f,0x0c,0xd1,0x72,0x4a,
  0x71,0x4b,0x1b,0x68,0x43,0xf4,0x80,0x23,0x13,0x60,0x6f,0x4a,0x6e,0x4b,0x1b,0x68,0x43,0xf4,0x80,0x33,
  0x13,0x60,0x0b,0xe0,0x6b,0x4a,0x6b,0x4b,0x1b,0x68,0x23,0xf4,0x80,0x33,0x13,0x60,0x68,0x4a,0x68,0x4b,
  0x1b,0x68,0x23,0xf4,0x80,0x23,0x13,0x60,0x7b,0x68,0x5b,0x68,0x00,0x2b,0x13,0xd0,0xff,0xf7,0xf6,0xfc,
  0x38,0x61,0x08,0xe0,0xff,0xf7,0xf2,0xfc,0x02,0x46,0x3b,0x69,0xd3,0x1a,0x64,0x2b,0x01,0xd9,0x03,0x23,
  0xfa,0xe1,0x5d,0x4b,0x1b,0x68,0x03,0xf4,0x00,0x33,0x00,0x2b,0xf0,0xd0,0x14,0xe0,0xff,0xf7,0xe2,0xfc,
  0x38,0x61,0x08,0xe0,0xff,0xf7,0xde,0xfc,0x02,0x46,0x3b,0x69,0xd3,0x1a,0x64,0x2b,0x01,0xd9,0x03,0x23,
  0xe6,0xe1,0x53,0x4b,0x1b,0x68,0x03,0xf4,0x00,0x33,0x00,0x2b,0xf0,0xd1,0x00,0xe0,0x00,0xbf,0x7b,0x68,
  0x1b,0x68,0x03,0xf0,0x02,0x03,0x00,0x2b,0x63,0xd0,0x4c,0x4b,0x5b,0x68,0x03,0xf0,0x0c,0x03,0x00,0x2b,
  0x0b,0xd0,0x49,0x4b,0x5b,0x68,0x03,0xf0,0x0c,0x03,0x08,0x2b,0x1c,0xd1,0x46,0x4b,0x5b,0x68,0x03,0xf4,
  0x80,0x33,0x00,0x2b,0x16,0xd1,0x43,0x4b,0x1b,0x68,0x03,0xf0,0x02,0x03,0x00,0x2b,0x05,0xd0,0x7b,0x68,
  0x1b,0x69,0x01,0x2b,0x01,0xd0,0x01,0x23,0xba,0xe1,0x3d,0x49,0x3c,0x4b,0x1b,0x68,0x23,0xf0,0xf8,0x02,
  0x7b,0x68,0x5b,0x69,0xdb,0x00,0x13,0x43,0x0b,0x60,0x3a,0xe0,0x7b,0x68,0x1b,0x69,0x00,0x2b,0x20,0xd0,
  0x36,0x4b,0x01,0x22,0x1a,0x60,0xff,0xf7,0x97,0xfc,0x38,0x61,0x08,0xe0,0xff,0xf7,0x93,0xfc,0x02,0x46,
  0x3b,0x69,0xd3,0x1a,0x02,0x2b,0x01,0xd9,0x03,0x23,0x9b,0xe1,0x2d,0x4b,0x1b,0x68,0x03,0xf0,0x02,0x03,
  0x00,0x2b,0xf0,0xd0,0x2a,0x49,0x2a,0x4b,0x1b,0x68,0x23,0xf0,0xf8,0x02,0x7b,0x68,0x5b,0x69,0xdb,0x00,
  0x13,0x43,0x0b,0x60,0x15,0xe0,0x26,0x4b,0x00,0x22,0x1a,0x60,0xff,0xf7,0x76,0xfc,0x38,0x61,0x08,0xe0,
  0xff,0xf7,0x72,0xfc,0x02,0x46,0x3b,0x69,0xd3,0x1a,0x02,0x2b,0x01,0xd9,0x03,0x23,0x7a,0xe1,0x1d,0x4b,
  0x1b,0x68,0x03,0xf0,0x02,0x03,0x00,0x2b,0xf0,0xd1,0x7b,0x68,0x1b,0x68,0x03,0xf0,0x08,0x03,0x00,0x2b,
  0x3a,0xd0,0x7b,0x68,0x9b,0x69,0x00,0x2b,0x19,0xd0,0x17,0x4b,0x01,0x22,0x1a,0x60,0xff,0xf7,0x56,0xfc,
  0x38,0x61,0x08,0xe0,0xff,0xf7,0x52,0xfc,0x02,0x46,0x3b,0x69,0xd3,0x1a,0x02,0x2b,0x01,0xd9,0x03,0x23,
  0x5a,0xe1,0x0d,0x4b,0x5b,0x6a,0x03,0xf0,0x02,0x03,0x00,0x2b,0xf0,0xd0,0x01,0x20,0x00,0xf0,0xa8,0xfa,
  0x1c,0xe0,0x0a,0x4b,0x00,0x22,0x1a,0x60,0xff,0xf7,0x3c,0xfc,0x38,0x61,0x0f,0xe0,0xff,0xf7,0x38,0xfc,
  0x02,0x46,0x3b,0x69,0xd3,0x1a,0x02,0x2b,0x08,0xd9,0x03,0x23,0x40,0xe1,0x00,0xbf,0x00,0x10,0x02,0x40,
  0x00,0x00,0x42,0x42,0x80,0x04,0x42,0x42,0x9e,0x4b,0x5b,0x6a,0x03,0xf0,0x02,0x03,0x00,0x2b,0xe9,0xd1,
  0x7b,0x68,0x1b,0x68,0x03,0xf0,0x04,0x03,0x00,0x2b,0x00,0xf0,0xa6,0x80,0x00,0x23,0xfb,0x75,0x97,0x4b,
  0xdb,0x69,0x03,0xf0,0x80,0x53,0x00,0x2b,0x0d,0xd1,0x94,0x4a,0x93,0x4b,0xdb,0x69,0x43,0xf0,0x80,0x53,
  0xd3,0x61,0x91,0x4b,0xdb,0x69,0x03,0xf0,0x80,0x53,0xbb,0x60,0xbb,0x68,0x01,0x23,0xfb,0x75,0x8e,0x4b,
  0x1b,0x68,0x03,0xf4,0x80,0x73,0x00,0x2b,0x18,0xd1,0x8b,0x4a,0x8a,0x4b,0x1b,0x68,0x43,0xf4,0x80,0x73,
  0x13,0x60,0xff,0xf7,0xf9,0xfb,0x38,0x61,0x08,0xe0,0xff,0xf7,0xf5,0xfb,0x02,0x46,0x3b,0x69,0xd3,0x1a,
  0x64,0x2b,0x01,0xd9,0x03,0x23,0xfd,0xe0,0x81,0x4b,0x1b,0x68,0x03,0xf4,0x80,0x73,0x00,0x2b,0xf0,0xd0,
  0x7b,0x68,0xdb,0x68,0x01,0x2b,0x06,0xd1,0x7b,0x4a,0x7b,0x4b,0x1b,0x6a,0x43,0xf0,0x01,0x03,0x13,0x62,
  0x2d,0xe0,0x7b,0x68,0xdb,0x68,0x00,0x2b,0x0c,0xd1,0x76,0x4a,0x75,0x4b,0x1b,0x6a,0x23,0xf0,0x01,0x03,
  0x13,0x62,0x73,0x4a,0x72,0x4b,0x1b,0x6a,0x23,0xf0,0x04,0x03,0x13,0x62,0x1c,0xe0,0x7b,0x68,0xdb,0x68,
  0x05,0x2b,0x0c,0xd1,0x6d,0x4a,0x6d,0x4b,0x1b,0x6a,0x43,0xf0,0x04,0x03,0x13,0x62,0x6a,0x4a,0x6a,0x4b,
  0x1b,0x6a,0x43,0xf0,0x01,0x03,0x13,0x62,0x0b,0xe0,0x67,0x4a,0x66,0x4b,0x1b,0x6a,0x23,0xf0,0x01,0x03,
  0x13,0x62,0x64,0x4a,0x63,0x4b,0x1b,0x6a,0x23,0xf0,0x04,0x03,0x13,0x62,0x7b,0x68,0xdb,0x68,0x00,0x2b,
  0x15,0xd0,0xff,0xf7,0xa9,0xfb,0x38,0x61,0x0a,0xe0,0xff,0xf7,0xa5,0xfb,0x02,0x46,0x3b,0x69,0xd3,0x1a,
  0x41,0xf2,0x88,0x32,0x93,0x42,0x01,0xd9,0x03,0x23,0xab,0xe0,0x57,0x4b,0x1b,0x6a,0x03,0xf0,0x02,0x03,
  0x00,0x2b,0xee,0xd0,0x14,0xe0,0xff,0xf7,0x93,0xfb,0x38,0x61,0x0a,0xe0,0xff,0xf7,0x8f,0xfb,0x02,0x46,
  0x3b,0x69,0xd3,0x1a,0x41,0xf2,0x88,0x32,0x93,0x42,0x01,0xd9,0x03,0x23,0x95,0xe0,0x4c,0x4b,0x1b,0x6a,
  0x03,0xf0,0x02,0x03,0x00,0x2b,0xee,0xd1,0xfb,0x7d,0x01,0x2b,0x05,0xd1,0x48,0x4a,0x47,0x4b,0xdb,0x69,
  0x23,0xf0,0x80,0x53,0xd3,0x61,0x7b,0x68,0xdb,0x69,0x00,0x2b,0x00,0xf0,0x81,0x80,0x42,0x4b,0x5b,0x68,
  0x03,0xf0,0x0c,0x03,0x08,0x2b,0x61,0xd0,0x7b,0x68,0xdb,0x69,0x02,0x2b,0x46,0xd1,0x3f,0x4b,0x00,0x22,
  0x1a,0x60,0xff,0xf7,0x63,0xfb,0x38,0x61,0x08,0xe0,0xff,0xf7,0x5f,0xfb,0x02,0x46,0x3b,0x69,0xd3,0x1a,
  0x02,0x2b,0x01,0xd9,0x03,0x23,0x67,0xe0,0x35,0x4b,0x1b,0x68,0x03,0xf0,0x00,0x73,0x00,0x2b,0xf0,0xd1,
  0x7b,0x68,0x1b,0x6a,0xb3,0xf5,0x80,0x3f,0x08,0xd1,0x30,0x49,0x2f,0x4b,0x5b,0x68,0x23,0xf4,0x00,0x32,
  0x7b,0x68,0x9b,0x68,0x13,0x43,0x4b,0x60,0x2b,0x48,0x2b,0x4b,0x5b,0x68,0x23,0xf4,0x74,0x12,0x7b,0x68,
  0x19,0x6a,0x7b,0x68,0x5b,0x6a,0x0b,0x43,0x13,0x43,0x43,0x60,0x27,0x4b,0x01,0x22,0x1a,0x60,0xff,0xf7,
  0x33,0xfb,0x38,0x61,0x08,0xe0,0xff,0xf7,0x2f,0xfb,0x02,0x46,0x3b,0x69,0xd3,0x1a,0x02,0x2b,0x01,0xd9,
  0x03,0x23,0x37,0xe0,0x1d,0x4b,0x1b,0x68,0x03,0xf0,0x00,0x73,0x00,0x2b,0xf0,0xd0,0x2f,0xe0,0x1c,0x4b,
  0x00,0x22,0x1a,0x60,0xff,0xf7,0x1c,0xfb,0x38,0x61,0x08,0xe0,0xff,0xf7,0x18,0xfb,0x02,0x46,0x3b,0x69,
  0xd3,0x1a,0x02,0x2b,0x01,0xd9,0x03,0x23,0x20,0xe0,0x12,0x4b,0x1b,0x68,0x03,0xf0,0x00,0x73,0x00,0x2b,
  0xf0,0xd1,0x18,0xe0,0x7b,0x68,0xdb,0x69,0x01,0x2b,0x01,0xd1,0x01,0x23,0x13,0xe0,0x0b,0x4b,0x5b,0x68,
  0xfb,0x60,0xfb,0x68,0x03,0xf4,0x80,0x32,0x7b,0x68,0x1b,0x6a,0x9a,0x42,0x06,0xd1,0xfb,0x68,0x03,0xf4,
  0x70,0x12,0x7b,0x68,0x5b,0x6a,0x9a,0x42,0x01,0xd0,0x01,0x23,0x00,0xe0,0x00,0x23,0x18,0x46,0x18,0x37,
  0xbd,0x46,0x80,0xbd,0x00,0x10,0x02,0x40,0x00,0x70,0x00,0x40,0x60,0x00,0x42,0x42,0x80,0xb5,0x84,0xb0,
  0x00,0xaf,0x78,0x60,0x39,0x60,0x7b,0x68,0x00,0x2b,0x01,0xd1,0x01,0x23,0xd0,0xe0,0x6a,0x4b,0x1b,0x68,
  0x03,0xf0,0x07,0x02,0x3b,0x68,0x9a,0x42,0x10,0xd2,0x67,0x49,0x66,0x4b,0x1b,0x68,0x23,0xf0,0x07,0x02,
  0x3b,0x68,0x13,0x43,0x0b,0x60,0x63,0x4b,0x1b,0x68,0x03,0xf0,0x07,0x02,0x3b,0x68,0x9a,0x42,0x01,0xd0,
  0x01,0x23,0xb8,0xe0,0x7b,0x68,0x1b,0x68,0x03,0xf0,0x02,0x03,0x00,0x2b,0x20,0xd0,0x7b,0x68,0x1b,0x68,
  0x03,0xf0,0x04,0x03,0x00,0x2b,0x05,0xd0,0x59,0x4a,0x59,0x4b,0x5b,0x68,0x43,0xf4,0xe0,0x63,0x53,0x60,
  0x7b,0x68,0x1b,0x68,0x03,0xf0,0x08,0x03,0x00,0x2b,0x05,0xd0,0x53,0x4a,0x53,0x4b,0x5b,0x68,0x43,0xf4,
  0x60,0x53,0x53,0x60,0x50,0x49,0x50,0x4b,0x5b,0x68,0x23,0xf0,0xf0,0x02,0x7b,0x68,0x9b,0x68,0x13,0x43,
  0x4b,0x60,0x7b,0x68,0x1b,0x68,0x03,0xf0,0x01,0x03,0x00,0x2b,0x40,0xd0,0x7b,0x68,0x5b,0x68,0x01,0x2b,
  0x07,0xd1,0x47,0x4b,0x1b,0x68,0x03,0xf4,0x00,0x33,0x00,0x2b,0x15,0xd1,0x01,0x23,0x7f,0xe0,0x7b,0x68,
  0x5b,0x68,0x02,0x2b,0x07,0xd1,0x41,0x4b,0x1b,0x68,0x03,0xf0,0x00,0x73,0x00,0x2b,0x09,0xd1,0x01,0x23,
  0x73,0xe0,0x3d,0x4b,0x1b,0x68,0x03,0xf0,0x02,0x03,0x00,0x2b,0x01,0xd1,0x01,0x23,0x6b,0xe0,0x39,0x49,
  0x38,0x4b,0x5b,0x68,0x23,0xf0,0x03,0x02,0x7b,0x68,0x5b,0x68,0x13,0x43,0x4b,0x60,0xff,0xf7,0x6c,0xfa,
  0xf8,0x60,0x0a,0xe0,0xff,0xf7,0x68,0xfa,0x02,0x46,0xfb,0x68,0xd3,0x1a,0x41,0xf2,0x88,0x32,0x93,0x42,
  0x01,0xd9,0x03,0x23,0x53,0xe0,0x2d,0x4b,0x5b,0x68,0x03,0xf0,0x0c,0x02,0x7b,0x68,0x5b,0x68,0x9b,0x00,
  0x9a,0x42,0xeb,0xd1,0x27,0x4b,0x1b,0x68,0x03,0xf0,0x07,0x02,0x3b,0x68,0x9a,0x42,0x10,0xd9,0x24,0x49,
  0x23,0x4b,0x1b,0x68,0x23,0xf0,0x07,0x02,0x3b,0x68,0x13,0x43,0x0b,0x60,0x20,0x4b,0x1b,0x68,0x03,0xf0,
  0x07,0x02,0x3b,0x68,0x9a,0x42,0x01,0xd0,0x01,0x23,0x32,0xe0,0x7b,0x68,0x1b,0x68,0x03,0xf0,0x04,0x03,
  0x00,0x2b,0x08,0xd0,0x19,0x49,0x19,0x4b,0x5b,0x68,0x23,0xf4,0xe0,0x62,0x7b,0x68,0xdb,0x68,0x13,0x43,
  0x4b,0x60,0x7b,0x68,0x1b,0x68,0x03,0xf0,0x08,0x03,0x00,0x2b,0x09,0xd0,0x12,0x49,0x11,0x4b,0x5b,0x68,
  0x23,0xf4,0x60,0x52,0x7b,0x68,0x1b,0x69,0xdb,0x00,0x13,0x43,0x4b,0x60,0x00,0xf0,0x21,0xf8,0x01,0x46,
  0x0b,0x4b,0x5b,0x68,0x1b,0x09,0x03,0xf0,0x0f,0x03,0x0a,0x4a,0xd3,0x5c,0x21,0xfa,0x03,0xf3,0x09,0x4a,
  0x13,0x60,0x09,0x4b,0x1b,0x68,0x18,0x46,0xff,0xf7,0xca,0xf9,0x00,0x23,0x18,0x46,0x10,0x37,0xbd,0x46,
  0x80,0xbd,0x00,0xbf,0x00,0x20,0x02,0x40,0x00,0x10,0x02,0x40,0xec,0xd1,0x00,0x08,0x00,0x00,0x00,0x20,
  0x04,0x00,0x00,0x20,0x90,0xb4,0x8a,0xb0,0x00,0xaf,0x2a,0x4b,0x3c,0x1d,0x0f,0xcb,0x84,0xe8,0x0f,0x00,
  0x28,0x4b,0x1b,0x88,0x3b,0x80,0x00,0x23,0xfb,0x61,0x00,0x23,0xbb,0x61,0x00,0x23,0x7b,0x62,0x00,0x23,
  0x7b,0x61,0x00,0x23,0x3b,0x62,0x23,0x4b,0x5b,0x68,0xfb,0x61,0xfb,0x69,0x03,0xf0,0x0c,0x03,0x04,0x2b,
  0x02,0xd0,0x08,0x2b,0x03,0xd0,0x2d,0xe0,0x1e,0x4b,0x3b,0x62,0x2d,0xe0,0xfb,0x69,0x9b,0x0c,0x03,0xf0,
  0x0f,0x03,0x07,0xf1,0x28,0x02,0x13,0x44,0x13,0xf8,0x24,0x3c,0x7b,0x61,0xfb,0x69,0x03,0xf4,0x80,0x33,
  0x00,0x2b,0x13,0xd0,0x14,0x4b,0x5b,0x68,0x5b,0x0c,0x03,0xf0,0x01,0x03,0x07,0xf1,0x28,0x02,0x13,0x44,
  0x13,0xf8,0x28,0x3c,0xbb,0x61,0x7b,0x69,0x0f,0x4a,0x02,0xfb,0x03,0xf2,0xbb,0x69,0xb2,0xfb,0xf3,0xf3,
  0x7b,0x62,0x04,0xe0,0x7b,0x69,0x0c,0x4a,0x02,0xfb,0x03,0xf3,0x7b,0x62,0x7b,0x6a,0x3b,0x62,0x02,0xe0,
  0x07,0x4b,0x3b,0x62,0x00,0xbf,0x3b,0x6a,0x18,0x46,0x28,0x37,0xbd,0x46,0x90,0xbc,0x70,0x47,0x00,0xbf,
  0xd8,0xd1,0x00,0x08,0xe8,0xd1,0x00,0x08,0x00,0x10,0x02,0x40,0x00,0x12,0x7a,0x00,0x00,0x09,0x3d,0x00,
  0x80,0xb4,0x85,0xb0,0x00,0xaf,0x78,0x60,0x0a,0x4b,0x1b,0x68,0x0a,0x4a,0xa2,0xfb,0x03,0x23,0x5b,0x0a,
  0x7a,0x68,0x02,0xfb,0x03,0xf3,0xfb,0x60,0x00,0xbf,0xfb,0x68,0x5a,0x1e,0xfa,0x60,0x00,0x2b,0xf9,0xd1,
  0x00,0xbf,0x14,0x37,0xbd,0x46,0x80,0xbc,0x70,0x47,0x00,0xbf,0x00,0x00,0x00,0x20,0xd3,0x4d,0x62,0x10,
  0x00,0x21,0x03,0xe0,0x0b,0x4b,0x5b,0x58,0x43,0x50,0x04,0x31,0x0a,0x48,0x0b,0x4b,0x42,0x18,0x9a,0x42,
  0xf6,0xd3,0x0a,0x4a,0x02,0xe0,0x00,0x23,0x42,0xf8,0x04,0x3b,0x08,0x4b,0x9a,0x42,0xf9,0xd3,0xff,0xf7,
  0x09,0xf9,0x00,0xf0,0x0f,0xf8,0xfe,0xf7,0xff,0xff,0x70,0x47,0x04,0xd2,0x00,0x08,0x00,0x00,0x00,0x20,
  0x0c,0x00,0x00,0x20,0x0c,0x00,0x00,0x20,0x2c,0x00,0x00,0x20,0xfe,0xe7,0x00,0x00,0x70,0xb5,0x00,0x25,
  0x0c,0x4e,0x0d,0x4c,0xa4,0x1b,0xa4,0x10,0xa5,0x42,0x09,0xd1,0x00,0xf0,0x22,0xf8,0x00,0x25,0x0a,0x4e,
  0x0a,0x4c,0xa4,0x1b,0xa4,0x10,0xa5,0x42,0x05,0xd1,0x70,0xbd,0x56,0xf8,0x25,0x30,0x98,0x47,0x01,0x35,
  0xee,0xe7,0x56,0xf8,0x25,0x30,0x98,0x47,0x01,0x35,0xf2,0xe7,0xfc,0xd1,0x00,0x08,0xfc,0xd1,0x00,0x08,
  0xfc,0xd1,0x00,0x08,0x00,0xd2,0x00,0x08,0x03,0x46,0x02,0x44,0x93,0x42,0x00,0xd1,0x70,0x47,0x03,0xf8,
  0x01,0x1b,0xf9,0xe7,0xf8,0xb5,0x00,0xbf,0xf8,0xbc,0x08,0xbc,0x9e,0x46,0x70,0x47,0xf8,0xb5,0x00,0xbf,
  0xf8,0xbc,0x08,0xbc,0x9e,0x46,0x70,0x47,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,
  0x0e,0x0f,0x10,0x10,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,
  0x06,0x07,0x08,0x09,0x31,0xc1,0x00,0x08,0x0d,0xc1,0x00,0x08,0x00,0x24,0xf4,0x00,0x10,0x00,0x00,0x00,
  0x01,0x00,0x00,0x00};




uint16_t value = 0;
uint32_t x = 0;



for(uint32_t adres = APPLICATION_START_ADDRESS; adres < 4623 + APPLICATION_START_ADDRESS; adres = adres+2){

value = 0;
value = array[x+1] << 8;
value = value | array[x];

x = x+2;

Write_Flash(adres , value);
}
}

void Write_Flash (uint32_t adr, uint16_t data)
{
FLASH->KEYR=0x45670123;  // Silme veya yazma islemi yapilmadan önce Flash kilidi mutlaka açilmalidir.
  FLASH->KEYR=0xCDEF89AB; // FLASH->KEYR registerine KEY1 ve KEY2 degerleri atandiginda Flash kilidi açilir.
  FLASH->CR|=0x00000001;            //PG enable
  *(__IO uint16_t*)adr = data;      //istenen adrese istenen data yaziliyor
  while((FLASH->SR&0x00000001));    //Islem bitene kadar bekle(BUSY kontrol ediliyor)
FLASH->CR=0x00000080;    //FLASH_CR registeri resetlendiginde FLASH kiltlenmis olur
}
/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


ledblink kodu;
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
  HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
  HAL_Delay(500);

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

Kullandığım ide; Atollic True Studio
Kullandığım işlemci: STM32F103C8

Led blink uygulaması C portunun 13 numaralı bacağına bağlı ledi 500ms aralıklarla toggle etmektedir. Derleyiciye bin dosyası üretmesi gerekli ayarlamaları yaptım. Sırasıyla Proje dosyasına sağ tıklayarak; Properties//C/C++ Build//Settings//OutputFormat kısmından ConvertBuildOutput işaretlendikten sonra binary'i seçeceğiz.

Ardından kantirici üstad'ın paylaştığı web sayfasından üretmiş olduğumuz binary dosyasını yükleyip seçeneklerden C/C++ seçeneğini seçip array dosyası üretmemiz gerekecek. Daha sonra üretilen kodları kopyalayıp bootloader dosyasında programUpdate fonksiyonuna olduğu gibi yapıştırıyoruz. sonra açılışta programupdate fonksiyonunu çağırıyoruz. yüklüyor sonra programın olduğu kısıma jump edilip program çalışmaya başlıyor.


Şimdi üstadlar, biraz daha ileri seviyeye taşımak istiyorum işi.Bu konuda fikirlerinizi yönlendirmelerinizi bekliyorum. Yapmak istediğim işlemciyi tftp server ya da web server modunda çalıştırıp binary dosyasını işlemciye göndermek ve yeni programın çalışmasını sağlamak. Bunun için yazmış olduğum kod parçacığı aşağıda;


if(flagHtmlGen == 1){
   strcpy((char*)buf,"HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n");
   strcat((char*)buf, "<html><head>");
   strcat((char*)buf, "<title>Test</title>");
   strcat((char*)buf, "<link href='deneme' rel='stylesheet'></link>");
   strcat((char*)buf, "</head>");
   strcat((char*)buf, "<body>");
   strcat((char*)buf, "<div class='jumbotron'>");
   strcat((char*)buf, "<center><h1>Deneme</center></h1>");

   strcat((char*)buf, "<form action ='/upload.cgi' enctype='multipart/form-data' method='post'>");
   strcat((char*)buf, "<center><p>Please specify a binary file to upload into STM32F103C8 flash:</center>");
   strcat((char*)buf, "<br>");
   strcat((char*)buf, "<center><input type='file' name='datafile' size='40'></center>");
   strcat((char*)buf, " </p>");
   strcat((char*)buf, "<div>");
   strcat((char*)buf, "<center><input type='submit' value='Upload'></center>");
   strcat((char*)buf, "</div></form>");

   strcat((char*)buf, "</body>");
   strcat((char*)buf, "</html>");

   blocklen = strlen((char*)buf);

   ret = send(sn,buf,blocklen);
   if(ret < 0)
      {
         HAL_GPIO_WritePin(led1Port,led1Pin,1);
         close(sn);
         return ret;
      }
      else
      {
      HAL_GPIO_WritePin(led2Port,led2Pin,1);
      HTTP_reset(sn);
      disconnect(sn);
      }
   }

bu şekilde işlemciyi web server şeklinde çalıştırıp içerideki buffer'a veriyi alıyorum. ancak gelen veri web sayfasından gelen bir sürü verileride taşıyor. Bu verileri bir şekilde ayrıştırmam lazım. Biraz html bilgiside istiyor yapılacak işlem. Örneğin en basit haliyle bir login sayfası yapıp gelen verilerden şifre ve kullanıcı adı bilgisini nasıl alabilirim?  Yardımlarınızı bekliyorum.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: mfurkanuyar - 19 Kasım 2020, 11:41:45
https://mehmettopuz.net/uzaktan-gomulu-yazilim-guncelleme/.html faydalı bir yazı tavsiye ederim.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: gokhangokcen - 20 Kasım 2020, 14:11:53
@mfurkanuyar üstad, gördüm linki daha önceden. Arkadaş esp serisi ile yapmış ve TFTP server olarak uygulamış. Ben ise direkt browser ile girip medya dosyası yükler gibi binary dosyasını seçip işlemciyi güncellemek istiyorum.
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: gokhangokcen - 05 Ocak 2021, 17:09:24
@z üstad linkteki kütüphane vs.'nin seninle bir ilgisi yok dimi? W5500 ile program güncellemesi yapan bir link buldum. Kodları çözmeye anlamaya çalışıyorum. Soracak olduğum bir kaç şey vardı.
https://www.programmersought.com/article/61175072150/ (https://www.programmersought.com/article/61175072150/)
Başlık: Ynt: Uzaktan yazılım güncelleme
Gönderen: Emre_Tuncay_ - 05 Ocak 2021, 20:24:05
Aşağıdaki linkte stm32'nin ymodem dosya transferi kullanılarak bootloader tasarımı dökümanı var. Bu dökümanda proje dosyalarının linkleride verilmiş. .bin uzantılı dosyaların nasıl gönderileceği ile alakalı iyi bir fikir oluşturuyor. Bu dökümanda bahsedilen proje ile kendi bootloaderimi tasarladım. Bootloader kısmını kendim yazmıştım sadece uart'tan .bin dosyası aktarma işini örnek projeden aldım.

https://www.st.com/resource/en/application_note/dm00161366-stm32-inapplication-programming-iap-using-the-usart-stmicroelectronics.pdf