什么是 Bootloader?怎么把它移植到 STM32 上?

一、Bootloader 是啥?它都干了些啥?

想象一下你的 MCU(比如 STM32)是一個小機器人,上電之后第一件事,它不會立馬開始“干正事”(運行你的主程序),而是先去運行一個“開場引導程序”——這就是 Bootloader。

它主要負責下面這些事:

  • 啟動最基礎的硬件:比如時鐘、串口、Flash 這些,像是“穿衣洗臉”。
  • 判斷要不要升級程序:比如你按了個按鈕、發了個串口命令,它就不跳到主程序,而是“停在門口”,準備接收新程序。
  • 接收并寫入新程序:它能從串口、USB、CAN、SD 卡等接收固件,然后擦掉舊程序,把新程序燒進去。
  • 最后跳轉到主程序:一切準備就緒,它就把控制權交給你寫的主程序,讓它正式運行。

通俗講,它就像是**“程序界的門房”**,開門、分發信件(固件)、開燈、安排進屋(跳轉),全由它負責。


二、Bootloader 跟主程序的位置是怎么安排的?

在 STM32 中,Flash 是按地址劃分的。一般我們這樣安排:

Bootloader 區域: 0x08000000 ~ 0x08003FFF
主程序區域(App): 0x08004000 ~ Flash 結尾

也就是說,Bootloader 占前面 16KB 的空間(你可以設更多),主程序從后面接著跑。它們不會互相干擾。

Bootloader 的典型流程就像這樣:

int main(void)
{HAL_Init();                    // 初始化硬件SystemClock_Config();         // 配置時鐘MX_USART2_UART_Init();        // 初始化串口if (check_upgrade_flag())     // 判斷是否需要升級{enter_upgrade_mode();     // 進入升級模式}jump_to_application();        // 跳到主程序區運行
}

三、Bootloader 做事情的重點是啥?

1. 固件怎么接收?

它可以從很多“入口”接收程序,比如:

  • 串口(UART)
  • USB(DFU 模式)
  • CAN、I2C、SPI
  • SD 卡、外部 Flash

接收過程里會做這些事:

  1. 檢查程序是不是完整(比如校驗 CRC)
  2. 擦掉舊程序(把 App 區的 Flash 擦了)
  3. 把新程序一點點寫進去
  4. 寫完了,打個勾:“升級完成了!”

2. 怎么跳轉到主程序?

最關鍵的是要設置好跳轉地址和棧指針。示例代碼如下:

#define APP_ADDR 0x08004000  // 主程序起始地址typedef void (*pFunction)(void);
pFunction JumpToApplication;
uint32_t JumpAddress;HAL_DeInit();               // 關閉外設
__disable_irq();            // 禁用中斷JumpAddress = *(__IO uint32_t*)(APP_ADDR + 4);
JumpToApplication = (pFunction)JumpAddress;__set_MSP(*(__IO uint32_t*)APP_ADDR); // 設置棧
JumpToApplication();                  // 跳轉!

要注意:

  • 0x08004000?第一個 4 字節是主程序的棧指針(MSP)
  • 第二個 4 字節是主程序的啟動地址(Reset_Handler)
  • 跳轉之前要把中斷關掉、外設關掉,不然主程序容易“誤會”你還沒交接完

四、怎么把 Bootloader 移植到 STM32 上?

如果你自己寫 Bootloader,要讓它配合你的主程序跑起來,大概分這幾步:

Step 1:規劃 Flash 分布

比如我們規劃:

  • Bootloader 占?0x08000000 ~ 0x08003FFF(16KB)
  • 主程序從?0x08004000?開始

這樣你就得去你的 App 工程里修改啟動地址,不然你主程序會被燒到 Bootloader 區,沖突了。

Step 2:寫 Bootloader 的功能

你得實現:

  • 初始化串口
  • 收數據 + 校驗
  • 擦除 Flash
  • 寫入新固件
  • 跳轉主程序

Step 3:改主程序的配置

  • 啟動文件?.s?或?.ld?文件中,把起始地址改成?0x08004000
  • 設置中斷向量表地址偏移:SCB->VTOR = 0x08004000;

不改這些,你的主程序可能跳轉不了,也收不到中斷。

Step 4:驗證!

Bootloader 燒進去 → 用它燒主程序 → 看能不能正常跳轉、運行

記得保留串口?printf?打印,出問題好排查。


五、移植過程中常見的“坑”和解決方案

問題原因
跳轉失敗中斷沒關 / 地址沒設對 / VTOR 沒設置
Flash 寫失敗沒解鎖 / 寫保護 / 地址錯誤
主程序不跑啟動文件地址沒改 / 向量表沒偏移
燒完程序沒反應沒跳轉、程序錯燒、校驗失敗

解決方法:

  • 多用串口打印調試信息
  • 多測試單步跳轉和Flash寫入
  • 主程序先寫一個最小的 Blinky(閃燈)測試跳轉是否成功

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

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

相關文章

無人機避障——感知篇(Ego_Planner_v2中的滾動窗口實現動態實時感知建圖grid_map ROS節點理解與參數調整影響)

處理器:Orin nx 雙目視覺傳感器:ZED2 實時感知建圖方法:Vins Fusion Raycast (VIO與射線投影法感知定位加建圖方法) 項目地址:https://github.com/ZJU-FAST-Lab/EGO-Planner-v2 【注意】:建…

26-計組-尋址方式

指令尋址與PC自增一、指令尋址方式定義:尋找下一條將要執行的指令地址的過程。 核心部件:程序計數器(PC),用于指示待執行指令的地址。 執行流程:CPU根據PC值從主存取指令。取指后,PC自動自增&am…

生成式對抗網絡(GAN)模型原理概述

生成對抗網絡(Generative Adversarial Network, GAN)是一種通過對抗訓練生成數據的深度學習模型,由生成器(Generator)和判別器(Discriminator)兩部分組成,其核心思想源于博弈論中的零…

Vue和Element的使用

文章目錄1.vue 腳手架創建步驟2.vue項目開發流程3.vue路由4.Element1.vue 腳手架創建步驟 創建一個文件夾 vue雙擊進入文件夾,在路徑上輸入cmd輸入vue ui, 目的:調出圖形化用戶界面點擊創建 9. 10.在vscode中打開 主要目錄介紹 src目錄介紹 vue項目啟動 圖形化界面中沒有npm…

如何設置直播間的觀看門檻,讓直播間安全有效地運行?

文章目錄前言一、直播間觀看門檻有哪幾種形式?二、設置直播間的觀看門檻,對直播的好處是什么三、如何一站式實現上述功能?總結前言 打造一個安全、高效、互動良好的直播間并非易事。面對海量涌入的觀眾,如何有效識別并阻擋潛在的…

【SkyWalking】配置告警規則并通過 Webhook 推送釘釘通知

🧭 本文為 【SkyWalking 系列】第 3 篇 👉 系列導航:點擊跳轉 【SkyWalking】配置告警規則并通過 Webhook 推送釘釘通知 簡介 介紹 SkyWalking 告警機制、告警規則格式以及如何通過 webhook 方式將告警信息發送到釘釘。 引入 服務響應超時…

關于 驗證碼系統 詳解

驗證碼系統的目的是:阻止自動化腳本訪問網頁資源,驗證訪問者是否為真實人類用戶。它通過各種測試(圖像、行為、計算等)判斷請求是否來自機器人。一、驗證碼系統的整體架構驗證碼系統通常由 客戶端 服務端 風控模型 數據采集 四…

微服務集成snail-job分布式定時任務系統實踐

前言 從事開發工作的同學,應該對定時任務的概念并不陌生,就是我們的系統在運行過程中能夠自動執行的一些任務、工作流程,無需人工干預。常見的使用場景包括:數據庫的定時備份、文件系統的定時上傳云端服務、每天早上的業務報表數…

依賴注入的邏輯基于Java語言

對于一個廚師,要做一道菜。傳統的做法是:你需要什么食材,就自己去菜市場買什么。這意味著你必須知道去哪個菜市場、怎么挑選食材、怎么討價還價等等。你不僅要會做菜,還要會買菜,職責變得復雜了。 而依賴注入就像是有一…

skywalking鏡像應用springboot的例子

目錄 1、skywalking-ui連接skywalking-oap服務失敗問題 2、k8s環境 檢查skywalking-oap服務狀態 3、本地iidea啟動服務連接skywalking oap服務 4、基于apache-skywalking-java-agent-9.4.0.tgz構建skywalking-agent鏡像 4.1、Dockerfile內容如下 4.2、AbstractBuilder.M…

3. java 堆和 JVM 內存結構

1. JVM介紹和運行流程-CSDN博客 2. 什么是程序計數器-CSDN博客 3. java 堆和 JVM 內存結構-CSDN博客 4. 虛擬機棧-CSDN博客 5. JVM 的方法區-CSDN博客 6. JVM直接內存-CSDN博客 7. JVM類加載器與雙親委派模型-CSDN博客 8. JVM類裝載的執行過程-CSDN博客 9. JVM垃圾回收…

UnityShader——SSAO

目錄 1.是什么 2.原理 3.各部分解釋 2.1.從屏幕空間到視圖空間 2.2.以法線半球為基,獲取隨機向量 2.3.應用偏移,并將其轉換為uv坐標 2.4.獲取深度 2.5.比較并計算貢獻 2.6.最后計算 4.改進 4.1.平滑過渡 4.2.模糊 5.變量和語句解釋 5.1._D…

【設計模式】外觀模式(門面模式)

外觀模式(Facade Pattern)詳解一、外觀模式簡介 外觀模式(Facade Pattern) 是一種 結構型設計模式,它為一個復雜的子系統提供一個統一的高層接口,使得子系統更容易使用。 外觀模式又稱為門面模式&#xff0…

【6.1.1 漫畫分庫分表】

漫畫分庫分表 “數據量大了不可怕,可怕的是不知道如何優雅地拆分。” 🎭 人物介紹 架構師老王:資深數據庫架構專家,精通各種分庫分表方案Java小明:對分庫分表充滿疑問的開發者ShardingSphere師傅:Apache S…

Tomcat問題:啟動腳本startup.bat中文亂碼問題解決

一、問題描述 我們第一次下載或者打開Tomcat時可能在控制臺會出現中文亂碼問題二、解決辦法 我的是8.x版本的tomcat用notepad打開:logging.properties 找到:java.util.logging.ConsoleHandler.encoding設置成GBK,重啟tomcat即可

Linux中Gitee的使用

一、Gitee簡介:Gitee(碼云)是中國的一個代碼托管和協作開發平臺,類似于GitHub或GitLab,主要面向開發者提供代碼管理、項目協作及開源生態服務。適用場景個人開發者:托管私有代碼或參與開源項目。中小企業&a…

Oracle大表數據清理優化與注意事項詳解

一、性能優化策略 1. 批量處理優化批量大小選擇: 小批量(1,000-10,000行):減少UNDO生成,但需要更多提交次數中批量(10,000-100,000行):平衡性能與資源消耗大批量(100,000行):適合高配置環境,但需監控資源使…

Anaconda及Conda介紹及使用

文章目錄Anaconda簡介為什么選擇 Anaconda?Anaconda 安裝Win 平臺macOS 平臺Linux 平臺Anaconda 界面使用Conda簡介Conda下載安裝conda 命令環境管理包管理其他常用命令Jupyter Notebook(可選)Anaconda簡介 Anaconda 是一個數據科學和機器學…

外包干了一周,技術明顯退步

我是一名本科生,自2019年起,我便在南京某軟件公司擔任功能測試的工作。這份工作雖然穩定,但日復一日的重復性工作讓我逐漸陷入了舒適區,失去了前進的動力。兩年的時光匆匆流逝,我卻在原地踏步,技術沒有絲毫…

【QT】多線程相關教程

一、核心概念與 Qt 線程模型 1.線程與進程的區別: 線程是程序執行的最小單元,進程是資源分配的最小單元,線程共享進程的內存空間(堆,全局變量等),而進程擁有獨立的內存空間。Qt線程只要關注同一進程內的并發。 2.為什么使用多線程…