0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是Bootloader 淺談STM32中bootloader的內(nèi)存分配

電子設(shè)計(jì) ? 來(lái)源:博客園 ? 作者:M&D ? 2021-02-15 06:10 ? 次閱讀

1. 什么是Bootloader

Bootloader是硬件啟動(dòng)的引導(dǎo)程序,是運(yùn)行操作系統(tǒng)的前提。在操作系統(tǒng)內(nèi)核或用戶應(yīng)用程序運(yùn)行之前運(yùn)行的一段小代碼。對(duì)硬件進(jìn)行相應(yīng)的初始化和設(shè)定,最終為操作系統(tǒng)準(zhǔn)備好環(huán)境。

2. Bootloader的特點(diǎn)

Bootloader不屬于操作系統(tǒng),一般采用匯編語(yǔ)言和C語(yǔ)言開發(fā)。需要針對(duì)特定的硬件平臺(tái)編寫。在移植過(guò)程時(shí),首先為開發(fā)板移植Bootloader。Bootloader不但依賴于CPU的體系架構(gòu),而且依賴于嵌入式系統(tǒng)板級(jí)設(shè)備的配置。

3. STM32中bootloader的內(nèi)存分配

stm32默認(rèn)的是從0x08000000開始啟動(dòng)程序,所以bootloader也存在于這個(gè)地址,大小可以設(shè)置。如下圖舉例分配 48K的大小空間給Bootloader

pIYBAF_8DkWAUhLDAABdqrH-we0124.png

還有一種分配方式:鏡像的備份 Firmware ---> Application Bak ---> SysRest ----> Bootloader -----> Check if new Firmware -----> Move App Bak to App area

這種方式需要更大的存儲(chǔ)空間,如果MCU內(nèi)置FLASH 不夠備份Firmware則需要外置Flash,將Firmware備份在外置FLASH。

pIYBAF_8Dk-AHFkBAAB6DGF2S3A371.png

根據(jù)實(shí)際MCU的Flash的大小和固件的大小來(lái)分配空間。一般可以把固件信息(app固件的StartAddr, EndAddr, FirmwareSize, CRC等)存放在Free Spae.

bootloader的作用一般是用作更新APP,和初始化后設(shè)定跳轉(zhuǎn)到對(duì)應(yīng)的APP。如果APP不加更新功能的話也可以直接將APP寫入到0x08000000這個(gè)地址里。更新程序就是數(shù)據(jù)包的接收、校驗(yàn)、寫入,全部寫入完成后檢查APP的啟動(dòng)向量為合格就可以跳轉(zhuǎn)到APP里。

pIYBAF_8DlqAfGpIAABXcfclGZU737.png

4. Bootloader的跳轉(zhuǎn)簡(jiǎn)單實(shí)現(xiàn)

4.1 Bootloader

我基于STM32Cube配置的外設(shè),IDE用的STM32SW4,STM32F103RCT6。

在實(shí)現(xiàn)IAP功能前,先實(shí)現(xiàn)跳轉(zhuǎn)。這里先不涉及固件更新。

/*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

調(diào)試Bootloader如下圖

o4YBAF_8DomAWgA9AALWnGn2I04381.png

4.2 Application

APP主要是修改ld文件,Bootloader分配了 32Kb, 剩余224K的先全分配給App, 實(shí)現(xiàn)簡(jiǎn)單跳轉(zhuǎn)。

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10698

    瀏覽量

    209329
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6545

    瀏覽量

    122731
  • STM32
    +關(guān)注

    關(guān)注

    2257

    文章

    10828

    瀏覽量

    352438
  • bootloader
    +關(guān)注

    關(guān)注

    2

    文章

    232

    瀏覽量

    45366
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何開發(fā)不帶Flash API 的Bootloader實(shí)現(xiàn)在線升級(jí)

    電子發(fā)燒友網(wǎng)站提供《如何開發(fā)不帶Flash API 的Bootloader實(shí)現(xiàn)在線升級(jí).pdf》資料免費(fèi)下載
    發(fā)表于 09-12 09:41 ?0次下載
    如何開發(fā)不帶Flash API 的<b class='flag-5'>Bootloader</b>實(shí)現(xiàn)在線升級(jí)

    nxps32k144安全啟動(dòng)校驗(yàn)bootloader完整性

    bootloader整個(gè)代碼的完整性不太理解; 1.我的理解是在bootloader的main函數(shù)最開始,進(jìn)行bootloader的CSEc密鑰下載和安全啟動(dòng)使能,并最后進(jìn)行密鑰驗(yàn)證,并且這段代碼是
    發(fā)表于 07-02 21:07

    bootloader如何使用定時(shí)器和串口?

    行了定時(shí)器的使用,發(fā)現(xiàn)bootloader無(wú)法使用軟件定時(shí)器,因?yàn)閮?nèi)部有freertos的相關(guān)接口調(diào)用。看了文檔對(duì)“自定義引導(dǎo)程序”的描述,我要把使用到的其他組件源碼放到bootloader目錄
    發(fā)表于 06-14 08:06

    如何才能將Bootloader和Application關(guān)聯(lián)起來(lái)

    接下來(lái),我們要利用該Bootloader調(diào)試目標(biāo)Application Project,如何才能將Bootloader和Application關(guān)聯(lián)起來(lái)呢?就需要借助剛才提到的Bootloader Project Build所生成
    的頭像 發(fā)表于 06-12 14:32 ?436次閱讀
    如何才能將<b class='flag-5'>Bootloader</b>和Application關(guān)聯(lián)起來(lái)

    STM32H7B0和STM32H730系統(tǒng)自帶Bootloader的起始地址是什么?

    在官方的文檔《AN2606_STM32微控制器系統(tǒng)存儲(chǔ)器啟動(dòng)模式》(最新版49)未找到對(duì)應(yīng)的STM32H7B0和STM32H730 系統(tǒng)自帶Boo
    發(fā)表于 03-27 07:14

    STM32L431RCT6從用戶代碼區(qū)跳轉(zhuǎn)使用內(nèi)置system memory bootloader無(wú)效怎么解決?

    STM32L431RCT6 從用戶代碼區(qū)跳轉(zhuǎn)使用內(nèi)置system memory bootloader 無(wú)效。 1. 跳轉(zhuǎn)代碼如下,這個(gè)代碼 可以在STM32F407VET6上正常跳轉(zhuǎn) 內(nèi)置
    發(fā)表于 03-26 07:54

    STM32H750 BootLoader如何重刷?

    STM32H750 BootLoader如何重刷,在哪里可以找到文檔
    發(fā)表于 03-20 06:44

    請(qǐng)問(wèn)STM32bootloader怎么制作?

    我對(duì)STM32也算是比較熟悉了,但是呢, 沒(méi)有弄過(guò) STM32bootloader。也不知道怎么弄的。像,Linux,藍(lán)牙等 都有 類型的demo 供你學(xué)習(xí)和開發(fā)。 請(qǐng)問(wèn),STM32
    發(fā)表于 03-07 07:50

    STM32案例:BootLoader是怎么跳到App

    BootLoader項(xiàng)目程序和App項(xiàng)目程序是分開的,所以需要分別搭建對(duì)應(yīng)的項(xiàng)目工程文件,分開搭建文件是為了好配置,同時(shí)也是方便對(duì)項(xiàng)目進(jìn)行管理。
    發(fā)表于 03-04 09:35 ?3035次閱讀
    <b class='flag-5'>STM32</b>案例:<b class='flag-5'>BootLoader</b>是怎么跳到App

    STM32無(wú)法進(jìn)入片上Bootloader的處理方法

    STM32無(wú)法進(jìn)入片上Bootloader的處理方法? 當(dāng)STM32芯片無(wú)法進(jìn)入片上Bootloader時(shí),我們需要采取一系列的處理方法來(lái)解決這個(gè)問(wèn)題。以下將詳細(xì)介紹一些常見的處理方法
    的頭像 發(fā)表于 02-02 14:33 ?1500次閱讀

    基于MM32F0140的UDS Bootloader學(xué)習(xí)筆記

    基于MM32F0140的UDS Bootloader學(xué)習(xí)筆記
    的頭像 發(fā)表于 10-30 17:11 ?586次閱讀
    基于MM32F0140的UDS <b class='flag-5'>Bootloader</b>學(xué)習(xí)筆記

    單片機(jī)BootLoader與APP如何合并?

    單片機(jī)BootLoader與APP如何合并?
    的頭像 發(fā)表于 10-25 17:17 ?944次閱讀
    單片機(jī)<b class='flag-5'>BootLoader</b>與APP如何合并?

    ART-Pi Bootloader分析,驅(qū)動(dòng)SD卡和USB設(shè)備做TF讀卡器

    我看了Z_Tam大佬創(chuàng)建一個(gè)Bootloader工程,然后下載到板子上,然后也說(shuō)明了BootLoader主要功能:BootLoader主要用于使用外掛Falsh存儲(chǔ)代碼時(shí) 初始化外掛的Flash、映射物理地址及地址跳轉(zhuǎn)。
    的頭像 發(fā)表于 10-09 10:30 ?1073次閱讀
    ART-Pi <b class='flag-5'>Bootloader</b>分析,驅(qū)動(dòng)SD卡和USB設(shè)備做TF讀卡器

    STM32F09x不使用BOOT腳實(shí)現(xiàn)System Bootloader升級(jí)代碼

    電子發(fā)燒友網(wǎng)站提供《STM32F09x不使用BOOT腳實(shí)現(xiàn)System Bootloader升級(jí)代碼.pdf》資料免費(fèi)下載
    發(fā)表于 09-25 15:08 ?2次下載
    <b class='flag-5'>STM32</b>F09x不使用BOOT腳實(shí)現(xiàn)System <b class='flag-5'>Bootloader</b>升級(jí)代碼

    STM32 Bootloader異常復(fù)位案例

    電子發(fā)燒友網(wǎng)站提供《STM32 Bootloader異常復(fù)位案例.pdf》資料免費(fèi)下載
    發(fā)表于 09-25 09:17 ?3次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>Bootloader</b>異常復(fù)位案例