STM32 - 內存分區與OTA

最近搞MCU,發現它與SOC之間存在諸多差異,不能沿用SOC上一些技術理論。本文以STM L4為例,總結了一些STM32 小白入門指南。

標題MCU沒有DDR?

是的。MCU并沒有DDR,而是讓代碼存儲在nor flash上,臨時變量和棧運行在SRAM上。之所以這么做是因為MCU的cpu頻率很低,都是幾十MHZ到一二百MHZ,nor flash的讀取速度能夠滿足cpu 的取指需求,但nor flash 的寫入速度很慢,所以引入了SRAM 作為臨時變量和棧的運行空間。

標題STM32啟動方式

STM32提供三種上電后的引導方式:從 flash引導啟動,從 system memory引導啟動 和 從 SRAM引導啟動。

從 flash引導啟動就是加載 flash里面的 bin文件,運行用戶燒錄后的固件程序。

從 system memory啟動是去運行MCU出廠自帶的一塊 ROM程序,該程序可稱作為bootloader,提供通過串口、I2C、SPI或者USB去燒錄flash,防止flash擦除后變磚,也可以用來實現MCU OTA,但要想用起來還需要遵從通訊協議開發上位機程序。STM32 Cube Programmer應該也是利用這段程序,完成 flash燒錄的。

從 SRAM啟動,比較難理解,SRAM不是掉電易失嗎?怎么還能引導啟動?既然SRAM是掉電易失,那就要寫入程序后不掉電,直接切換跳轉運行,所以該模式主要用來做在線仿真,使用場景比較小眾。

這三種啟動方式的選擇是通過外部的BOOT0 pin或者 nSWBOOT0 option bit配置選擇的。

但如果boot配置為flash啟動,但flash又為空怎么辦?這個ST也已經考慮到了,在這種情況下,檢查發現flash為空,cpu轉頭會去運行system memory程序,所以你會發現即使flash沒程序,上電后某些GPIO仍然被配置了,其實這就是內部ROM程序運行導致的后果。詳細內容參看官方文檔: AN2606。

分析一下內存地址表:
在這里插入圖片描述

可以發現,CPU上電后是從地址 0開始運行的,但地址0 處存放的是什么代碼?取決于BOOT configuration,不同的BOOT configuration會導致不同代碼映射到0 地址處。

Flash memory的地址范圍是0x08000000 ~ 0x08020000,所以 該MCU所支持掛載的最大flash容量為0x20000 byte,即128KB。flash的燒錄地址也只能在這個范圍選擇。

標題STM32 OTA實現方案

標題方案一:bootloader + AB分區

該方案把flash分為三個區:bootloader、A分區、B分區。

bootloader分區代碼不參與升級,只負責引導分區和升級檢查。A和B 分區大小需要一致,里面是需要OTA的業務邏輯代碼。升級時,將升級固件寫入A或B分區,重啟之后,bootloader根據A B分區的版本號跳轉到最新的版本分區代碼運行。這樣做的好處是:1、無感升級,不需要進專門的燒錄模式,可以在正常業務運行的情況下升級寫入flash。2、不會變磚,即使升級寫入flash失敗,依然存在上一個版本的固件可以使用,安全性高。

缺點:flash容量需求大。

標題方案二:bootloader + A分區

該方案可節省一個分區,對flash壓力很小。升級燒錄邏輯放在 bootloader,app在接收到升級請求后跳轉執行到bootloader代碼,bootloader進行數據接收和flash燒錄,完成后,跳轉執行app程序,升級完成。

該方案適用性好,畢竟很少會因為OTA,而閑置一半的 flash空間。此模式需要MCU處于燒錄模式,燒錄失敗后,無法正常運行,只能重新嘗試升級燒錄。

標題方案三:直接利用system memory分區進行升級

與方案二的區別就是不用寫bootloader代碼,直接重啟利用boot pin引導進入system memory分區,利用里面的ROM代碼進行flash燒寫。缺點就是需要配置boot pin重啟,風險大,且bootloader是官方固化提供的,無法修改,使用不方便,但也是一條路子。參考文檔:AN3155。
在這里插入圖片描述

在這里插入圖片描述

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

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

相關文章

yolov5實例分割跑通以及C#讀取yolov5_Seg實例分割轉換onnx進行檢測部署

一、首先需要訓練yolov5_seg的模型,可以去網上學習,或者你直接用我的, 訓練環境和yolov5—7.0的環境一樣,你可以直接拷過來用。 yolov5_seg算法 鏈接:https://pan.baidu.com/s/1m-3lFWRHwg5t8MmIOKm4FA 提取碼&…

【MySQL】1.初識MySQL

初識MySQL 一.MySQL 安裝1.卸載已有的 MySQL2.獲取官方 yum 源3.安裝 MySQL4.登錄 MySQL5.配置 my.cnf 二.MySQL 數據庫基礎1.MySQL 是什么?2.服務器,數據庫和表3.mysqld 的層狀結構4.SQL 語句分類 一.MySQL 安裝 1.卸載已有的 MySQL //查詢是否有相關…

《Windows API每日一練》8.3 scrollbar控件

在第三章SYSMETS2.C實例中,我們是通過CreateWindow函數創建窗口的參數窗口樣式中添加垂直或水平滾動條。本節我們將講述作為子窗口控件的滾動條。 本節必須掌握的知識點: 滾動條類 滾動條控件和著色 8.3.1 滾動條類 ■窗口滾動條與滾動條控件的異同 …

Python常量與變量的終極指南:從基礎到進階的15個要點

今天,我們將一起揭開Python中最基本但也極其重要的概念——常量與變量的神秘面紗。別擔心,我會用最簡單直白的語言,讓你從入門到略有小成,一步步掌握這些核心知識。準備好你的筆記本,讓我們開始這場Python之旅吧&#…

在Linux環境下搭建Redis服務結合內網穿透實現通過GUI工具遠程管理數據庫

文章目錄 前言1. 安裝Docker步驟2. 使用docker拉取redis鏡像3. 啟動redis容器4. 本地連接測試4.1 安裝redis圖形化界面工具4.2 使用RDM連接測試 5. 公網遠程訪問本地redis5.1 內網穿透工具安裝5.2 創建遠程連接公網地址5.3 使用固定TCP地址遠程訪問 前言 本文主要介紹如何在Li…

mysql 9 新特新

mysql9新特性 新特性Audit Log NotesC API NotesCharacter Set SupportCompilation NotesComponent NotesConfiguration NotesData Dictionary NotesData Type NotesDeprecation and Removal NotesEvent Scheduler NotesJavaScript ProgramsOptimizer NotesPerformance Schema …

Spring中的事件監聽器使用學習

一、什么是Spring中的事件監聽機制? Spring框架中的事件監聽機制是一種設計模式,它允許你定義和觸發事件,同時允許其他組件監聽這些事件并在事件發生時作出響應。這種機制基于觀察者模式,提供了一種松耦合的方式來實現組件間的通信…

Linux 系統性能分析與故障排查:從入門到進階

Linux 系統性能分析與故障排查:從入門到進階 作為系統管理員或 IT 專業人員,掌握系統性能分析和故障排查技能至關重要。這些技能可以幫助你識別和解決系統性能問題,確保系統穩定運行。本文將介紹系統性能分析和故障排查的基本方法&#xff0…

CTF實戰:從入門到提升

CTF實戰:從入門到提升 🚀前言 沒有網絡安全就沒有國家安全,網絡安全不僅關系到國家整體信息安全,也關系到民生安全。近年來,隨著全國各行各業信息化的發展,網絡與信息安全得到了進一步重視,越…

XAML 框架橫向對比

多年來,基于 XAML 的 UI 框架有了很大的發展。下面的圖表很好地證明了這個觀點。XAML UI 框架的三大巨頭:Avalonia UI、Uno Platform 和 .NET MAUI 都支持跨平臺的應用。事實上,除了 Avalonia UI,對跨平臺 XAML 的需求是它們發展的…

【深度學習】圖形模型基礎(5):線性回歸模型第四部分:預測與貝葉斯推斷

1.引言 貝葉斯推斷超越了傳統估計方法,它包含三個關鍵步驟:結合數據和模型形成后驗分布,通過模擬傳播不確定性,以及利用先驗分布整合額外信息。本文將通過實際案例闡釋這些步驟,展示它們在預測和推斷中的挑戰和應用。…

Unity 使用AVProMovieCapture實現Game視圖屏幕錄制

內容將會持續更新,有錯誤的地方歡迎指正,謝謝! Unity 使用AVProMovieCapture實現Game視圖屏幕錄制 TechX 堅持將創新的科技帶給世界! 擁有更好的學習體驗 —— 不斷努力,不斷進步,不斷探索 TechX —— 心探索、心…

【云計算】公有云、私有云、混合云、社區云、多云

公有云、私有云、混合云、社區云、多云 1.云計算的形態1.1 公有云1.2 私有云1.3 混合云1.4 社區云1.5 多云1.5.1 多云和混合云之間的關系1.5.2 多云的用途1.5.3 影子 IT 和多云1.5.4 優缺點 2.不同云形態的對比 1.云計算的形態 張三??在家做飯吃,這是 私有云&…

liunx上修改Firefox版本號

在Linux上修改Firefox的版本號并不直接推薦也不鼓勵,因為這可能會影響到瀏覽器的安全性、兼容性和自動更新功能。但如果你因為某些特殊測試場景確實需要修改其顯示的版本號(請注意,這樣做可能會引發不可預料的問題),可…

【擴散模型】LCM LoRA:一個通用的Stable Diffusion加速模塊

潛在一致性模型:[2310.04378] Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference (arxiv.org) 原文:Paper page - Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference (…

ELK優化之Filebeat部署

目錄 1.安裝配置Nginx 2.安裝 Filebeat 3.設置 filebeat 的主配置文件 4.修改Logstash配置 5.啟動配置 6.kibana驗證 主機名ip地址主要軟件es01192.168.9.114ElasticSearches02192.168.9.115ElasticSearches03192.168.9.116ElasticSearch、Kibananginx01192.168.9.113ng…

【鎖】各種鎖的概念

解釋一下什么是樂觀鎖、悲觀鎖、自旋鎖、互斥鎖、讀寫鎖、排他鎖、共享鎖、統一鎖、分段鎖? 定義角度不同,通常把(樂觀鎖、悲觀鎖)、(自旋鎖、互斥鎖)、(讀寫鎖、排他鎖、共享鎖)、…

Redis---9---集群(cluster)

將新增的6387節點(空槽號)作為master節點加入原集群 Redis—9—集群(cluster) 是什么 定義 ? 由于數據量過大,單個Master復制集難以承擔,因此需要對多個復制集進行集群,形成水平擴展每個復…

Selenium 切換窗口

環境: Python 3.8 selenium3.141.0 urllib31.26.19說明: driver.current_window_handle # 返回當前窗口的句柄 driver.window_handles # 返回當前由driver啟動所有窗口句柄,是個列表 driver.switch_to.window(handle) # 根據 handle 切換窗口…

5個實用的文章生成器,高效輸出優質文章

在自媒體時代,優質內容的持續輸出是吸引讀者、提升影響力的關鍵。然而,對于許多自媒體創作者來說,頻繁的創作難免會遭遇靈感枯竭、創作不出文章的困擾。此時,文章生成器便成為了得力的助手。文章生成器的優勢能夠快速自動生成高質…