08 Mart 2021, 02:30:41

Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME


STM32 Bootloader, vector table problemi

Başlatan catalyst, 18 Şubat 2021, 19: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

18 Şubat 2021, 20:37:04 #1 Son düzenlenme: 18 Şubat 2021, 20:39:15 Tagli
Alıntı yapılan: catalyst - 18 Şubat 2021, 19: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.

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.