stm32 bootloader IAP在线升级——程序跳转(一)

 

目录

 1、 创建一个IAP_Bootloader 工程

2、创建一个user_APP工程


1、 创建一个IAP_Bootloader 工程

  1. 利用stm32cubeide创建一个IAP_Bootloader工程,配置串口1和sw,LED只是为了显示状态,可以不用配置。保存生成工程。stm32 bootloader IAP在线升级——程序跳转(一)_第1张图片

     

  2. 点击STM32F401CCUX_FLASH.ld文件,修改里面的flash长度,就是说bootloader的代码存放在0x8000000~0x8008000这里。stm32 bootloader IAP在线升级——程序跳转(一)_第2张图片

     

  3. main.c 文件中加入以下代码:

    //重定向printf
    #ifdef __GNUC__
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    #else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    #endif
    
    PUTCHAR_PROTOTYPE
    {
    	HAL_UART_Transmit(&huart1, (uint8_t*) &ch, 1, 0xffff);
    	return ch;
    }
    
    //跳转到用户app
    #define FLASH_APP_ADDR 0x8008000
    typedef void (*pFunction)(void);
    void go2APP(void)
    {
    	uint32_t JumpAddress;
    	pFunction Jump_To_Application;
    	printf("BOOTLOADER Start\n");
    //Check
    	if (((*(__IO uint32_t*) FLASH_APP_ADDR) & 0x2FFE0000) == 0x20000000)
    	{
    		printf("APP Start...\n");
    		HAL_Delay(100);
    // Jump to user application //
    		JumpAddress = *(__IO uint32_t*) (FLASH_APP_ADDR + 4);
    		Jump_To_Application = (pFunction) JumpAddress;
    // Initialize user application's Stack Pointer //
    		__set_MSP(*(__IO uint32_t*) FLASH_APP_ADDR);
    		Jump_To_Application();
    	}
    	else
    	{
    		printf("No APP found!!!\n");
    	}
    }
  4. 主程序中加入:

      /* USER CODE BEGIN 2 */
    	printf("this is bootloader\r\n");
    	go2APP();
      /* USER CODE END 2 */
  5. 烧录程序即可,如果在0x8008000位置之后存放的有用户代码,串口会打印出app start...,如果没有,串口会打印出 No APP found!!!

2、创建一个user_APP工程

  1.  和创建IAP_Bootloader 工程的第1步骤一样

  2. 点击STM32F401CCUX_FLASH.ld文件,修改起始位置为0x8008000,在此之前的区域是bootloader的代码区,长度修改为224k,因为我这里的flash总大小是256k,分给了bootloader 32k,用户程序就只剩下224k了stm32 bootloader IAP在线升级——程序跳转(一)_第3张图片

     

  3. 修改中断向量表偏移(通常情况下需要设置,但是如果你不用中断,就可以不用设置)stm32 bootloader IAP在线升级——程序跳转(一)_第4张图片

     

  4. 在主程序中写入应用代码即可

你可能感兴趣的:(单片机,stm32,嵌入式硬件)