Bootloader Sorunu

Başlatan flowchartx, 20 Nisan 2023, 21:12:45

flowchartx

Herkese selamlar bootloader çalışmaya başladım. MSP ve reset olayındayım. STM32F103 kullanıyorum. Karta program attığımda flash_base adrese yani 0x08000000 yükleniyor. Ben keil programından IROM adresini 0x08000800 yaptım yani flash memoryde ki 2. pagedan başlıyor programı yazmaya linker ayarınıda yaptım. Buraya kadar her şey güzel utilty progrmaından baktığımda doğru adrese yazılmış kodum. Birde bu adrese atlayan bir kod yazdım çevre birimleri init olduktan sonra çağırıyorum.
void Jump_to_app(void)
{
	typedef void (*FncPtr)(void); 
	
	FncPtr JumpFnc;
	uint32_t ResetAddress = (*(volatile uint32_t*) (FLASH_PAGE_2 + 4));
	JumpFnc = (FncPtr)(ResetAddress);
	__set_MSP(*(__IO uint32_t*)FLASH_PAGE_2);
	JumpFnc();
}

kodum böyle. Ama main içinde yazdığım program çalışmıyor. Doğru adresleri yüklememe rağmen doğru yere jump yapamıyorum sanırım. Yardım edebilcek var mı ?
main fonskiyonum aşağıda
int main(void)
{
  /* USER CODE BEGIN 1 */
	

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
	HAL_Delay(200);
	Jump_to_app();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
		HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

volkanunal

Merhabalar,

Şurada bir yazı hazırlamıştım belki faydalı olabilir.

https://engineeringvolkan.wordpress.com/2020/01/31/iki-main-tek-islemci/

3 farklı durum söz konusu;

1 - 0x08000800 adresine koyduğunuz koyduğunuz kodun vector tablosunu da değiştirmeniz gerekiyor. Bunun için, system_stm32f4xx.c içerisine giderek VECT_TAB_OFFSET makrosunu düzenlemeniz gerekiyor.

2 - Kodunuzu 0x08000800 ilgili adrese koyduktan sonra, ilgili bölgeye atlamak için hazırladığınız yazılımı barındıracağınız kodu yüklerken (0x08000000 bu adrese). Flashın tamamını temizlemediğinize emin olun

3 - 0x08000000 bu adrese yazacağınız kodun flash size'inin 0x08000800 buraya taşmayacağından emin olmanız gerekiyor.


flowchartx

Hocam çok teşekkür ederim. Kullandığım işlemcinin hafızası çok küçük olduğu için bootloader programı app programının içine yükleniyodu sanırım. Biraz daha alan ayırara sorunu çözdüm. Sizin dediğiniz şeyi yapmıştım yine de teşekkür ederim.
Size bir soru sormak istiyorum ethernet haberleşmesiyle bootloader yapabilir miyim?

volkanunal

Merhabalar tekrardan,

Bootloader'ın temel amacı flashın ilgili bölgesine yeni yazılımı yazmak için geliştirilen bir tür yazılım gibi düşünebilirsiniz. Bu açıdan baktığınızda isterseniz ethernet arayüzünden, isterseniz spi, uart gibi bir çevre birimini kullanan bir bootloader hazırlayabilirsiniz.

Ben daha önce TFTP üzerinden basit bir bootloader taslağı hazırlamıştım, fikir vermesi açısından paylaşıyorum.

https://gist.github.com/volkanunal/e0e46170be34c0c3b1da05d8121f9373

flowchartx

Evet sağolun yardımcı oldu hocam. Teşekkürler. Başarılar çalışmalarınızda