Günümüzde giderek daha fazla gömülü cihaz, indirme programlarına gerek kalmadan uzaktan otomatik güncellemeleri desteklemekte ve bu da cihaz bakımını son derece kolay hale getirmektedir. Bir cihazda uzaktan güncellemeleri etkinleştirmek için, güncelleme sürecini destekleyen bir program kodu yazmamız gerekir. Bu programa genellikle BootLoader adı verilir.
Esasen, cihazın program kodu iki bölüme ayrılır: BootLoader ve APP. BootLoader, APP'yi güncellemekten ve çalıştırılmasını başlatmaktan sorumludur. APP ise cihazın operasyonel işlevlerini uygulamaktan sorumludur ve esasen cihazın temel işlevselliğini barındırır.
Cortex-M serisi mikrodenetleyicilerde, BootLoader'dan APP'ye güvenli bir geçiş sağlamak için belirli yapılandırmalar gerekir. Bu makale, STM32 mikrodenetleyicileri örnek alarak, BootLoader'dan APP'ye başarılı bir geçişi gerçekleştirmek için gerekli olan temel yapılandırma adımlarını özetlemektedir.
Önyükleyici Uygulamaya Geç
1. Adım: Flash Bölümü
Programlama ve tasarım aşamasında, Flash belleği belirli uygulama gereksinimlerine göre bölümlere ayırmak önemlidir. Bu, BootLoader ve APP'nin nereye depolanacağının yanı sıra her birine ayrılacak alanın belirlenmesini de içerir. Bu depolama yerleşimi, programın yürütülmesini ve geçişlerini doğrudan etkiler.
En basit yükseltme stratejilerinden biri, bir BootLoader ve bir APP'ye sahip olmaktır. BootLoader, geçişleri yönetir ve APP yükseltmelerini kolaylaştırır. Bu makale, açıklama amacıyla bu yükseltme stratejisini örnek olarak kullanmaktadır.
STM32 mikrodenetleyiciler için, program başlatma için eşlenen adres 0x8000000'dır.
BootLoader, 0x8000000 adresinde depolanabilir ve ayrılan alan, çipin belirli Flash boyutuna göre ayarlanabilir; örneğin, 0x10000 veya 64KB.
APP'nin depolama adresi, BootLoader'ın arkasına, özellikle 0x8010000 adresine yerleştirilir. Flash'taki kalan alan APP'ye ayrılabilir.
2. Adım: BootLoader Proje Yapılandırması
BootLoader projesinin yapılandırılması birkaç adımdan oluşur. MDK'yı örnek olarak alırsak, BootLoader programı 0x8000000 adresinde 0x10000 boyutunda FLASH bellekte depolanır.

Program kodu kullanarak APP'ye geçiş yaparken aşağıdaki hususları göz önünde bulundurun:
- Yığın üst adresinin geçerliliğini, yani APP'nin başlangıç adresinin geçerli olup olmadığını doğrulayın.
if(((*(__IO uint32_t *)APP_FLASH_ADDR) & 0x2FFE0000) == 0x20000000)
- Geçiş sırasında istisnalara yol açabilecek aksaklıkları önlemek için tüm kesmeleri devre dışı bırakın.
- İkinci kelime olarak depolanan APP programının başlangıç adresini alın (başlangıç adresi + 4, veriler Flash'ta depolanır).
- Yığın işaretçisini başlatın (kullanıcı kodu alanındaki ilk kelime yığın üst adresini içerir).
- APP'nin başlangıç adresini bir işlev işaretçisi türüne dönüştürün ve geçişi gerçekleştirin.
Geçiş için kullanılan kod şu şekildedir:
/* Define type */
typedef void (*pFunction)(void);
/* APP flash address */
#define APP_FLASH_ADDR (0x8010000)
void jump_to_app(void)
{
uint32_t JumpAddress;
pFunction Jump_To_Application;
/* Check if the stack top address is valid */
if(((*(__IO uint32_t *)APP_FLASH_ADDR) & 0x2FFE0000) == 0x20000000)
{
/* Disable all interrupts to prevent disturbances during transition */
__disable_irq();
/* The second word in the user code area is the program's start address (reset address) */
JumpAddress = *(__IO uint32_t *) (APP_FLASH_ADDR + 4);
/* Initialize the user application's Stack Pointer */
__set_MSP(*(__IO uint32_t *) APP_FLASH_ADDR);
/* Type conversion */
Jump_To_Application = (pFunction) JumpAddress;
/* Transition to the APP */
Jump_To_Application();
}
}
3. Adım: APP Proje Yapılandırması
Benzer şekilde, APP projesi de belirli yapılandırmalar gerektirir. MDK'yı örnek olarak alırsak, APP programı 0x8010000 adresinde, 0x30000 boyutunda FLASH bellekte depolanır.

APP programının yapılandırılması aşağıdaki adımları içerir:
- SCB->VTOR'u değiştirerek APP'deki dahili Flash vektör tablosunun konumunu değiştirin.
- APP çalışmaya başladıktan sonra, programın sorunsuz bir şekilde yürütülmesini sağlamak için başlatma işlevinde kesmeleri etkinleştirmek çok önemlidir. Aksi takdirde programda anormallikler meydana gelebilir.
Normalde, başlangıç dosyasında SystemInit() işlevi çağrılır. Bu işlev, Flash'ın arayüz bilgilerini yapılandırır.
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET

VECT_TAB_OFFSET makro tanımının değerini 0x10000 olarak değiştirin.

APP programı başladıktan sonra, genel kesmeleri etkinleştirmek çok önemlidir. Aşağıdaki kodu başlatma bölümüne ekleyebilirsiniz:
/* Enable interrupts */
__enable_irq();
Uygulama: BootLoader'a Git
Cihaz çalışırken, uygulama (APP) açık durumdadır ve işlevlerini yerine getirmektedir. Uygulamayı güncellemek istiyorsanız, uygulamadan BootLoader moduna geçmeniz gerekir. Peki, uygulamanın BootLoader moduna geçişi nasıl gerçekleştirilir? Bunun için iki yöntem vardır:
- Donanım modu, cihazın kapatılıp yeniden başlatılması veya sıfırlama düğmesi
- Yazılım modu, yazılım kontrolü yoluyla MCU'yu sıfırlama
Yazılım modunda, kontrol komutları APP koduna eklenebilir ve APP atlama komutunu (veya yükseltme komutunu) aldığında MCU sıfırlanır. Aşağıdaki kod MCU'yu sıfırlayabilir:
/* reset chip */
HAL_NVIC_SystemReset();




