USB DFU ile Cihaz Yazılımı Güncellemek

Çalışacağı ortama bırakılmış, elektronik tabanlı donanıma sahip ürünlerin istenildiği zaman gerek fiziksel olarak cihaz ile aynı ortamda bulunarak gerek ise uzaktan yazılımlarını güncelleyebilmek önemli bir özellik.

STM firması bu özelliğin farkında ve üretim sırasında işlemcinin ROM bölgesinde işlemcinin bazı çevresel birimleri üzerinden, ürünün yazılımını güncelleyebilmenize olanak sağlayan bir bootloadera sahip.

Bu bootloader bölgesine donanım pinleri üzerinden yapacağınız konfigürasyon ile geçebileceğiniz gibi runtime sırasında da bu bölgeye geçebilmektesiniz. Bugün bu yazılımsal süreci adım adım gerçekleştireceğiz.

Kullanacağımız Donanım ve Program Araçları :

Teknik Dökümanlar :

Öncelikle ‘AN2606’ uygulama notu üzerinden bu bootloader’ın işlemci serimiz için hangi adres aralığında yer aldığına bakalım.

Görsel üzerinden görüldüğü gibi, kullanacağımız işlemci serisi için bu bootloader bölgesi 0x1FF00000 adresinden başlamakta. İşlemci serisinize göre bu adres değeri değişiklik gösterebilir. Tablo 76-80. içeriklerinden hangi çevre birimler için destek verdiğini ve ilgili açıklamaları bu not üzerinden görebilirsiniz.

Biz çevre birimlerinden USB kullanacağız ve geliştirme kitimizi DFU moda alarak yazılım güncellemesi gerçekleştireceğiz.

Hafıza alanında kendi programınızdan bağımsız, başka bir program bölgesine geçiş yapmak ve o programı koşturmak için izlememiz gerekenler bazı rutinler var. Bunlar ;

  • RCC değerlerimizi default duruma getirmek
  • SysTick timerini pasifize etmek ve değerlerini sıfırlamak
  • IRQ pasifize etmek. (Eğer USB çevre birimini kullanacaksanız, bunu yapmamalısınız, usb protokolü interrupt mekanizmasına dayanır.)
  • Atlama yapacağımız adres değerini +4 offset vermek. (4 ofset vermemizin sebebi zıplayacağımız yerde bulunan vector tablosunda (startup_stm32f746xx dosyasında bulabilirsiniz.). Reset Handler ikinci sırada bulunan bir fonksiyon göstericisi ve word cinsinden adreslendiği için + 4 eklemekteyiz.)

__Vectors       DCD     __initial_sp               ; Top of Stack

                DCD     Reset_Handler              ; Reset Handler

  • Geçiş yapacağımız bölgede bulunan MSP değerini, ilgili lokasyona atlamadan önce set etmek. Yukarıda göreceğiniz gibi, herhangi bir ofset değeri vermemize gerek yok ilgili adreste bulunan değeri alabilmek için.
  • Öncesinde adres ataması yaptığımız fonksiyona çağrı.

CubeMx programından kartımız için temel ayarları yaptığımız bir programı generate edip, debug modda başlatıyorum. “Memory” penceresine ilgili adresi yazıyorum ve ilgili konumun boş olmadığını doğruluyorum. (CubeMx süreçlerine değinmeyeceğim.)

Şimdi gelin yukarda bahsettiğimiz adımları derleyicimizin anlayacağı dile dökelim.

/* System Memory is on 0x1FF0 0000 */
#define SYSTEM_BOOTLOADER_ADR 0x1FF00000

typedef void (*JumpFunc)(void);
JumpFunc Jump;

void Jump_To_System_Bootloader(void)
{
	/* Resets the RCC clock configuration to the default reset state. */
	HAL_RCC_DeInit();
	
	/* This function de-Initializes common part of the HAL and stops the 
        systick. */
	HAL_DeInit();
	
	/* to default values */
	SysTick->LOAD = SysTick->VAL = 0;
	
	/* Set memory location of bootloader application  */
	const uint32_t addr = *(uint32_t *)(SYSTEM_BOOTLOADER_ADR + 4);
	Jump = (JumpFunc)addr;
	
	/*  Set main stack pointer */
	__set_MSP(*(uint32_t *) SYSTEM_BOOTLOADER_ADR);
	
	/* Let's Fire,
           It should branch to Bootloader region, 
	*/
	Jump();
	
	while(1);
}

Senaryonuza uygun bir biçimde, fonksiyona çağrı yapabilirsiniz. Şu an için cihaz ayağa kalktığında kendisini dfu moda alacak bir senaryoda geliştirme kitimize yükleme yapıyoruz. Kit üzerinde bir adet “USER USB” portu bulunmakta. Bu portu kullanarak cihazı bilgisayarımıza takıyoruz. Yukarda daha öncesinde linklediğim USB DFU Software programının kurulumunun ardından, görsel üzerinde belirttiğim adımları konuşalım.

  1. DFU moda geçiş yapmış olan STM32 cihazlarının bulunduğu liste.
  2. Yazılım yükleme sonrasında otomatik olarak doğrulama işlemini gerçekleştirmesi için işaretliyoruz.
  3. .dfu uzantılı dosyamızı seçiyoruz.
  4. Ve yükleme işlemini gerçekleştiriyoruz.

Bu işlem sonrasında Progress Bar üzerinde Target 00 : Verify Successful !” yazısını almamız gerekmekte. Leave DFU mode diyerek, dfu modundan çıkıyoruz. Yükleme süreci için STM firmasının teknik dökümanına şuradan ulaşabilirsiniz.

Bingoow ! Enerji Dolu Günlere !

One comment

Bir Cevap Yazın

Please log in using one of these methods to post your comment:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s