STM32 Boot启动程序跳转教程

一、通过STM32实现从Bootloader跳转至主程序

1.1 简介

  1. 在程序设计之前先划分内部flash区域
  2. 本文将boot区划分地址为: 0x08000000 ~ 0x0x08006FFF(可以根据需求自行划分),共28K(0x7000)
  3. 将主程序区划分地址为:0x08007000 ~ 0x0x08012FFF 共48K
  4. 本文根据串口打印信息判断跳转是否成功
  5. 注意事项: 控制Boot区程序不能超过28K大小,否则会损坏主程序

1.2 CubeMX配置




  • 接下来即可生成工程
  • 1.3 Bootloader程序

    main.c

    #include "stdio.h"
    
    #define APPLICATION_ADDRESS      0x08007000 //跳转目标地址,主程序起始地址
    
    typedef void (*pFunction)(void);
    pFunction JumpToApplication;
    uint32_t JumpAddresss;
    /*printf 重定向*/
    int fputc(int ch, FILE * f)
    {
        HAL_UART_Transmit(&huart3, (uint8_t *) &ch, 1, 0xFFFF);
        return ch;
    }
    void jump_to_APP(void);
    
    int main(void)
    {
      HAL_Init();
      SystemClock_Config();
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_USART3_UART_Init();
      /* USER CODE BEGIN 2 */
    	printf("boot....\r\n");
    	HAL_Delay(1000);
    
    	jump_to_APP();
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */ 
    
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
    
    void jump_to_APP(void)
    {
    	if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    	{
    		printf("bootloader to APP\n");
    		JumpAddresss = *(__IO uint32_t*)(APPLICATION_ADDRESS+4);
    		JumpToApplication = (pFunction)JumpAddresss;
    
    		__set_MSP(*(__IO uint32_t*)APPLICATION_ADDRESS);
    		JumpToApplication();
    	}
    	else
    	{
    		printf("Jump to APP failed!\r\n");
    		__disable_irq();
    		NVIC_SystemReset();
    	}
    }
    

    1.4 主程序

    1. CubeMX配置bootloader程序配置一样
    2. main.c
    #include "stdio.h"
    
    /*printf 重定向*/
    int fputc(int ch, FILE * f)
    {
        HAL_UART_Transmit(&huart3, (uint8_t *) &ch, 1, 0xFFFF);
        return ch;
    }
    
    
    int main(void)
    {
      HAL_Init();
      SystemClock_Config();
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_USART3_UART_Init();
      /* USER CODE BEGIN 2 */
    	printf("start....\r\n");
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
      		printf("111111\r\n");
    		HAL_Delay(1000);
        /* USER CODE END WHILE */ 
    
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
    


    注意修改以下内容:

    1.5 将主程序,boot程序都烧录进去后,运行如下:

    小白一枚,有不对的地方欢迎指教

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 Boot启动程序跳转教程

    发表评论