STM32 Bootloader:使用文件頭加載并啟動應用程序

文章目錄

  • STM32 Bootloader:使用文件頭加載并啟動應用程序的完整解析
    • 一、系統整體流程
    • 二、鏡像頭結構 image\_header\_t
    • 三、Bootloader 主函數流程
      • 1. 初始化 UART
      • 2. 調用啟動函數
      • 3. 拷貝 APP 并跳轉啟動
    • 四、跳轉執行 APP 的實現
    • 五、總結與擴展思路


明白了,以下是去除表情后的正式技術文章版本:


STM32 Bootloader:使用文件頭加載并啟動應用程序的完整解析

在嵌入式系統中,Bootloader 是系統啟動的第一段程序,它的主要職責是加載應用程序、校驗完整性以及為遠程升級提供支持。本文將結合一個基于 STM32 的 Bootloader 實例,詳細講解如何借助鏡像頭(Image Header)從 Flash 中加載并執行主應用程序。


一、系統整體流程

本文的 Bootloader 實現具有以下基本功能流程:

  1. 初始化 UART,輸出啟動信息;
  2. 從指定的 Flash 地址讀取應用程序頭部結構;
  3. 解析鏡像頭部,獲取程序加載地址和大小;
  4. 將應用程序從 Flash 拷貝到 RAM;
  5. 設置中斷向量表并跳轉到應用程序入口地址。

流程圖如下:

啟動 Bootloader↓
讀取 image_header_t↓
解析 ih_load / ih_size↓
Flash → RAM 拷貝程序數據↓
配置向量表↓
跳轉執行 APP

二、鏡像頭結構 image_header_t

為了描述應用程序的信息,Bootloader 使用一個自定義的數據結構 image_header_t,包含如下字段:

typedef struct image_header {__be32 ih_magic;      // 魔數,用于識別合法鏡像__be32 ih_hcrc;       // 頭部 CRC 校驗值__be32 ih_time;       // 鏡像生成時間戳__be32 ih_size;       // 應用程序大小(單位:字節)__be32 ih_load;       // 應用加載地址__be32 ih_ep;         // 程序入口地址__be32 ih_dcrc;       // 數據部分 CRC 校驗uint8_t ih_os;        // 操作系統標識uint8_t ih_arch;      // CPU 架構uint8_t ih_type;      // 鏡像類型uint8_t ih_comp;      // 壓縮類型uint8_t ih_name[32];  // 鏡像名稱
} image_header_t;

為了確保頭部字段正確讀取,還實現了 be32_to_cpu 函數來轉換大端字節序為當前平臺字節序:

unsigned int be32_to_cpu(unsigned int x) {unsigned char *p = (unsigned char *)&x;return (p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3];
}

三、Bootloader 主函數流程

1. 初始化 UART

uart_init();
putstr("bootloader\r\n");

用于串口輸出調試信息。

2. 調用啟動函數

unsigned int app_pos = 0x08040000;
relocate_and_start_app(app_pos);

指定 APP 存放在 Flash 的 0x08040000 位置。

3. 拷貝 APP 并跳轉啟動

relocate_and_start_app 是整個 Bootloader 的核心函數,負責:

  • 解析頭部信息;
  • 讀取加載地址和大小;
  • 拷貝程序數據到目標 RAM 區域;
  • 設置向量表基地址;
  • 跳轉到新的應用入口。
void relocate_and_start_app(unsigned int pos) {image_header_t *head = (image_header_t *)pos;unsigned int load = be32_to_cpu(head->ih_load);unsigned int size = be32_to_cpu(head->ih_size);unsigned int new_pos = pos + sizeof(image_header_t);putstr("load = "); puthex(load); putstr("\r\n");putstr("size = "); puthex(size); putstr("\r\n");copy_app((int *)new_pos, (int *)load, size);start_app(new_pos);  // 跳轉執行
}

copy_app 函數用于將應用程序從 Flash 拷貝到 RAM:

void copy_app(int *from, int *to, int len) {for (int i = 0; i < len/4+1; i++) {to[i] = from[i];}
}

四、跳轉執行 APP 的實現

start_app PROCEXPORT start_app; 設置向量表地址ldr r3, =0xE000ED08  ; VTOR 寄存器地址str r0, [r3]         ; 寫入新的向量表地址ldr sp, [r0]         ; 設置新棧頂ldr r1, [r0, #4]     ; 獲取復位向量(入口地址)BX r1                ; 跳轉執行應用ENDP

這段匯編設置了新的中斷向量表,并將控制權轉移到應用程序。


五、總結與擴展思路

該 Bootloader 實現了基礎但關鍵的功能:從 Flash 加載帶有文件頭的應用程序,并跳轉執行。這種結構使得:

  • 多固件管理更加方便;
  • 支持版本號校驗、CRC 校驗;
  • 可進一步擴展支持壓縮、加密等功能;
  • 便于在線升級(IAP)系統實現。

后續可擴展的方向:

  1. 加入頭部校驗(如 CRC)確保數據完整性;
  2. 支持多應用啟動(例如主應用 + 備份應用);
  3. 添加通信接口,如通過串口、USB、以太網接收新固件;
  4. 使用加密技術保護固件安全性。

如需進一步學習如何構建符合自己需求的 Bootloader,可結合具體芯片手冊及啟動流程,調整 向量表地址RAM 空間劃分啟動模式 等參數。

如果你希望支持更多啟動方式,例如從 SD 卡、串口或外部 Flash 啟動,也可以參考該結構擴展模塊加載邏輯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83668.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83668.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83668.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

無外接物理顯示器的Ubuntu系統的遠程桌面連接(升級版)

文章目錄 操作步驟實踐截圖配置 Xorg 的虛擬顯示界面(升級版) 操作步驟 “遠程連接”,在設置里直接打開就可以.進行配置就行. 1.配置 GRUB 以支持無顯示器啟動 sudo nano /etc/default/grub (里面有一行改為: GRUB_CMDLINE_LINUX_DEFAULT"quiet splash videovesa:off vi…

ACCU-100安科瑞協調控制器:精準調控光伏逆變器

產品概述 ACCU-100微電網協調控制器是一款應用于微電網、分布式發電、儲能等領域的智能協調控制器。它能接入光伏系統、風力發電、儲能系統以及充電樁等設備&#xff0c;通過對微電網系統進行數據采集與分析&#xff0c;實時監控各類設備的運行狀態和健康狀況。在此基礎上&…

長春光博會 | 麒麟信安:構建工業數字化安全基座,賦能智能制造轉型升級

6月10日-13日&#xff0c;2025長春國際光電博覽會Light國際會議&#xff08;簡稱長春光博會&#xff09;在長春東北亞國際博覽中心盛大舉行&#xff0c;吉林省委書記黃強出席并宣布開幕&#xff0c;省委副書記、省長胡玉亭致辭。本屆大會聚焦光電信息領域的前沿技術和最新產品&…

書寫時垂直筆畫比水平筆畫表現更好的心理機制分析

你有寫字的時候總是垂直方向筆畫好寫&#xff0c;水平方向的筆畫不好寫的情況存在嗎&#xff1f; 書寫時垂直筆畫比水平筆畫表現更好的心理機制分析 從人類認知和行為模式的角度來理解這種現象。以下是深度心理分析&#xff1a; 核心心理動因 重力知覺內化&#xff1a; 垂直…

SpringAI使用總結

SpringAI使用總結 基本使用ChatModel和ChatClient簡單對話流式輸出預設角色prompt&#xff08;提示詞&#xff09;function call&#xff08;工具調用&#xff09;參考 基本使用 ChatModel和ChatClient SpringAi支持非常多的模型&#xff0c;為了統一處理&#xff0c;SpringA…

歷史交易數據漲跌分級

歷史交易數據漲跌分級 # encoding:utf-8 import sys,traceback from loguru import loggersys.path.append("..") from QhSpiderTool import QhDorpFiled from QhCsvMode import *def QhZhangDieFenJi(QhDfData,QhFangFa"A"):"""歷史交易數…

Kafka入門4.0.0版本(基于Java、SpringBoot操作)

Kafka入門4.0.0版本&#xff08;基于Java、SpringBoot操作&#xff09; 一、kafka概述 Kafka最初是由LinkedIn公司開發的&#xff0c;是一個高可靠、高吞吐量、低延遲的分布式發布訂閱消息系統&#xff0c;它使用Scala語言編寫&#xff0c;并于2010年被貢獻給了Apache基金會&…

react react-router-dom中獲取自定義參數v6.4版本之后

路由配置, AutnToken 組件作為權限、登錄管理 import { createBrowserRouter, Navigate } from react-router-dom; import Layout from /layout/index; import Login from /pages/login; import Page404 from /pages/404;import AutnToken from /components/authToken; import…

AI中的Prompt

1. System 作用&#xff1a;設定 AI 的“角色設定”和“行為準則”。 內容&#xff1a;通常是描述 LLM 的身份、語氣、行為范圍、約束規則。 類似&#xff1a;在大語言模型中是最優先被考慮的提示。 示例&#xff1a; 你是一個專業的商品評價分析助手&#xff0c;請根據用戶…

從人工到智能:IACheck如何重構檢測報告審核工作流?

從人工到智能&#xff1a;IACheck如何重構檢測報告審核工作流&#xff1f; 在當今AI技術迅猛發展的時代&#xff0c;各行各業正經歷從“人工驅動”到“智能驅動”的根本性變革。檢測認證&#xff08;TIC&#xff09;行業作為關乎質量與安全的重要支柱&#xff0c;也不例外。在…

React事件處理:如何給按鈕綁定onClick點擊事件?

系列回顧&#xff1a; 在前幾篇文章中&#xff0c;我們已經學會了如何使用 State 管理組件的內部數據&#xff0c;以及如何通過 Props 實現父子組件之間的通信。我們的組件現在已經有了“數據”和“外觀”。但是&#xff0c;它還像一個只能看的“模型”&#xff0c;無法與用戶進…

【機器學習|學習筆記】粒子群優化(Particle Swarm Optimization, PSO)詳解,附代碼。

【機器學習|學習筆記】粒子群優化&#xff08;Particle Swarm Optimization, PSO&#xff09;詳解&#xff0c;附代碼。 【機器學習|學習筆記】粒子群優化&#xff08;Particle Swarm Optimization, PSO&#xff09;詳解&#xff0c;附代碼。 文章目錄 【機器學習|學習筆記】粒…

深度剖析:AI 社媒矩陣營銷工具,如何高效獲客?

在社交媒體營銷領域&#xff0c;競爭日益激烈&#xff0c;傳統的社媒矩陣運營方式面臨諸多挑戰。而 AI 社媒矩陣營銷工具的出現&#xff0c;正以前所未有的方式重構社媒矩陣的底層架構&#xff0c;為營銷人員帶來了全新的機遇與變革。接下來&#xff0c;我們將從技術破局、實戰…

Spring XML 常用命名空間配置

Spring XML 常用命名空間配置 下面是一個綜合性的Spring XML配置樣例&#xff0c;展示了各種常用命名空間的使用方式&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans&quo…

UE5場景漫游——開始界面及關卡跳轉

UE中實現UMG游戲界面搭建及藍圖控制&#xff0c;點擊游戲界面中的按鈕實現關卡的跳轉效果。 一、游戲界面顯示。1.創建UMG&#xff0c;2.搭建UI。3.關卡藍圖控制顯示 二、點擊按鈕之后實現關卡跳轉

CSS 外邊距合并(Margin Collapsing)問題研究

在 CSS 中&#xff0c;margin-top 屬性會導致外部 DIV 移動的現象主要是由于 外邊距合并&#xff08;Margin Collapsing&#xff09; 造成的。這是 CSS 盒模型的一個特性&#xff0c;可能會與直覺相悖。 外邊距合并的原理 當一個元素&#xff08;如內部 DIV&#xff09;的 ma…

清理電腦C磁盤,方法N:使用【360軟件】中的【清理C盤空間】

1、先下載并打開【360安全衛士】&#xff0c;點擊如下位置&#xff1a; 之后&#xff0c;可以把這個東西&#xff0c;創建快捷方式到電腦桌面&#xff0c;方便以后使用&#xff1a;

微服務集成seata分布式事務 at模式快速驗證

微服務集成Seata分布式事務 本次demo代碼地址業務場景&#xff1a;一般用于以下場景&#xff1a;使用 AT 模式的優勢&#xff08;適用于快速驗證&#xff09;&#xff1a;快速驗證建議步驟&#xff1a;注意事項&#xff1a; 工具環境微服務版本選擇Nacos 環境搭建與啟動nacos 下…

LLM基礎5_從零開始實現 GPT 模型

基于GitHub項目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 設計 LLM 的架構 GPT 模型基于 Transformer 的 decoder-only 架構&#xff0c;其主要特點包括&#xff1a; 順序生成文本 參數數量龐大&#xff08;而非代碼量復雜&#xff09; 大量重復…

Android 中 linux 命令查詢設備信息

一、getprop 命令 在 Linux 系統中&#xff0c; getprop 命令通常用于獲取 Android 設備的系統屬性&#xff0c;這些屬性包括設備型號、Android 版本、電池狀態等。 1、獲取 Android 版本號 adb shell getprop ro.build.version.release2、獲取設備型號 adb shell getprop …