STM32 Bootloader Sorunu

Başlatan e-zeki, 28 Mart 2018, 11:14:34

e-zeki

Merhabalar,
2 haftadır bootloader üzerine çalışıyorum. notundaki direktiflere göre bir program yazdım Discovery F407 kit ile USB üzerinden basit bir LED Blink fonksiyonu olan hex dosyasını alıp 4. Sektöre yazıyorum.
Fakat Jump fonksiyonu yeni program adresine geçiş yapmıyor.

void JumpToBootloader(void) {
    void (*SysMemBootJump)(void);
    volatile uint32_t addr = 0x08010000;
		SysMemBootJump = (void (*)(void)) (*((uint32_t *)(addr + 4)));
	  
		
    HAL_RCC_DeInit();	
		HAL_DeInit();	
    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;
    SCB->VTOR = 0x08010000;
	
	__disable_irq();
	__set_MSP(*(uint32_t *)addr);
    SysMemBootJump();
}


internette interrupt vector table'ı yeni programın başladığı adrese referanslamak gerektiğini gördüm SCB->VTOR = 0x08010000; komutuyla onu da denedim fakat herhangi bir etkisi olmadı.
Bootloaderlar hakkında daha önceden bilgi sahibi değilim o yüzden bu noktadan sonra  ne yapmam gerekiyor konu hakkında bilgisi olan ustalarım yardımcı olabilirler mi?

EDIT:  firmware hex'i ROM1 de 0x08010000 adresinden itibaren olacak şekilde derlememişim. Hex'i derleyip tekrar bootloader programı üzerinden flashladım. Şuan sıçrama gerçekleşiyor fakat led blinklemek yerine sürekli yanık kalıyor.

memo333

ana programda vektör tablosunu offsetlediniz mi?
Gömülü Linux Notları --> http://linuxedu.xyz/

e-zeki

Alıntı yapılan: memo333 - 28 Mart 2018, 22:59:01
ana programda vektör tablosunu offsetlediniz mi?

Evet aynı şekilde flashladığım programda da SCB->VTOR = 0x08010000; komutunu HAL_Init() fonksiyonunun hemen altında çağırdım. Hatta VECT_TAB_OFFSET değerini de 0x10000 yaptım fakat herhangi bir değişiklik olmadı. led set edildikten sonra program 0x80103xx civarlarında geziyor debugda.  Debug ekranı bootloader projesi üzerinden açık olduğu için flashladığım programın komut satırlarını göremiyorum sadece disassembly ekranında adresler ve asembly kodları görebiliyorum. (Assembly bilgim NOP kadar).

Hala sorunu çözebilmiş değilim. Herhangi bir öneriniz varsa onu da deneyeceğim

qeek

Hocam daha önce şöyle bir fonksiyon kullanmıştım stm32f103 için. Büyük ihtimal 407 de çalışır.
void GoToUserApp(uint32_t appAdress)
{
  typedef void(*myFunc)(void);
  myFunc Jump_To_Application;
  uint32_t JumpAddress;

  if (((*(__IO uint32_t*)appAdress) & 0x2FFE0000 ) == 0x20000000) {
  
  SCB->VTOR = appAdress;
  JumpAddress = *(__IO uint32_t*)(appAdress + (uint32_t)4);
  
  Jump_To_Application = (myFunc)JumpAddress;
  
  __set_MSP(*(__IO uint32_t*)appAdress);
  
  Jump_To_Application(); 
  }

}

e-zeki

@qeek hocam bende ki rutin de aynısıydı sorunu çözdüm "__disable_irq();" komutunu flashladığım hex'in içinde açmayı unutmuşum sorun çözüldü şuan çalışıyor teşekkür ederim.