STM32 için Bootloader

Başlatan flowchartx, 30 Haziran 2023, 16:43:59

flowchartx

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

Tagli

M0'da VTOR register'ı olmadığı için vektör tablosuna ofset vermek mümkün değil. Ancak STM32'lerde (muhtemelen tüm modellerde) normalde flash'a bağlı olan 0 adresini RAM'e bağlamak (remap) mümkün. Yani 0 adresi 0x8000000 yerine 0x20000000'ya bağlanmış oluyor. Bu şekilde canlı olarak değiştirilebilen bir vektör tablosu elde etmek mümkün.
Gökçe Tağlıoğlu

flowchartx

#2
Cevap için teşekkürler dediğinizi şu şekilde yaptım flash.ld dosyasından isr_vektorü rame tanımladım. Fakat değişen bir şey olmadı sanırım tam remap edemedim

Tagli

SYSCFG_CFGR1 register'ı içindeki MEM_MODE bitleri yukarıda bahsettiğim mapping'i değiştiriyor.
Gökçe Tağlıoğlu

flowchartx

#4
Evet hocam dediğiniz gibi yapıp hallettim biraz zorladı ama teşekkürler..

Başka arkadaşlara yardımım olması için kodları ekliyorum

Flash.ld içine aşağıdaki linkler kodlarını ekliyoruz. ram_vector dizisini rame yerleştirdiğimizi söylüyoruz

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


Daha sonra ram_Vector dizisini derleyiciye belirtiyoruz ve orjinal vektör dizisini extern ediyoruz

/* 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 mainin içinde hiç bir şey init edilmeden remap komutlarımızı yazıyoruz. Orjinal vektör tablomuzdan vektörleri kendi dizimize atıp SYSCFG registerının mem_mode için ayrılmış ilk 3 bitine user manuelde belirtildiği gib 3 yazıyoruz.

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();

.
.}


Anlatım için kusura bakmayın. Bu çıkabildi en fazla umarım birilerinin işi görülür