国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    11279

    瀏覽量

    224971
  • 操作系統
    +關注

    關注

    37

    文章

    7402

    瀏覽量

    129299
  • STM32
    +關注

    關注

    2309

    文章

    11162

    瀏覽量

    373440
  • bootloader
    +關注

    關注

    2

    文章

    244

    瀏覽量

    48036
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    USBISP/USBasp編程器給Atmega32U4下載Arduino bootloader引導程序

    對于新出廠的ATmega32U4芯片內部是沒有arduino引導程序的,需要用戶預先下載bootloader后才能用串口下載自己的應用程序.在某些罕見情況下舊的bootloader會導致一些bug
    的頭像 發表于 01-31 14:38 ?675次閱讀
    USBISP/USBasp編程器給Atmega32U4下載Arduino <b class='flag-5'>bootloader</b>引導程序

    Linux如何防止內存沖突?

    在聊這個話題之前,我們先回憶一下單片機系統是如何分配內存的?如果沒有bootloader,那硬件環境起來之后就直接進入主程序運行,如果有引導程序b
    的頭像 發表于 01-30 16:51 ?1356次閱讀
    Linux如何防止<b class='flag-5'>內存</b>沖突?

    深入解析rk平臺Android Bootloader核心代碼:從啟動流程到AVB驗證

    U-BootAndroid Bootloader的核心實現,核心作用是 銜接硬件初始化與內核啟動 ,主要負責: ?讀寫Bootloader控制塊(BCB),判斷設備啟動
    的頭像 發表于 01-22 07:06 ?267次閱讀
    深入解析rk平臺Android <b class='flag-5'>Bootloader</b>核心代碼:從啟動流程到AVB驗證

    LAT1171+STM32F745 USART1 Bootloader 失敗原因分析與解決

    STM32Bootloader 可以支持多種協議的,比如 USART,I2C,DFU 等等,USARTBootloader 是客戶使用 STM32 的時候常常會用到的協議。客戶在
    發表于 01-11 17:33 ?0次下載

    深入解析RK平臺Android/Linux Bootloader核心文件:android_bootloader.c

    Bootloader是Android設備啟動的第一道“關卡”,負責初始化硬件、加載系統鏡像并完成內核啟動的前置準備。在基于U-Boot的Android設備,android_bootloader
    的頭像 發表于 01-09 10:58 ?1197次閱讀
    深入解析RK平臺Android/Linux <b class='flag-5'>Bootloader</b>核心文件:android_<b class='flag-5'>bootloader</b>.c

    Bootloader固件升級的步驟

    的備份區復制到主映像這兩種情況下,我們將通過 Bootloader 去運行目前的主映像的代碼。 在添加 Bootloader 功能時,最關鍵的部分是如何分配好每個部分的存儲區域,從程
    發表于 11-19 07:41

    bootloader無法更新的原因?

    bootloader下載新的固件后,重啟在download區搬新的固件時,就出現地址錯誤是怎么回事
    發表于 10-11 06:07

    Art-Pi2的BootLoader用rtthread有什么特殊的作用嗎?

    我的基礎不太好,在創建artpi2的bootloader的例程的時候發現bootloader編譯完好像不小,然后發現bootloader里面也用上了rtthread的系統,不太明白這里使用rtthread有沒有什么特殊的作用。
    發表于 09-22 06:28

    通用bootloader無法使用45db161flash怎么解決?

    通用bootloader不選“支持spi flash”,download放于片內flash,正常啟動,ota正常,app驅動at45db161讀寫正常。通用bootloader選“支持spi
    發表于 09-18 08:23

    stm32f407ZGT6生成的bootloader打印的app分區偏移地址正常嗎?

    stm32f407ZGT6生成的bootloader打印的app分區偏移地址正常嗎?bootloader使用iot平臺配置自動生成的,日志信息如下圖
    發表于 08-15 08:24

    Art-Pi2的BootLoader用rtthread有什么特殊的作用嗎?

    我的基礎不太好,在創建artpi2的bootloader的例程的時候發現bootloader編譯完好像不小,然后發現bootloader里面也用上了rtthread的系統,不太明白這里使用rtthread有沒有什么特殊的作用。
    發表于 05-27 06:08

    飛凌嵌入式ElfBoard ELF 1板卡-Uboot簡介之BootLoader

    合適的環境,loader就是指將內核從存儲介質(啟動介質)中加載到內存RAM,然后跳轉到內核所在內存地址運行內核。總之,BootLoader是內核啟動之前為內核搭建軟硬件環境的一段程
    發表于 05-22 10:42

    U-Boot 和 Bootloader,99% 的工程師都分不清?

    嵌入式軟件工程師聽說過 u-boot 和 bootloader,但很多工程師依然不知道他們到底是啥。 ? 今天就來簡單講講?u-boot 和 bootloader?的內容以及區別
    的頭像 發表于 03-25 20:47 ?1790次閱讀

    求助,關于STM32串口Bootloader的兩個問題求解

    串口Bootloader兩個問題: 1.APP和Bootloader對于串口的初始化以及中斷處理函數的定義是否需要保持一致,特別是有關接收和發送的緩沖區? 2.Bootloader
    發表于 03-12 07:17

    自定義RISC V的bootloader-v3

    在生成SoC時,會生成一個預定義bootloader .bin文件,用于指定soc的工程運行的地址,這包括在flash的存儲地址 ,加載到外存的運行地址及在外存中分配的存儲空間的大小 。下面我們
    的頭像 發表于 03-10 09:05 ?1716次閱讀
    自定義RISC V的<b class='flag-5'>bootloader</b>-v3