STM32 Bootloader, vector table problemi

Başlatan catalyst, 18 Şubat 2021, 16:12:43

catalyst

Selamlar hocalarım,

STM32 flashını bootloader ile beraber 0x08020000'den başlatmam gerekiyor. Flash originini de aşağıda görülebileceği üzere linker'dan güncelledim.

/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 64K
  FLASH    (rx)    : ORIGIN = 0x8020000,   LENGTH = 128K
}

Ayrıca, vector table register offsetini de aşağıdaki koddan görülebileceği üzere system_stm32f4xx.c'den güncelledim. Ayrıca, SystemInit fonksiyonunu da görebilirsiniz.

/*!< Uncomment the following line if you need to relocate your vector Table in
     Internal SRAM. */
/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. //0x00
                                   This value must be a multiple of 0x200. */
/******************************************************************************/

void SystemInit(void)
{
  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif
    /* Reset the RCC clock configuration to the default reset state ------------*/
    /* Set HSION bit */
    RCC->CR |= (uint32_t)0x00000001;

    /* Reset CFGR register */
    RCC->CFGR = 0x00000000;

    /* Reset HSEON, CSSON and PLLON bits */
    RCC->CR &= (uint32_t)0xFEF6FFFF;

    /* Reset PLLCFGR register */
    RCC->PLLCFGR = 0x24003010;

    /* Reset HSEBYP bit */
    RCC->CR &= (uint32_t)0xFFFBFFFF;

    /* Disable all interrupts */
    RCC->CIR = 0x00000000;

#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
  SystemInit_ExtMemCtl(); 
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */

  /* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
  SCB->VTOR = 0x08020000UL | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
}

Ek bilgi de vermek gerekirse, bu projeyi STM32CubeMX version 5.0.0 ile derlediğimde bu ayarları uygulamamla beraber, bootloader ile yazılım attığımda kod gayet düzgün çalışıyor.

Fakat, projeyi STM32CubeMX version 6.0.0 üzeri bir versiyon ile (mesela 6.1.1) konfigüre ettiğimde kod çalışmıyor. Independent watchdog timer reseti alıyorum.
Sorunun kaynağı sizce ne olabilir? Nasıl çözebilirim?

Tagli

#1
Alıntı yapılan: catalyst - 18 Şubat 2021, 16:12:43Independent watchdog timer reseti alıyorum.
Sadece bu kısım için yorum yapacağım: Kesme ismine aldanma, olayın WDT ile ilgisi yok. Eğer senin tanımlamadığın bir kesmeye ya da fault'a düşerse kod, gerçekte Default_Handler diye boş bir döngüye gidiyor. Ancak sanırım WWDG kesme numarası 0 olduğu için, debugger'ın kafası karışıyor ve sanki o kesme gelmiş gibi hatalı bilgi veriyor.
Gökçe Tağlıoğlu

Tagli

İlk mesajı yazdığımda pek zamanım yoktu, hızlıca yazmıştım. Şimdi daha dikkatli baktım soruna.

Yazdığın VTOR satırının orijinali şu şekilde:
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
Aslında burada FLASH_BASE değerinin sabit olması gerekir. Bunu değiştirmen ileride bu kodu gören birisi için kafa karıştırıcı olabilir. Aynı dosyada yukarıda bir yerde VECT_TAB_OFFSET tanımlı. Değişmesi gereken değer de bu. Bir ihtimal, CubeMX bu dosyayı oluştururken VECT_TAB_OFFSET tanımı ile oynayıp buraya 0'dan farklı bir değer vermiş olabilir. Bunu bir kontrol et.

Bence VTOR'u debug ile de kontrol etmende fayda var. Bir projemde ben de vektörleri taşımaya çalışıyordum. Ancak VTOR yerine başka bir yöntemle 0x0'ı SRAM'e remap yapmayı denemiştim. Çalışmadı bir türlü. Sonra debug sırasında VTOR'un reset değeri olan 0x0'ı değil flash'ı gösterdiğini fark ettim. Benim IDE'nin de otomatik olarak oluşturduğu bu dosyadaki bu satırdan heberim bile yoktu. Varlığını bu şekilde öğrenmiş oldum. Neyse lafı uzattım, özetle kod çalışırken VTOR'u değeri doğru mu bir bak.

En büyük avantajın elinde zaten çalışan bir proje / konfigürasyon olması. Sorunun CubeMX tarafından oluşturulan dosyalarda olduğunu varsayabiliriz. Eski ve yeni dosyaları bir text karşılaştırma programı ile yan yana karşılaştırıp farkın nerede olduğunu görebilirsin. Bence bu şekilde hızlıca sonuca ulaşabilirsin. Ben Meld adında bir program kullanıyorum bu işler için.
Gökçe Tağlıoğlu

kralsam

Selamlar,
Bootloader projesi compiler ayarlarından optimizasyon 0(sıfır) yaparsan yani kapatırsan çalışacaktır diye tahmin ediyorum.