임베디드/STM32

bootloader 추가..

큰꼬꼬 2023. 9. 4. 23:20

앞서 부트로더 관련 글을 썼는데 복잡하게 한것 같다.

간단버전.

1. bootloader 을 cube mx를 이용하여 만들어 준다.
dfu를 사용할 것이기에 세팅하였음


2. main.c 파일을 수정한다.

int main(void)
{
  /* USER CODE BEGIN 1 */
	typedef  void (*pFunction)(void);
	pFunction JumpToApplication;
  	uint32_t JumpAddress;

  /* 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();
//  MX_USB_DEVICE_Init();
  /* USER CODE BEGIN 2 */
  
  if (HAL_GPIO_ReadPin(SW_DFU_GPIO_Port, SW_DFU_Pin) != GPIO_PIN_RESET)
  {
	  if (((*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD) & 0x2FFF4000) == 0x20000000)
	  {
		  /* Jump to user application */
		  JumpAddress = *(__IO uint32_t *) (USBD_DFU_APP_DEFAULT_ADD + 4);
		  JumpToApplication = (pFunction) JumpAddress;
		  
		  /* Initialize user application's Stack Pointer */
		  __set_MSP(*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD);
		  JumpToApplication();
	  }
  }
  HAL_Delay(50);
  MX_USB_DEVICE_Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

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

MX_USB_DEVICE_Init(); 은 점프 관련 코드를 넘어 간 후에 Init 되도록 함

3. 부트로더 링커 세팅

 

만일 BOOT 와 APP을 동시에 다운로드 하고 싶다면 앞선 글과 같이 링커를 구성해야 한다.


 

4. SW_FW에 따라 JUMP를 하냐, 또는 DFU 모드로 대기를 하느냐...


그럼