0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是Bootloader 浅谈STM32中bootloader的内存分配

电子设计 来源:博客园 作者:M&D 2021-02-15 06:10 次阅读

1. 什么是Bootloader

Bootloader是硬件启动的引导程序,是运行操作系统的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。

2. Bootloader的特点

Bootloader不属于操作系统,一般采用汇编语言和C语言开发。需要针对特定的硬件平台编写。在移植过程时,首先为开发板移植Bootloader。Bootloader不但依赖于CPU的体系架构,而且依赖于嵌入式系统板级设备的配置。

3. STM32中bootloader的内存分配

stm32默认的是从0x08000000开始启动程序,所以bootloader也存在于这个地址,大小可以设置。如下图举例分配 48K的大小空间给Bootloader

pIYBAF_8DkWAUhLDAABdqrH-we0124.png

还有一种分配方式:镜像的备份 Firmware ---> Application Bak ---> SysRest ----> Bootloader -----> Check if new Firmware -----> Move App Bak to App area

这种方式需要更大的存储空间,如果MCU内置FLASH 不够备份Firmware则需要外置Flash,将Firmware备份在外置FLASH。

pIYBAF_8Dk-AHFkBAAB6DGF2S3A371.png

根据实际MCU的Flash的大小和固件的大小来分配空间。一般可以把固件信息(app固件的StartAddr, EndAddr, FirmwareSize, CRC等)存放在Free Spae.

bootloader的作用一般是用作更新APP,和初始化后设定跳转到对应的APP。如果APP不加更新功能的话也可以直接将APP写入到0x08000000这个地址里。更新程序就是数据包的接收、校验、写入,全部写入完成后检查APP的启动向量为合格就可以跳转到APP里。

pIYBAF_8DlqAfGpIAABXcfclGZU737.png

4. Bootloader的跳转简单实现

4.1 Bootloader

我基于STM32Cube配置的外设,IDE用的STM32SW4,STM32F103RCT6。

在实现IAP功能前,先实现跳转。这里先不涉及固件更新。

/*FLASH : 0x8000000 --- 0x8040000 Total Size: 256K
*RAM : 0x20000000 --- 0x2000C000 Total Size: 48K
*Bootloader: 0x8000000 --- 0x8008000 Total Size: 32K

1 /* Includes ------------------------------------------------------------------*/
  2 #include "main.h"
  3 #include "stm32f1xx_hal.h"
  4 #include "usart.h"
  5 #include "gpio.h"
  6 
  7 /* USER CODE BEGIN Includes */
  8 #include "stdio.h"
  9 /* USER CODE END Includes */
 10 
 11 /* USER CODE BEGIN PFP */
 12 /* Private function prototypes -----------------------------------------------*/
 13 pFunction jump2app;
 14 void (*jump2app)();
 15 /* USER CODE END PFP */
 16 
 17 
 18 
 19 /* USER CODE BEGIN 0 */
 20 #ifdef __GNUC__
 21     #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
 22 #else
 23     #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
 24 #endif
 25 
 26 /*retargets the C library printf function to the USART*/
 27 PUTCHAR_PROTOTYPE
 28 {
 29     HAL_UART_Transmit(&huart1,(uint8_t*)&ch, 1, 0xFFFF);
 30     return ch;
 31 }
 32 
 33 //FLASH            : 0x8000000  --- 0x8040000       Total Size: 256K
 34 //RAM           : 0x20000000 --- 0x2000C000       Total Size: 48K
 35 //Bootloader     : 0x8000000 --- 0x8008000     Total Size: 32K 
 36   37 #define ApplicationAddress    0x8008000
 38 
 39 
 40 void iap_load_app(uint32_t appAddr)
 41 {
 42     printf("first word : 0x%x\n",(*(uint32_t*)appAddr));
 43     if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
 44     {
 45         printf("IAP load APP!!!\n");
 46 
 47         __disable_irq();
 48 
 49         jump2app = (void (*)())*(__IO uint32_t*) (appAddr + 4);
 50 
 51         __set_MSP(*(__IO uint32_t*) appAddr);
 52 
 53         jump2app();
 54     }
 55 }
 56 /* USER CODE END 0 */
 57 
 58 /**
 59   * @brief  The application entry point.
 60   *
 61   * @retval None
 62   */
 63 int main(void)
 64 {
 65   /* USER CODE BEGIN 1 */
 66 
 67   /* USER CODE END 1 */
 68 
 69   /* MCU Configuration----------------------------------------------------------*/
 70 
 71   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 72   HAL_Init();
 73 
 74   /* USER CODE BEGIN Init */
 75 
 76   /* USER CODE END Init */
 77 
 78   /* Configure the system clock */
 79   SystemClock_Config();
 80 
 81   /* USER CODE BEGIN SysInit */
 82 
 83   /* USER CODE END SysInit */
 84 
 85   /* Initialize all configured peripherals */
 86   MX_GPIO_Init();
 87   MX_USART1_UART_Init();
 88   /* USER CODE BEGIN 2 */
 89 
 90   /* USER CODE END 2 */
 91 
 92   /* Infinite loop */
 93   /* USER CODE BEGIN WHILE */
 94   while (1)
 95   {
 96       printf("I am bootloader,jump to app after 5 seconds!\n");
 97 
 98       HAL_Delay(1000);
 99 
100       printf("1\r\n");
101 
102       HAL_Delay(1000);
103 
104       printf("2\r\n");
105 
106       HAL_Delay(1000);
107 
108       printf("3\r\n");
109 
110       HAL_Delay(1000);
111 
112       printf("4\r\n");
113 
114       HAL_Delay(1000);
115 
116       printf("ready to jump!\n");
117 
118       iap_load_app(ApplicationAddress);
119   /* USER CODE END WHILE */
120 
121   /* USER CODE BEGIN 3 */
122 
123   }
124   /* USER CODE END 3 */
125 
126 }

修改ld文件 STM32F103RCTx_Flash.ld

pIYBAF_8DmiAONZzAALEZOEolfE616.png

编译烧录。首先将STM32F103RCT6的FLASH全部擦除如下图,然后用STM32SW4烧录Bootloader

o4YBAF_8DnuAZNL-AAHZsg8s2G0912.png

调试Bootloader如下图

o4YBAF_8DomAWgA9AALWnGn2I04381.png

4.2 Application

APP主要是修改ld文件,Bootloader分配了 32Kb, 剩余224K的先全分配给App, 实现简单跳转。

o4YBAF_8DpeASiHlAALEByM_BuY517.png

int main(void)
{
    //NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x2000);
  /* USER CODE BEGIN 1 */
    SCB->VTOR = ((uint32_t)0x8000000) | (0x8000 & (uint32_t)0x1FFFFF80);
  /* 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_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  __enable_irq();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
     printf("I am new APP !\n\r");

     HAL_Delay(1000);
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

再将APP烧录,Reset

o4YBAF_8DqWAO282AAGCsqwxa2I458.png

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10335

    浏览量

    206230
  • 操作系统
    +关注

    关注

    37

    文章

    6201

    浏览量

    121727
  • STM32
    +关注

    关注

    2232

    文章

    10649

    浏览量

    347875
  • bootloader
    +关注

    关注

    2

    文章

    230

    浏览量

    45032
收藏 人收藏

    评论

    相关推荐

    请问STM32bootloader怎么制作?

    我对STM32也算是比较熟悉了,但是呢, 没有弄过 STM32bootloader。也不知道怎么弄的。像,Linux,蓝牙等 都有 类型的demo 供你学习和开发。 请问,STM32
    发表于 03-07 07:50

    STM32案例:BootLoader是怎么跳到App

    BootLoader项目程序和App项目程序是分开的,所以需要分别搭建对应的项目工程文件,分开搭建文件是为了好配置,同时也是方便对项目进行管理。
    发表于 03-04 09:35 170次阅读
    <b class='flag-5'>STM32</b>案例:<b class='flag-5'>BootLoader</b>是怎么跳到App

    STM32无法进入片上Bootloader的处理方法

    STM32无法进入片上Bootloader的处理方法  当STM32芯片无法进入片上Bootloader时,我们需要采取一系列的处理方法来解决这个问题。以下将详细介绍一些常见的处理方法
    的头像 发表于 02-02 14:33 415次阅读

    基于MM32F0140的UDS Bootloader学习笔记

    基于MM32F0140的UDS Bootloader学习笔记
    的头像 发表于 10-30 17:11 315次阅读
    基于MM32F0140的UDS <b class='flag-5'>Bootloader</b>学习笔记

    单片机BootLoader与APP如何合并?

    单片机BootLoader与APP如何合并?
    的头像 发表于 10-25 17:17 568次阅读
    单片机<b class='flag-5'>BootLoader</b>与APP如何合并?

    STM32F09x不使用BOOT脚实现System Bootloader升级代码

    电子发烧友网站提供《STM32F09x不使用BOOT脚实现System Bootloader升级代码.pdf》资料免费下载
    发表于 09-25 15:08 1次下载
    <b class='flag-5'>STM32</b>F09x不使用BOOT脚实现System <b class='flag-5'>Bootloader</b>升级代码

    STM32 Bootloader异常复位案例

    电子发烧友网站提供《STM32 Bootloader异常复位案例.pdf》资料免费下载
    发表于 09-25 09:17 3次下载
    <b class='flag-5'>STM32</b> <b class='flag-5'>Bootloader</b>异常复位案例

    u-boot与bootloader的区别

    Bootloader从字面上来看就是启动加载的意思。用过电脑的都知道,windows开机时会首先加载bios,然后是系统内核,最后启动完毕。那么bootloader就相当于手机的bios,它在手机启动的时候根据基带初始化硬件,然后引导系统内核,直到系统启动。
    发表于 08-29 10:17 334次阅读

    图解基于UDS的Flash BootLoader

    这张图和恒润教程中的BootLoader流程大体是一致的。
    的头像 发表于 08-14 10:49 645次阅读
    图解基于UDS的Flash <b class='flag-5'>BootLoader</b>

    ARM处理器如何编写Bootloader

    前面给大家分享过Bootloader从应用角度执行的相关文章,今天从底层原理来给大家描述ARM处理器如何编写Bootloader,以及底层流程。
    的头像 发表于 07-26 09:10 540次阅读
    ARM处理器如何编写<b class='flag-5'>Bootloader</b>

    单片机BootLoader与APP如何合并

    嵌入式固件一般分为BootLoader和App,BootLoader用于启动校验、App升级、App版本回滚等功能,BootLoader在cpu上电第一阶段中运行,之后跳转至App地址执行应用程序。
    的头像 发表于 07-25 11:29 908次阅读
    单片机<b class='flag-5'>BootLoader</b>与APP如何合并

    一文了解bootloader

    大多数Bootloader 包含两种操作模式。
    的头像 发表于 06-25 10:05 1542次阅读
    一文了解<b class='flag-5'>bootloader</b>

    STM32H7实现BootLoader内SDRAM的初始化注意事项

    Function Implementation:在 ArtPi 的环境下,实现一个简单的 BootLoader,该 BootLoader 实现了 QSPI 和 SDRAM 功能的初始化
    的头像 发表于 06-07 15:51 2064次阅读
    <b class='flag-5'>STM32</b>H7实现<b class='flag-5'>BootLoader</b>内SDRAM的初始化注意事项

    适合单片机的几款开源Bootloader

    如果日常工作中经常使用linux,那么对U-Boot,LILO,GRUB等常用Bootloader一定不陌生。但是这些Bootloader主要用于引导linux启动,不太适合单片机产品。
    发表于 05-25 15:42 4176次阅读
    适合单片机的几款开源<b class='flag-5'>Bootloader</b>

    CC2640R2:如何利使用芯片内部Bootloader烧写程序

    我们来看一下CC2640R2的Bootloader是怎么Run的。CC13x0, CC26x0 SimpleLink Wireless MCU Technical Reference Manual
    的头像 发表于 04-04 10:10 1313次阅读