STM32 için Bootloader

flowchartx

Aktif Üye
Katılım
18 Ağustos 2021
Mesajlar
218
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
5,878
Mesajlar
100,192
Üyeler
2,488
Son üye
ilter

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top