STM32完整內存地址空間分配詳解

在STM32這類基于ARM Cortex-M的32位微控制器中,整個4GB的地址空間(從0x00000000到0xFFFFFFFF)有著非常系統化的分配方案,每個區域都有其特定的用途。下面我將詳細介紹這些地址區域的分配及其功能:

STM32完整內存地址空間分配詳解(0x00000000-0xFFFFFFFF)

代碼區域 (0x00000000-0x1FFFFFFF)

  • 0x00000000-0x07FFFFFF:

    • 別名區域: 根據BOOT引腳配置,這個區域映射到以下三者之一:
      • Flash存儲器(從0x08000000開始)
      • 系統存儲器(內置Bootloader)
      • SRAM(從0x20000000開始)
    • 主要用途: CPU復位后首先從0x00000000讀取初始棧指針和程序計數器,這個重映射機制允許靈活選擇啟動設備
  • 0x08000000-0x0FFFFFFF:

    • Flash存儲器區域: 內部Flash的實際物理地址
    • 用途: 存儲程序代碼、常量數據和向量表
    • 特點: 在大多數STM32中,只使用前幾MB的地址空間(根據具體型號,從64KB到2MB不等)
  • 0x10000000-0x1FFFFFFF:

    • 片上存儲器區域: 包含特殊功能內存
    • 包含:
      • CCM數據RAM(核心耦合內存): 0x10000000開始(在某些STM32F4/F7系列)
      • SRAM(某些STM32H7): 0x10000000-0x1001FFFF
      • TCM(緊耦合內存): 在STM32H7系列中的ITCM/DTCM
      • 系統存儲器: 0x1FFF0000-0x1FFFFFFF(廠商預編程的引導加載程序位置)
      • OTP和設備ID: 0x1FFF7800-0x1FFF7A0F(一次性可編程區域)

SRAM區域 (0x20000000-0x3FFFFFFF)

  • 0x20000000-0x3FFFFFFF:
    • 片上SRAM區域: 內部SRAM的主要區域
    • 布局:
      • 主SRAM(SRAM1): 從0x20000000開始
      • 附加SRAM區域(SRAM2/3等): 緊接SRAM1后排列
      • 備份SRAM: 某些STM32中包含電池供電的小型SRAM
    • 用途: 存儲全局變量、堆、棧和動態分配的數據

外設區域 (0x40000000-0x5FFFFFFF)

  • 0x40000000-0x4FFFFFFF:

    • APB1/APB2/AHB1/AHB2外設區域: 所有外設寄存器均映射在此區域
    • 劃分:
      • APB1外設(低速): 0x40000000-0x4000FFFF(USART2/3, SPI2/3, I2C1/2/3, 各種定時器等)
      • APB2外設(高速): 0x40010000-0x4001FFFF(USART1, SPI1, TIM1/8, ADC等)
      • AHB1外設: 0x40020000-0x4007FFFF(GPIO, DMA, RCC, Flash接口等)
      • AHB2外設: 0x40080000-0x400FFFFF(USB OTG, DCMI等)
  • 0x50000000-0x5FFFFFFF:

    • 擴展外設區域: 主要用于更高級的STM32型號中的額外外設
    • 包含: 高級外設和特殊功能單元(如加密單元)

外部設備區域 (0x60000000-0x9FFFFFFF)

  • 0x60000000-0x7FFFFFFF:

    • 外部存儲器(FMC/FSMC控制器的Bank 1和2)區域
    • 用途: 連接外部SRAM、NOR Flash和PSRAM
    • 特點: 通過靈活存儲器控制器(FMC/FSMC)進行管理
  • 0x80000000-0x8FFFFFFF:

    • 外部存儲器(FMC/FSMC控制器的Bank 3)區域
    • 用途: 主要用于連接外部NAND Flash
  • 0x90000000-0x9FFFFFFF:

    • 外部存儲器(FMC/FSMC控制器的Bank 4)區域
    • 用途: 在STM32F4/F7/H7系列中用于連接PC卡和CompactFlash設備

高級外設區域 (0xA0000000-0xDFFFFFFF)

  • 0xA0000000-0xBFFFFFFF:

    • 保留區域/特定于型號的擴展區域
    • 用途: 用于特定產品的專用外設或將來擴展使用
  • 0xC0000000-0xCFFFFFFF:

    • 靈活存儲器控制器(FMC)Bank 5和6區域
    • 用途: 在支持SDRAM的STM32中連接外部SDRAM
    • 特點: 主要在STM32F4/F7/H7系列中使用,支持DDR內存接口
  • 0xD0000000-0xDFFFFFFF:

    • 保留區域/設備擴展空間
    • 用途: 預留以支持更多FMC/FSMC存儲器映射或未來功能

系統區域 (0xE0000000-0xFFFFFFFF)

  • 0xE0000000-0xE00FFFFF:

    • 內核外設區域(PPB - Private Peripheral Bus)
    • 包含:
      • SysTick系統定時器: 0xE000E010-0xE000E01F
      • NVIC中斷控制器: 0xE000E100-0xE000E4EF
      • 系統控制塊(SCB): 0xE000ED00-0xE000ED8F
      • MPU內存保護單元: 0xE000ED90-0xE000EDBF
      • DBGMCU調試單元: 0xE000EDF0-0xE000EDFC
    • 特點: 這些是ARM Cortex-M核心的標準外設,所有STM32系列都類似
  • 0xE0100000-0xFFFFFFFF:

    • 供應商特定區域/保留區域
    • 包含:
      • 廠商專用的調試接口
      • 高級調試和跟蹤功能
      • 系統ROM表(0xE00FF000-0xE00FFFFF)
      • 大部分空間保留給未來的ARM架構擴展

特殊內存區域功能詳解

位帶區域 (Bit-banding) - ARM Cortex-M3/M4/M7核心特性

位帶映射允許對特定內存區域的單個位進行原子操作,避免了讀-修改-寫操作中可能的中斷問題。

  • SRAM位帶區域:

    • 原始區域: 0x20000000-0x200FFFFF (1MB)
    • 位帶別名區域: 0x22000000-0x23FFFFFF (32MB)
    • 映射關系: 別名區域中的每個地址對應原始區域中的一個位
  • 外設位帶區域:

    • 原始區域: 0x40000000-0x400FFFFF (1MB)
    • 位帶別名區域: 0x42000000-0x43FFFFFF (32MB)

AHB-APB橋接區域

STM32通過兩種類型的APB總線將低速外設連接到高速AHB系統總線:

  • APB1 (較低速):

    • 連接: 通過AHB-APB1橋接到系統總線
    • 時鐘: 通常為系統時鐘的1/2或1/4(例如84MHz/42MHz,在STM32F4系列)
    • 映射區域: 0x40000000開始
    • 典型外設: 基本通信接口(USART2/3, I2C, SPI2/3),基本定時器,看門狗
  • APB2 (較高速):

    • 連接: 通過AHB-APB2橋接到系統總線
    • 時鐘: 通常與系統時鐘相同或1/2(例如168MHz/84MHz,在STM32F4系列)
    • 映射區域: 0x40010000開始
    • 典型外設: 高速通信接口(USART1, SPI1),高級定時器,ADC

實際應用示例

1. 復位行為與啟動流程

當STM32上電或復位時:

  1. CPU從地址0x00000000獲取初始MSP(主堆棧指針)值
  2. 然后從地址0x00000004獲取復位處理程序地址
  3. 根據BOOT引腳設置,這些地址映射到:
    • Flash(0x08000000) - 正常應用啟動
    • 系統存儲器(~0x1FFF0000) - 引導加載程序啟動
    • SRAM(0x20000000) - 調試特殊用途啟動

2. 常用寄存器訪問示例

// RCC時鐘控制寄存器 - 位于AHB1外設區域
#define RCC_BASE    0x40023800
#define RCC_AHB1ENR (*(volatile uint32_t *)(RCC_BASE + 0x30))// 使用位操作啟用GPIOA時鐘
RCC_AHB1ENR |= (1 << 0);  // 設置位0,啟用GPIOA時鐘// 使用結構體方式訪問GPIO - 位于AHB1外設區域
typedef struct {volatile uint32_t MODER;    // 地址偏移: 0x00// ...其他寄存器...
} GPIO_TypeDef;#define GPIOA_BASE   0x40020000
#define GPIOA        ((GPIO_TypeDef *)GPIOA_BASE)// 配置GPIOA第0引腳為輸出
GPIOA->MODER &= ~(3 << 0);  // 清除之前配置
GPIOA->MODER |= (1 << 0);   // 設置為輸出模式

3. RAM區域的高級應用

// 將時間關鍵代碼放到CCM(核心耦合內存)執行以提高性能
// CCM內存位于0x10000000
__attribute__((section(".ccmram"))) void criticalFunction(void) {// 高性能處理代碼// 這段代碼運行在0等待狀態的內存中,比Flash快
}// 將重要數據放到備份SRAM以在低功耗模式下保留
// 備份SRAM通常位于0x40024000(STM32F4)
__attribute__((section(".backup_sram"))) uint32_t persistentCounter = 0;

4. 特殊功能區域訪問示例

// 訪問設備唯一ID(位于OTP區域)
#define DEVICE_ID_BASE 0x1FFF7A10  // 在STM32F4中的設備ID基址
uint32_t deviceID[3];  // 96位ID存儲在3個32位字中
deviceID[0] = *(volatile uint32_t *)(DEVICE_ID_BASE + 0);
deviceID[1] = *(volatile uint32_t *)(DEVICE_ID_BASE + 4);
deviceID[2] = *(volatile uint32_t *)(DEVICE_ID_BASE + 8);// 訪問核心外設 - 例如NVIC(嵌套向量中斷控制器)
#define NVIC_BASE   0xE000E100
#define NVIC_ISER0  (*(volatile uint32_t *)(NVIC_BASE + 0x00))// 啟用EXTI0中斷(IRQ編號為6)
NVIC_ISER0 = (1 << 6);

實際開發建議

  1. 性能優化:

    • 將頻繁訪問的數據和代碼放在不同的內存區域,利用總線矩陣的并行訪問能力
    • 將關鍵代碼放在CCM/TCM等0等待狀態內存中執行,繞過Flash等待狀態限制
  2. 內存管理:

    • 了解不同內存區域的大小限制和特性,合理規劃空間使用
    • 使用鏈接器腳本控制不同類型變量和函數在內存中的分配
  3. 外設訪問:

    • 使用廠商提供的外設庫函數或生成的HAL代碼訪問外設,減少直接操作寄存器的錯誤風險
    • 理解位帶機制并利用它進行安全的位操作
  4. 安全性:

    • 使用MPU(內存保護單元)保護關鍵區域,防止程序錯誤導致的內存破壞
    • 合理配置選項字節區域中的讀保護級別,保護知識產權

了解STM32的完整內存映射對于深入掌握這類微控制器的架構和優化系統性能至關重要。合理利用這些不同區域的特性,可以實現更高效、更可靠、更安全的嵌入式系統設計。
外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

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

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

相關文章

實現水平垂直居中的多種方法

在前端開發中&#xff0c;元素的居中是一個常見但又經常讓人頭疼的問題。本文將全面總結各種CSS居中方法&#xff0c;特別是如何實現一個div的水平垂直居中。 為什么居中這么重要&#xff1f; 居中布局是現代網頁設計中最基礎也最重要的布局方式之一。無論是導航菜單、登錄框…

如何實現服務的自動擴縮容(Auto Scaling)

在云計算和分布式系統的時代,系統的彈性和適應性已成為企業構建高效IT基礎設施的核心需求。自動擴縮容(Auto Scaling)作為一種關鍵技術,旨在根據實時負載變化動態調整計算資源,以確保系統性能穩定,同時優化資源利用效率。簡單來說,自動擴縮容是指系統能夠根據預設規則或…

uniapp+vue3+ts 使用canvas實現安卓端、ios端及微信小程序端二維碼生成及下載

加粗樣式uniapp多端生成帶二維碼海報并保存至相冊的實現 在微信小程序開發中&#xff0c;我們常常會遇到生成帶有二維碼的海報并保存到手機相冊的需求&#xff0c;比如分享活動海報、產品宣傳海報等。今天就來和大家分享一下如何通過代碼實現這一功能。 準備工作 在開始之前&am…

架構師面試(三十八):注冊中心架構模式

題目 在微服務系統中&#xff0c;當服務達到一定數量時&#xff0c;通常需要引入【注冊中心】組件&#xff0c;以方便服務發現。 大家有沒有思考過&#xff0c;注冊中心存在的最根本的原因是什么呢&#xff1f;注冊中心在企業中的最佳實踐是怎樣的&#xff1f;注冊中心的服務…

Day.js和Moment.js對比,日期時間庫怎么選?

在JavaScript的日期處理庫中&#xff0c;Moment.js 和 Day.js 是兩個非常流行的選擇。本文將基于從npmtrends的數據&#xff0c;對這兩個庫進行詳細的對比分析。 Moment.js的重度使用者。凡是遇到時間和日期的操作&#xff0c;就把Moment.js引用上。 直到有天我發現加載的mome…

羅默如何用木星衛星“宇宙鐘表”測量光速?

一、17世紀的“宇宙級實驗” 1676年&#xff0c;丹麥天文學家奧勒羅默&#xff08;Ole Rmer&#xff09;在巴黎天文臺做出驚人發現&#xff1a; 木星衛星的“遲到早退”現象&#xff0c;竟能揭示光速的秘密&#xff01; 通過觀察木衛一&#xff08;Io&#xff09;的軌道周期變…

deepseek 技巧整理

1、導出word 和excel 功能&#xff0c;在使用以下提示詞。 請幫我列出減肥期間可以吃的水果&#xff0c;并分析該水果含有的營養元素&#xff0c;以表格的形式星現。1.要以html的方式輸出 2.要可以直接運行 3.頁面要提供可以直接下載word和excel功能

思考軟件框架

數據庫是達夢數據庫 假定里面有40張表&#xff0c;軟件的業務邏輯比較復雜。 當然&#xff0c;依然是對數據庫中數據的增&#xff0c;刪&#xff0c;改&#xff0c;查&#xff0c;組合&#xff0c;顯示。 但是也涉及到多種軟件&#xff0c;多臺設備之間的通信。 我們可以使用…

探索 Disruptor:高性能并發框架的奧秘

在當今的軟件開發領域&#xff0c;處理高并發場景是一項極具挑戰性的任務。傳統的并發解決方案&#xff0c;如基于鎖的隊列&#xff0c;往往在高負載下表現出性能瓶頸。而 Disruptor 作為一個高性能的并發框架&#xff0c;憑借其獨特的設計和先進的技術&#xff0c;在處理海量數…

前端面經-VUE3篇--vue3基礎知識(一)插值表達式、ref、reactive

一、計算屬性(computed) 計算屬性&#xff08;Computed Properties&#xff09;是 Vue 中一種特殊的響應式數據&#xff0c;它能基于已有的響應式數據動態計算出新的數據。 計算屬性有以下特性&#xff1a; 自動緩存&#xff1a;只有當它依賴的響應式數據發生變化時&#xff…

數據結構6 · BinaryTree二叉樹模板

代碼函數功能順序如下&#xff1a; 1&#xff1a;destroy&#xff1a;遞歸刪除樹 2&#xff1a;copy&#xff1a;復制二叉樹 3&#xff1a;preOrder&#xff1a;遞歸前序遍歷 4&#xff1a;inOrder&#xff1a;遞歸中序遍歷 5&#xff1a;postOrder&#xff1a;遞歸后續遍…

C++/SDL進階游戲開發 —— 雙人塔防游戲(代號:村莊保衛戰 13)

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄 十…

強化學習之基于無模型的算法之時序差分法

2、時序差分法(TD) 核心思想 TD 方法通過 引導值估計來學習最優策略。它利用當前的估計值和下一個時間步的信息來更新價值函數&#xff0c; 這種方法被稱為“引導”&#xff08;bootstrapping&#xff09;。而不需要像蒙特卡羅方法那樣等待一個完整的 episode 結束才進行更新&…

AE/PR模板 100個現代文字標題動態排版效果動畫 Motion Titles

Motion Titles是一個令人驚艷的AE/PR模板&#xff0c;提供了100個現代文字標題的動態排版效果動畫。這些動畫效果能夠為你的項目增添視覺沖擊力和專業感&#xff0c;為文字標題注入活力和動感。該模板適用于Adobe After Effects CC或更高版本以及Adobe Premiere Pro 2020或更高…

【AI提示詞】二八法則專家

提示說明 精通二八法則&#xff08;帕累托法則&#xff09;的廣泛應用&#xff0c;擅長將其應用于商業、管理、個人發展等領域&#xff0c;深入理解其在不同場景中的具體表現和實際意義。 提示詞 # Role: 二八法則專家## Profile - language: 中文 - description: 精通二八法…

前端八股 CSS 1

盒子模型 進行布局時將所有元素表示為一個個盒子box padding margin border content content&#xff1a;盒子內容 待顯示的文本和圖像 padding&#xff1a;內邊距&#xff0c;內容和border之間的空間&#xff0c;不能為負數&#xff0c;受bkc影響 border:邊框&#xff0c…

組件通信-$attrs

概述&#xff1a;$attrs用于實現當前組件的父組件&#xff0c;向當前組件的子組件通信&#xff08;爺→孫&#xff09;。 具體說明&#xff1a;$attrs是一個對象&#xff0c;包含所有父組件傳入的標簽屬性。 注意&#xff1a;$attrs會自動排除props中聲明的屬性(可以認為聲明過…

jdk開啟https詳細步驟

要在 JDK 中啟用 HTTPS&#xff0c;您可以按照以下詳細步驟進行操作&#xff1a; 生成密鑰庫和證書&#xff1a; 首先&#xff0c;您需要生成一個密鑰庫&#xff08;keystore&#xff09;和證書&#xff0c;可以使用 keytool 工具來生成。以下是使用 keytool 生成密鑰庫和證書的…

文章四《深度學習核心概念與框架入門》

文章4&#xff1a;深度學習核心概念與框架入門——從大腦神經元到手寫數字識別的奇幻之旅 引言&#xff1a;給大腦裝個"GPU加速器"&#xff1f; 想象一下&#xff0c;你的大腦如果能像智能手機的GPU一樣快速處理信息會怎樣&#xff1f;這正是深度學習的終極目標&…

關于CSDN創作的常用模板內容

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 好文評論新文推送 &#x1f4c3;文章前言 &…