임베디드/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 모드로 대기를 하느냐...
그럼