一文搞明白STM32晶元存儲結構

来源:https://www.cnblogs.com/Sharemaker/archive/2023/08/09/17616460.html
-Advertisement-
Play Games

一、前言 本篇介紹STM32晶元的存儲結構,ARM公司負責提供設計內核,而其他外設則為晶元商設計並使用,ARM收取其專利費用而不參與其他經濟活動,半導體晶元廠商拿到內核授權後,根據產品需求,添加各類組件,生產晶元售賣。圖1為STM32的組成示意圖,其中Cortex-M3內核、調試系統都是ARM公司設 ...


一、前言

        本篇介紹STM32晶元的存儲結構,ARM公司負責提供設計內核,而其他外設則為晶元商設計並使用,ARM收取其專利費用而不參與其他經濟活動,半導體晶元廠商拿到內核授權後,根據產品需求,添加各類組件,生產晶元售賣。圖1為STM32的組成示意圖,其中Cortex-M3內核、調試系統都是ARM公司設計,內部匯流排、外設、存儲、時鐘複位等都由ST公司開發。可以明顯看出匯流排是cpu、記憶體、外設傳遞信息的公用通道,晶元上的各個部件通過匯流排相連接。

圖1 STM32晶元簡要結構圖

        內核通過匯流排訪問各個外設,現在通往外設的“路”已經鋪好,還需要規定各個外設的“門牌號”,以便精準控制每個外設。ARM Cortex-M3系列的處理器,採用存儲器與I/O設備(外設)統一編址的方式,將部分存儲器地址範圍用於外設,這種通過存儲器地址訪問外設的方式,稱為存儲器地址映射。


二、內核存儲結構

圖2 存儲結構框架

        以Cortex‐M3內核為例,對於32位的處理器,可定址的範圍為2^32位元組,即2^32= 4 × 1024 × 1024 × 1024 = 4GB,也就是0x00000000至0xFFFFFFFF。ARM將這4G空間從低地址到高地址依次劃分為代碼區(Code)、片上SRAM區(SRAM)、片上外設(Peripheral)、片外RAM(External RAM)、片外外設(External Device)和系統級(System level),程式存儲器、數據存儲器、寄存器和 I/O 埠排列在同一個順序的 4 GB 地址空間內。各位元組按小端格式在存儲器中編碼。字中編號最低的位元組被視為該字的最低有效位元組,而編號最高的位元組被視為最高有效位元組。

圖3 Cortex‐M3存儲結構

        從圖3中可見,不像其它的 ARM 架構,它們的存儲器映射由半導體廠家說了算,Cortex‐M3 預先定義好了“粗線條的”存儲器映射。通過把片上外設的寄存器映射到外設區,就可以簡單地以訪問記憶體的方式來訪問這些外設的寄存器,從而控制外設的工作。結果,片上外設可以使用C語言來操作。這種預定義的映射關係,也使得對訪問速度可以做高度的優化,而且對於片上系統的設計而言 更易集成(還有一個重要的,不用每學一種不同的單片機就要熟悉一種新的存儲器映射)。

        Cortex‐M3的內部擁有一個匯流排基礎設施,專用於優化對這種存儲器結構的使用。在此之上, Cortex‐M3甚至還允許這些區域之間“越權使用”。比如說,數據存儲器也可以被放到代碼區,而且代碼也能夠在外部 RAM 區中執行。

        處於最高地址的系統級存儲區,是Cortex‐M3用於藏“私房錢”的——包括中斷控制器、MPU 以及各種調試組件。所有這些設備均使用固定的地址。通過把基礎設施的地址定死,就至少在內核水平上,為應用程式的移植掃清了障礙。因此使用該內核的設計者必須按照這個進行各自晶元的存儲器結構設計。這一點極大地方便了軟體在各種Cortex‐M3 單片機間的移植。舉個簡單的例子,各款 Cortex‐M3單片機的NVIC 和 MPU 都在相同的位置布設寄存器,使得它們變得通用。儘管如此,Cortex‐M3定出的條條框框是粗線條的,它依然允許晶元製造商靈活地分配存儲器空間,以製造出各具特色的單片機產品。

        存儲空間的一些位置用於調試組件等私有外設,這個地址段被稱為“私有外設區”。私有外設區的組件包括:快閃記憶體地址重載及斷點單元(FPB)、數據觀察點單元(DWT)、指令跟蹤巨集單元(ITM)、嵌入式跟蹤巨集單元(ETM)、跟蹤埠介面單元(TPIU) 、ROM 表。

        Cortex‐M3的地址空間是 4GB, 程式可以在代碼區,內部 SRAM 區以及外部 RAM 區中執行。但是因為指令匯流排與數據匯流排是分開的,最理想的是把程式放到代碼區,從而使取指和數據訪問各自使用自己的匯流排,並行不悖。

        讓我們先看一看這 4GB 的劃分:

圖4 Cortex‐M3預定義的存儲映射

        內部 SRAM 區的大小是 512MB,用於讓晶元製造商連接片上的 SRAM,這個區通過系統匯流排來訪問。在這個區的下部,有一個 1MB 的位帶區,位帶區就是可以按bit去訪問存儲的位元組地址的內容。該位帶區還有一個對應的32MB 的“位帶別名(alias)區”,容納了 8M 個“位變數”(對比 8051 的只有 128 個位)。位帶區對應的是最低的 1MB 地址範圍,而位帶別名區裡面的每個字對應位帶區的一個比特。位帶操作只適用於數據訪問,不適用於取指。通過位帶的功能,可以把多個布爾型數據打包在單一的字中,卻依然可以從位帶別名區中,像訪問普通記憶體一樣地使用它們,位帶別名區中的訪問操作是原子的。

        地址空間的另一個 512MB 範圍由片上外設(的寄存器)使用。這個區中也有一條32MB的位帶別名,以便於快捷地訪問外設寄存器。例如,可以方便地訪問各種控制位和狀態位。

        要註意的是,外設內不允許執行指令。還有兩個 1GB的範圍,分別用於連接外部 RAM 和外部設備,它們之中沒有位帶。兩者的區別在於外部 RAM 區允許執行指令,而外部設備區則不允許。

        最後還剩下 0.5GB 的私有空間,Cortex‐M3內核的專有外設就在這裡面,包括了系統級組件,內部私有外設匯流排,外部私有外設匯流排,以及由內核提供者定義的系統外設。


三、晶元存儲映射

        ARM公司只是大概的規定了存儲器空間的映射,允許各晶元廠商在指定範圍內自行定義和使用這些存儲空間,未分配的空間為保留的地址空間。

        STM32的存儲器結構和Cortex-M3的很相似,不同的是,STM32加入了很多實際的東西,如:Flash、SRAM,片上外設等。只有加入了這些東西,才能成為一個擁有實際意義的、可以工作的處理晶元。可定址的存儲空間分為 8 個主要塊,每個塊為 512 MB。未分配給片上存儲器和外設的所有存儲區域均視為“保留區”。

        我們對比一下Cortex-M3存儲器結構和STM32存儲器結構:

圖5 Cortex‐M3和STM32存儲結構對比

        STM32在ARM規定的基礎上,將4G空間分為了Block0、Block1、Block2、……、Block7,共8塊,每塊大小為512MB。

 圖6 STM32的存儲映射

        0x0000 0000 ~ 0x1FFF FFFF(512MB):作為代碼區,存預設的向量表,用於存放下載的代碼。系統上電後,將從該部分讀取代碼;

        0x2000 0000 ~ 0x3FFF FFFF(512MB):作為SRAM區,用於存放運行代碼。系統上電後,將從Flash讀取代碼,放到SRAM里,CPU再從SRAM讀取代碼運行;

  0x4000 0000 ~ 0x5FFF FFFF(512MB):作為片上外設區,用於存放廠商外設寄存器。如USART,I2C等,要操作外設,即修改這裡對應的外設寄存器;

0x6000 0000 ~ 0x9FFF FFFF(1GB):作為片外RAM,用於擴展RAM。當SRAM或者Flash不夠用時,MCU通過FSMC外接其它IC晶元,則在這個地址範圍讀寫IC晶元數據;

        0xA000 0000 ~ 0xDFFF FFFF(1GB):作為片外外設區,用於讀寫擴展IC晶元的寄存器。ST只用了這裡的一半空間,另外一空間未使用;

        0xE000 0000 ~ 0xFFFF FFFF(512MB):作為內核外設區,用於存放Cortex-M3內核的內部外設。CortexM3內核的內部外設有NVIC、Systick等;

        SRAM的理解比較簡單,其作用是用來存取各種動態的輸入輸出數據、中間計算結果以及與外部存儲器交換的數據和暫存數據。設備斷電後,SRAM中存儲的數據就會丟失。不同類型的STM32單片機的SRAM大小是不一樣的,但是它們的起始地址都是0x2000 0000,終止地址都是0x2000 0000+其固定的容量大小。

        我們的程式和常量是存儲在Flash中的,調試模式下也可以看出PC指針始終指向0x0800 0000後面的Flash區域。


四、總結

        本篇對STM32晶元內部的存儲結構框架進行了整體的概述,主要是要對STM32晶元大致的存儲結構有一個初步的瞭解,重點是明確片上的FLASH和RAM地址,有助於理解實際代碼存儲和運行的空間位置。而諸如STM32的片上外設各個寄存器地址,可以詳細的去參考具體的晶元手冊獲取各個外設具體的寄存器相關內容。


↓↓↓更多技術內容和書籍資料獲取,入群技術交流敬請關註“明解嵌入式”↓↓↓ 

 

本文來自博客園,作者:Sharemaker,轉載請註明原文鏈接:https://www.cnblogs.com/Sharemaker/p/17616460.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 一:背景 ### 1. 講故事 前段時間有位朋友找到我,說他的程式記憶體會出現暴漲,讓我看下是怎麼事情?而且還告訴我是在 Linux 環境下,說實話在Linux上分析.NET程式難度會很大,難度大的原因在於Linux上的各種開源工具主要是針對 C/C++, 和 .NET 一毛錢關係都沒有,說到底 ...
  • 本篇文章將帶你認識C#的新語法、創建項目、發佈運行、讀取的相關操作、MVC開發、擴展、各種容易的使用,許可權等.NET的相關知識。帶你從零到精通,全面掌握.NET5的開發技能。 ...
  • 最近的項目要求讀取xls文件內的單元格,並且單元格旁邊會有覆選框標識類型。 搜了下只有java的POI有例子,NOPI看項目文檔好像是沒有實現讀取控制項的功能。 java實現 POI POI如何解析出excel 中覆選框是否被選中 https://blog.csdn.net/qq_29832217/a ...
  • [TOC] 久坐提醒桌面小程式: 乾這行職業病比較多,之前用愛麗(即:玻璃酸鈉滴眼液),用的時候挺舒服,緩解吧,不過治標不治本。 註意休息,加強鍛煉非常有必要,每工作1小時,休息10分鐘(程式中有鎖鍵盤滑鼠的功能,那個太狠了,萬一領導要東西電腦鎖住了尷尬了,被我註釋了),看看遠方,綠值,站個樁,或者 ...
  • ## 前言: 阿裡雲簡訊服務是一項基於雲計算和大數據技術的企業級簡訊平臺服務。它能夠為企業和開發者提供高可用、高性能、高穩定性的簡訊發送服務,可以快速地將各類業務通知、驗證碼、營銷推廣等信息發送給用戶。在我們經常登錄一些系統或者APP時候,經常會遇到其他登錄登錄方式——簡訊驗證碼登錄。這也是我前一段 ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • 近日,恩智浦官方隆重上線了應用程式代碼中心(Application Code Hub,簡稱 ACH),這是恩智浦 MCUXpresso 軟體生態的一個重要組成部分。痞子衡之所以要如此激動地告訴大家這個好消息,是因為 ACH 並不是又一個恩智浦官方 github project site 那麼簡單而已 ...
  • ifconfig /all 獲取功能變數名稱、IP地址、DHCP伺服器、網關、MAC地址、主機名net time /domain 查看功能變數名稱、時間net view /domain 查看域內所有共用net view ip 查看對方區域網內開啟了哪些共用net config workstation 查看功能變數名稱、機器 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...