深入理解STM32之儲存器和總線架構1(基於STM32F411)

本文轉載自http://blog.csdn.net/charmingsun/article/details/52258419

官方文檔: 

STM32F411 參考手冊 
STM32F411 數據手冊 
Cortex™-M4F 編程手冊 
STM32 微控制器系統存儲器自舉模式應用筆記 
STM32™ 自舉程序中使用的 USART 協議 
ARM Cortex™-M Programming Guide to Memory Barrier Instructions

一、系統架構

主系統由 32 位多層 AHB 總線矩陣構成,可實現以下部分的互連:

有關AHB總線和APB總線的更多信息請參考博文:淺析AMBA規範以及AMBA 5 AHB接口和AMBA 3 APB接口

1、六條主控總線: 
● Cortex™-M4F 內核 I 總線、D 總線和 S 總線; 
● DMA1 存儲器總線; 
● DMA2 存儲器總線; 
● DMA2 外設總線。

2、五條被控總線: 
● 內部 Flash ICode 總線; 
● 內部 Flash DCode 總線; 
● 主要內部 SRAM; 
● AHB1 外設(包括 AHB-APB 總線橋和 APB 外設); 
● AHB2 外設。

藉助總線矩陣,可以實現主控總線到被控總線的訪問,這樣即使在多個高速外設同時運行期間,系統也可以實現併發訪問和高效運行。此架構如 Figure 1 所示。 
Figure 1. System architecture


S0:I 總線 
此總線用於將 Cortex™-M4F 內核的指令總線連接到總線矩陣。內核通過此總線獲取指令。此總線訪問的對象是包含代碼的存儲器(內部 Flash/SRAM)。


S1:D 總線 
此總線用於將 Cortex™-M4F 數據總線連接到總線矩陣。內核通過此總線進行立即數加載和調試訪問。此總線訪問的對象是包含代碼或數據的存儲器(內部 Flash/SRAM)。


S2:S 總線 
此總線用於將 Cortex™-M4F 內核的系統總線連接到總線矩陣。此總線用於訪問位於外設 或 SRAM 中的數據。也可通過此總線獲取指令(效率低於 I 總線)。此總線訪問的對象是內部 SRAM、包括 APB 外設在內的 AHB1 外設、AHB2 外設。


S3、S4:DMA 存儲器總線 
此總線用於將 DMA 存儲器總線主接口連接到總線矩陣。DMA 通過此總線來執行存儲器數據的傳入和傳出。此總線訪問的對象是數據存儲器:內部 Flash、內部 SRAM 以及 S4 可以額外訪問包括 APB 外設在內的 AHB1/AHB2 外設。


S5:DMA 外設總線 
此總線用於將 DMA 外設主總線接口連接到總線矩陣。DMA 通過此總線訪問 AHB 外設或執 行存儲器間的數據傳輸。此總線訪問的對象是 AHB 和 APB 外設以及數據存儲器:Flash 儲存器和內部 SRAM。


總線矩陣 
總線矩陣用於主控總線之間的訪問仲裁管理。仲裁採用循環調度算法。


AHB/APB 總線橋 (APB) 
藉助兩個 AHB/APB 總線橋 APB1 和 APB2,可在 AHB 總線與兩個 APB 總線之間實現完全 同步的連接,從而靈活選擇外設頻率。

有關 APB1 和 APB2 最大頻率的詳細信息,請參見器件數據手冊;有關 AHB 和 APB 外設地 址映射的信息,請參見STM32F411參考手冊中的 Table 1。

每次芯片復位後,所有外設時鐘都被關閉(SRAM 和 Flash 接口除外)。使用外設前,必須在 RCC_AHBxENR 或 RCC_APBxENR 寄存器中使能其時鐘。其中RCC寄存器不屬於外設,復位後RCC寄存器直接由HSI提供時鐘信號。但其RCC寄存器仍然掛接在AHB1總線上,具體請看下文中 STM32F411xC/xE 方框圖中的“Reset & clock control”。

注意:對 APB 寄存器執行 16 位或 8 位訪問時,該訪問將轉換爲 32 位訪問:總線橋將 16 位或 8 位數據複製後提供給 32 位向量。


STM32F411xC/xE 方框圖 
左邊部分: 
Figure 3. STM32F411xC/xE block diagram (left)

右邊部分: 
Figure 3. STM32F411xC/xE block diagram (right)

掛接在 AHB1 總線上的外設有:GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOH、CRC、RCC、Flash 接口寄存器、DMA1、DMA2;

掛接在 AHB1 總線上的外設有:USB OTG FS;

掛接在 APB1 總線上的外設有:TIM2、TIM3、TIM4、TIM5、RTC 和 BKP 寄存器、WWDG、IWDG、I2S2ext、SPI2 / I2S2、SPI3 / I2S3、I2S3ext、USART2、I2C1、I2C2、I2C3、PWR;

掛接在 APB2 總線上的外設有:USART1、USART6、ADC1、SDIO、SPI1/I2S1、SPI4/I2S4、SYSCFG、EXTI、TIM9、TIM10、TIM11、SPI5/I2S5。

有關 STM32F411xC/E 器件中可用外設的邊界地址請參考STM32F411數據手冊中的“Table 1. STM32F411xC/E register boundary addresses”。

二、存儲器組織結構

綜合存儲器映射圖:

左邊部分: 
Figure 14. Memory map (left)

程序存儲器、數據存儲器、寄存器和 I/O 端口排列在同一個順序的 4 GB 地址空間內。

各字節按小端格式在存儲器中編碼。字中編號最低的字節被視爲該字的最低有效字節,而編號最高的字節被視爲最高有效字節。

有關外設寄存器映射的詳細信息,請參見STM32F411參考手冊中的相關章節。

可尋址的存儲空間分爲 8 個主要塊,每個塊爲 512 MB。

未分配給片上存儲器和外設的所有存儲區域均視爲“保留區”。請參見STM32F411數據手冊中的存儲器映射圖。

從0x0000 0000到0x03FF FFFF這段地址空間稱爲自舉存儲空間,Cortex™-M4F CPU 通過 ICode 總線從地址 0x0000 0000 獲取棧頂值,然後從始於0x0000 0004 的存儲器開始執行代碼。自舉存儲空間使用別名,也就是說在單片機上電之前是沒有存儲器映射到這段自舉存儲空間內的。單片機上電之後通過硬件檢測相應的 BOOT 引腳來確定將自舉存儲空間映射到主 Flash、系統存儲器還是嵌入式 SRAM。具體的物理重映射方式參見下文。

自舉配置 (Boot configuration):

存儲器採用固定的存儲器映射,代碼區域起始地址爲 0x0000 0000(通過 ICode/DCode 總 線訪問),而數據區域起始地址爲 0x2000 0000(通過系統總線訪問)。Cortex™-M4F CPU 始終通過 ICode 總線獲取復位向量,這意味着只有代碼區域(通常爲 Flash)可以提供自舉空間。STM32F4xx 微控制器實施一種特殊機制,可以從其它存儲器(如內部 SRAM) 進行自舉。

在 STM32F4xx 中,可通過 BOOT[1:0] 引腳選擇三種不同的自舉模式,下表所示。 
自舉模式

復位後,在系統時鐘 (SYSCLK)的第四個上升沿鎖存 BOOT 引腳的值。復位後,用戶可以通過設置 BOOT1 和 BOOT0 引腳來選擇需要的自舉模式。

BOOT0 爲專用引腳,而 BOOT1 則與 GPIO 引腳共用。一旦完成對 BOOT1 的採樣,相應 GPIO 引腳即進入空閒狀態,可用於其它用途。

器件退出待機模式時,還會對 BOOT 引腳重新採樣。因此,當器件處於待機模式時,這些引腳必須保持所需的自舉模式配置。這樣的啓動延遲結束後,CPU 將從地址 0x0000 0000 獲取棧頂值,然後從始於0x0000 0004 的自舉存儲器開始執行代碼。

注意:如果器件從 SRAM 自舉,在應用程序初始化代碼中,需要使用 NVIC 異常及中斷向量表和偏移寄存器來重新分配 SRAM 中的向量表。

嵌入式自舉程序 (Embedded bootloader)

嵌入式自舉程序模式用於通過以下串行接口重新編程 Flash: 
● USART1 (PA9/PA10) 
● USART2 (PD5/PD6) 
● I2C1 (PB6/PB7) 
● I2C2 (PB10/PB3) 
● I2C3 (PA8/PB4) 
● SPI1 (PA4/PA5/PA6/PA7) 
● SPI2 (PB12/PB13/PB14/PB15) 
● SPI3 (PA15/PC10/PC11/PC12) 
● USB OTG FS (PA11/12) 從設備模式 (DFU: device firmware upgrade).

USART 外設以內部 16 MHz 振盪器 (HSI) 頻率運行,而 USB OTG FS 則需要相當 
於 1 MHz 數倍(4 MHz 到 26 MHz 之間)的外部時鐘 (HSE) 頻率。

嵌入式自舉程序代碼位於系統存儲器 (system memory,位於Flash)中,在芯片生產期間由 ST 編程。有關詳細信息,請參見應用筆記 AN2606。

物理重映射 (Physical remap)

選擇自舉引腳後,應用程序軟件可以將某些存儲器設定爲從代碼空間進行訪問(這樣,可通過 
ICode 總線而非系統總線執行代碼)。這樣的修改通過在 SYSCFG 控制器中編程來實現,該寄存器的說明在STM32F411參考手冊的第 7.2.1 節:SYSCFG 存儲器重映射寄存器 (SYSCFG_MEMRMP) 。

SYSCFG memory remap register

此寄存器用於對存儲器重映射進行配置: 
● 使用兩個位來配置可在地址 0x0000 0000 訪問的存儲器區域。從而通過軟件選擇物理重映射,而旁路 BOOT 引腳。 
● 這兩個位的復位值和復位時 BOOT 引腳的設置相同。當 BOOT 引腳設爲 10 [(BOOT1,BOOT0) 
= (1,0)] 從主 Flash 中自舉時,寄存器值爲 0x00。

在重映射模式下,CPU 可以通過 ICode 總線 (而不是 System 總線)訪問外部存儲器來提高性能。

偏移地址:0x00 
復位值:0x0000 00XX(X 和 BOOT 引腳的設置相同)

因此可重映射以下存儲器: 
● 主 Flash 
● 系統存儲器 
● 嵌入式 SRAM1 (128 KB)

下面這張表格說明了當把自舉存儲空間映射到不同存儲器上時每段地址對應着何種存儲器,小括號內的數字標明瞭可以使用的地址空間的大小(也就是對應存儲器的大小)。 
Table 3. 存儲器映射與自舉模式/物理重映射
*注:1. 即使在自舉存儲空間中使用別名,相關存儲器仍可通過其原始存儲空間進行訪問。

Flash 概述 (Flash memory overview)

Flash 接口可管理 CPU 通過 AHB I-Code 和 D-Code 對 Flash 進行的訪問。該接口可針對 Flash 執行擦除和編程操作,並實施讀寫保護機制。Flash 接口通過指令預取和緩存機制加速代碼執行。

下圖所示爲系統架構內的 Flash 接口連接: 
系統架構內的 Flash 接口連接

嵌入式 Flash 接口的主要特性: 
● Flash 讀操作 
● Flash 編程/擦除操作 
● 讀/寫保護 
● I-Code 上的預取操作 
● I-Code 上的 64 個緩存(128 位寬) 
● D-Code 上的 8 個緩存(128 位寬)

嵌入式 Flash 具有以下主要特性: 
● 對於 STM32F411xC/E,容量高達 512 KB 
● 128 位寬數據讀取 
● 字節、半字、字和雙字數據寫入 
● 扇區擦除與全部擦除 
● 存儲器組織結構 
Flash 結構如下: 
— 主存儲器塊,分爲 4 個 16 KB 扇區、1 個 64 KB 扇區和 3 個 128 KB 扇區 
— 系統存儲器,器件在系統存儲器自舉模式下從該存儲器啓動 
— 512 字節 OTP(一次性可編程),用於存儲用戶數據。OTP 區域還有 16 個額外字節,用於鎖定對應的 OTP 數據塊。 
— 選項字節,用於配置讀寫保護、BOR 級別、軟件/硬件看門狗以及器件處於待機或 
停止模式下的復位。 
● 低功耗模式(有關詳細信息,請參見參考手冊的“電源控制 (PWR)”部分)

下面這張表格說明了 Flash 模塊構成 (STM32F411xC/E): 
Flash 模塊構成 (STM32F411xC/E)

嵌入式 SRAM (Embedded SRAM)

STM32F411xC/E 帶有 128 KB 系統 SRAM。

系統 SRAM 可按字節、半字(16 位)或全字(32 位)訪問。讀寫操作以 CPU 速度執行,且等待週期爲 0。

如果選擇從 SRAM 自舉或選擇物理重映射(SYSCFG 控制器中的 SYSCFG 存儲器重映射寄存器 (SYSCFG_MEMRMP)),則 CPU 可通過系統總線或 I-Code/D-Code 總線訪問系統 SRAM。要在 SRAM 執行期間獲得最佳的性能,應選擇物理重映射(通過自舉管腳及軟件配置來選擇)。

位段 (Bit banding)

Cortex™-M4F 存儲器映射包括兩個位段區域。這些區域將存儲器別名區域中的每個字映射到存儲器位段區域中的相應位。在別名區域寫入字時,相當於對位段區域的目標位執行讀-修改-寫操作。

在 STM32F4xx 器件中,外設寄存器和 SRAM 均映射到一個位段區域,這樣可實現單個位段的讀寫操作。這些操作僅適用於 Cortex™-M4F 訪問,對於其它總線主接口(如 DMA)無效。

兩個位段區域分別位於 SRAM 和外設寄存器區域中地址最低的 1 MB,並且分別被映射到兩個 32 MB 的位段別名區域: 
● 訪問映射到 1 MB SRAM 位段區域的 32 MB SRAM 別名區域:

地址範圍 存儲器區域 指令和數據存取
0x20000000-0x200FFFFF SRAM 位段區域 可以像訪問 SRAM 存儲器那樣直接訪問此存儲器區域,但是此區域也可以使用位段別名按位尋址。
0x22000000-0x23FFFFFF SRAM 位段別名區域 本區域的數據存取將被映射到位段區域。寫操作相當於讀-改-寫操作。指令存取不會被重映射。

● 訪問映射到 1 MB 外設位段區域的 32 MB 外設別名區域:

地址範圍 存儲器區域 指令和數據存取
0x40000000-0x400FFFFF 外設位段區域 可以像訪問外設寄存器那樣直接訪問此存儲器區域,但是此區域也可以使用位段別名按位尋址
0x42000000-0x43FFFFFF 外設位段別名區域 本區域的數據存取將被映射到位段區域。寫操作相當於讀-改-寫操作。不允許存取指令。

注意:位段傳輸的大小與指令規定的傳輸大小相匹配,可以爲字節、半字或字。這兩個別名區域位於存儲器映射圖中的保留區域,所以說只有位段區域映射到別名區域,而沒有存儲器映射到別名區域。

可以直接操作別名區域。在別名區域寫一個字將更新位段區域的一個位。被寫進別名區域的字的第 0 位的值決定了被寫進位段區域的目標位的值。寫進一個第 0 位爲 1 的值將使位段區域對應位置 1,寫進一個第 0 位爲 0 的值將使位段區域對應位置 0。在別名區域寫進的數值中的第 1 位到第 31 位對位段區域位的值沒有影響。在別名區域寫入 0x01 和寫入 0xFF 的效果相同,在別名區域寫入 0x00 和寫入 0x0E 的效果相同。

在別名區域讀取一個字: 
● 0x00000000 表示位段區域的對應位的值爲 0 
● 0x00000001 表示位段區域的對應位的值爲 1

可通過一個映射公式說明別名區域中的每個字與位段區域中各個位之間的對應關係。映射公式爲: 
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)

其中: 
— bit_word_addr 代表別名區域中將映射到目標位的字的地址 
— bit_band_base 代表別名區域的起始地址 
— byte_offset 代表目標位所在位段區域中的字節編號 
— bit_number 代表目標位的位位置 (0-7)

示例 
下例說明如何將 SRAM 地址 0x20000300 處字節的位 2 映射到別名區域: 
0x22006008 = 0x22000000 + (0x300*32) + (2*4)

對地址 0x22006008 執行寫操作相當於在 SRAM 地址 0x20000300 處字節的位 2 執行讀-修 改-寫操作。

對地址 0x22006008 執行讀操作將返回 SRAM 地址 0x20000300 處字節的位 2 的值(0x01 表示位置位,0x00 表示位復位)。

有關位段的詳細信息,請參見 Cortex™-M4F 編程手冊 (Cortex®-M4 programming manual)。


右邊部分: 
Figure 14. Memory map (right)

掛接在 APB1、 APB2、 AHB1、 AHB2 總線上的寄存器和 I/O 端口位於 block 2。位於block 7的Cortex-M4 內部外設有:NVIC (Nested Vectored Interrupt Controller)、SCB (System Control Block)、SysTick (System timer)、MPU (Memory Protection Unit)、FPU (Floating-point Unit)。

發佈了10 篇原創文章 · 獲贊 214 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章