STM32 için Bootloader

flowchartx

Aktif Üye
Katılım
18 Ağustos 2021
Mesajlar
219
Herkese iyi bayramlar...

STM32F070 işlemcisi ile bir bootloader yapmaya çalışıyorum. Daha önce bootloader yaptım fakat bu işlemci için bir sıkıntı var. Kesme tablosunun offset değerini değiştiremiyorum anladığım kadarıyla sabit bir yer vermişler. Durum böyle olunca app koduna atladığım zaman kod 1 kere çalışıp duruyor. Ne yapmam lazım bunun için bir öneriniz var mıdır acaba
 
Kesme tablosunun belirttigi her bir adresdeki rutine kisa bir adres secim kodu ekle.

Yani kesme gelince int adresine ucsun orda basit bir sorgu olsun. Mesela if MyTable==1 goto MyIntAddress else goto OldIntAdress
 
while içine bir kere giriyor sonra program muhtemelen sonlanıyor orda hangi kesmeye yönlendirmem gerekiyor ?
 
Onerim, sabit int tablosunu tasinabilir hale getirmek icindi.

While ile ilgili sorunu siz cozeceksiniz. Oncelikle problemin ne oldugunu daha detayli bulun.
 
İki şeye dikkat et ana koda atlamadan önce: 1) tüm kesmeler kapalı olsun. 2) Stack ana koda göre yapılandırılmış olsun.
 
Vektör tablosunu rame kaydırmaya çalışıyorum. Sanırım en mantıklıso bu olucak
 
ilk sorduğun soruda vektör tablosunun yeri değiştirilemiyor demişsin, ben de kontrol etmedim. Ama şimd Arm Cortex M0 TRM ye bakınca bu işlemcide VTOR registeri var. Vektör tablosunu kaydırmak için bu registere yeni değer ataman yeterli.

Benim kullandığım Cortex M4 için bir örnek. Burada __Vectors, linker script'inde tanımlı ve ana kodun vektör tablosuna işaret ediyor.

C:
    SCB->VTOR = (uint32_t) &__Vectors;
 
SCB registerlarını paylaştım hocam burada vtor yok. M0+ ayrı bir seri oluyor sanırım

Aynı seriymiş ama neden bu dosyada vtor yok anlamadım
Ekran Alıntısı.PNG
 
Son düzenleme:
Evet M0 ve M0+ farklı imiş. O zaman yukarıda önerilen çatallama işini yapacaksın boot loader'daki kesme girişlerinde.
 
Evet sorunu çözdüm. Daha doğrusu sorun değil de nasıl yapılacağını öğrendim. Belki birilerinin işini görür diye paylaşıyorum.

M0 çekirdeklerde doğrudan diğer işlemciler gibi scb->vtor registerı ile vektör tablosuna offset değeri veremiyoruz. Vektör tablomuz her zaman 0 adresinden başlıyor. Tabi 0 adresi nereye mapliyse bu değişiyor. M0 çekirdeklerde SYSCFG->CFGR1 Registerının ilk 3 biti bu iş için ayrılmış dökümanlarından bakabilirsiniz. Biz burada vektör tablomuzu ramden başlatıcaz.


İlk önce flash.ld dosyamıza vektör tablomuzun ramde olduğunu belirten script kodlarını yazıyoruz


C:
.ram_vector :
  {
    *(.ram_vector)
  } >RAM

Daha sonra main.c içinde derleyicimize bu yeri kullanacağımızı bildiriyoruz ve orijinal vektor tablosunu extern ediyoruz
C:
/* USER CODE BEGIN PD */
#define VEC_TABLE_SIZE (48)
/* USER CODE END PD */
 
/* USER CODE BEGIN PV */
volatile uint32_t __attribute__ ((section(".ram_vector"))) ram_vector[VEC_TABLE_SIZE];
extern volatile uint32_t g_pfnVectors[VEC_TABLE_SIZE];
/* USER CODE END PV */


Daha sonra hiç bir şey init edilmeden orjinal vektör tablosundan değerleri kendi vektör tablomuza çekip SYSCFG registerı ile tablomuzu rame taşıyoruz

C:
int main(void)
{
  /* USER CODE BEGIN 1 */
    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
 
    for(uint32_t i=0; i<VEC_TABLE_SIZE; i++)
    {
        ram_vector[i]=g_pfnVectors[i];
    }
    SYSCFG->CFGR1 |= 0x03;
  /* USER CODE END 1 */
 
  /* MCU Configuration--------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

Umarım anlaşılır olmuştur
 
Evet sorunu çözdüm. Daha doğrusu sorun değil de nasıl yapılacağını öğrendim. Belki birilerinin işini görür diye paylaşıyorum.

M0 çekirdeklerde doğrudan diğer işlemciler gibi scb->vtor registerı ile vektör tablosuna offset değeri veremiyoruz. Vektör tablomuz her zaman 0 adresinden başlıyor. Tabi 0 adresi nereye mapliyse bu değişiyor. M0 çekirdeklerde SYSCFG->CFGR1 Registerının ilk 3 biti bu iş için ayrılmış dökümanlarından bakabilirsiniz. Biz burada vektör tablomuzu ramden başlatıcaz.


İlk önce flash.ld dosyamıza vektör tablomuzun ramde olduğunu belirten script kodlarını yazıyoruz


C:
.ram_vector :
  {
    *(.ram_vector)
  } >RAM

Daha sonra main.c içinde derleyicimize bu yeri kullanacağımızı bildiriyoruz ve orijinal vektor tablosunu extern ediyoruz
C:
/* USER CODE BEGIN PD */
#define VEC_TABLE_SIZE (48)
/* USER CODE END PD */
 
/* USER CODE BEGIN PV */
volatile uint32_t __attribute__ ((section(".ram_vector"))) ram_vector[VEC_TABLE_SIZE];
extern volatile uint32_t g_pfnVectors[VEC_TABLE_SIZE];
/* USER CODE END PV */


Daha sonra hiç bir şey init edilmeden orjinal vektör tablosundan değerleri kendi vektör tablomuza çekip SYSCFG registerı ile tablomuzu rame taşıyoruz

C:
int main(void)
{
  /* USER CODE BEGIN 1 */
    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
 
    for(uint32_t i=0; i<VEC_TABLE_SIZE; i++)
    {
        ram_vector[i]=g_pfnVectors[i];
    }
    SYSCFG->CFGR1 |= 0x03;
  /* USER CODE END 1 */
 
  /* MCU Configuration--------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

Umarım anlaşılır olmuştur

merhaba öncelikle teşekkür ederim paylaşım için. app a atlama fonksiyonunuzuda paylaşırmısınız. ben anlayamadım ne yapmak istediğinizi. aynı zamanda app tarafında ram da bir kısım ayırmak gerekmiyormu
 
Merhaba hocam M0 işlemcilerde vektör tablosunu SCB registerıyla kaydıramıyoruz. Vektör tablosunu kaydırmak istememizin sebebi app koduna atladığımızda app kodun bi kesme tablosuna bakması gerekiyor onun için bende ramin başlangıcına taşıdım. Evet app tarafında bir yer ayırıyoruz. M0+ M3 M4 gibi işlemciler kullanıyorsanız bu işleme gerek yok.

Jump kodunuda ekliyorum.

Uzun süredir bootloaderla uğraşmadığım için detayları şuanda hatırlamıyorum evdeki pcden daha sonra bakabilirim.

Jump:
void flash_jump_to_app(void)
{
  fnc_ptr jump_to_app;
  jump_to_app = (fnc_ptr)(*(volatile uint32_t*) (FLASH_APP_START_ADDRESS+4u));
  HAL_DeInit();
  __set_MSP(*(volatile uint32_t*)FLASH_APP_START_ADDRESS);
  jump_to_app();
}
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,952
Mesajlar
118,759
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top