1、總線
系統結構
系統包括一個由多個互相連接配接的32位AHB總線組成的矩陣
- 8個主總線
– Cortex-M4 with FPU core I-bus, D-bus and S-bus
– DMA1 memory bus
– DMA2 memory bus
– DMA2 peripheral bus
– Ethernet DMA bus
– USB OTG HS DMA bus
- 7個從總線:
– Internal Flash memory ICode bus
– Internal Flash memory DCode bus
– Main internal SRAM1 (112 KB)
– Auxiliary internal SRAM2 (16 KB)
– AHB1 peripherals including AHB to APB bridges and APB peripherals
– AHB2 peripherals
– FSMC
總線矩陣也能夠提供主到從的通路,進而使能并發通路,甚至在多個高速外設同時工作的時候也能夠高效工作. 64Kbyte的CCM(core coupled memory)資料RAM不是總線矩陣的一部分,隻能通過CPU來通路.
總線類型
- I-bus
該總線連接配接帶有FPU的Cortex-M4核心的指令總線到BusMatrix. 該總線被核心用于取指令操作. 該總線的控制目标是一塊包括代碼的記憶體 (internal Flash memory/SRAM or external memories through the FSMC/FMC).
- D-bus
該總線連接配接帶有FPU的Cortex-M4核心的資料總線到64Kbyte的CCM資料RAM再到BusMatrix. 該總線被核心用于下載下傳代碼與調試. 該總線的控制目标是一塊包括代碼或者資料的記憶體 (internal Flash memory or external memories through the FSMC/FMC).
- S-bus
該總線連接配接帶有FPU的Cortex-M4核心的系統總線到BusMatrix. 該總線被用來通路加載到SRAM或者外設的資料. 指令也可能通過該總線取得 (沒有ICode來的高效). 該總線的控制目标有:内部的SRAM1, SRAM2 and SRAM3, AHB1的外設(包括APB外設), AHB2的外設和通過FSMC/FMC的外部記憶體
- BusMatrix
BusMatrix 管理主總線之間的通路仲裁. 仲裁使用循環算法
總線結構圖:
2、記憶體分布
- 程式設計空間(代碼空間), 資料空間, 寄存器和I/O端口被組織在同一個線性的4Gb空間中。所有的資料都按照小端存儲
- 可尋址記憶體空間被分為8個塊, 每塊包括512MB
- 所有沒有被配置設定到片上記憶體或者片上外設的空間都被成為”reserved”
嵌入式SRAM
- STM32F407ZG配置了4 Kbytes的備份 SRAM,192 Kbytes的系統SRAM。
- 嵌入式SRAM可以以位元組,半字,字的方式通路,可以以CPU的速度進行無需等待的通路,嵌入式SRAM被分為以下3個塊:
- SRAM1 和 SRAM2 映射到 0x2000 0000 位址并且可以被所有的 AHB 總線通路.
- SRAM3 (隻有 STM32F42xxx 與 STM32F43xxx 系列可用) 映射到 0x2002 0000 位址處并且可以被所有的 AHB 總線通路
- CCM (core coupled memory) 映射到 0x1000 0000 位址處隻能夠通過D-bus被CPU通路
位帶操作
在STM32中提供了兩個位帶操作域以及對應的位帶别名域
位帶操作域 | 位帶别名域 |
---|---|
SRAM的低1M位元組 : 0x2000 0000~0x200F FFFF | 0x2200 0000~0x23FF FFFC |
外設的低1M位元組 : 0x4000 0000~0x400F FFFF | 0x4200 0000~0x43FF FFFC |
位帶操作公式:
例子:
= + (*) + (*)
/* 對0x22006008的讀寫就實作了對0x2000 0300處第2個bit的讀寫 */
/* 同理,若要對0x40000000位址塊進行位操作,需要把上面式子右邊的0x22000000換成0x42000000 */
以後我們想直接操作某個寄存器的某一位的時候,隻需要找到這一位對應的别名位址,然後對别名位址進行讀寫即可實作對這一位的讀寫。如果想實作這中操作的話,隻需要定義宏即可,例如下面的:
#define REGISTER_BIT_BAND(ofs, bit_num) (x22000000 + (ofs << ) + (bit_num << ))
#define WRITE_R_BIT_BAND(ofs, bit_num, stat) (*((volatile unsigned int *)REGISTER_BIT_BAND(ofs, bit_num)) = stat)
//上面兩個宏可以實作對寄存器位帶域的操作
核心程式設計手冊給出的M系列4GB記憶體分布
3、啟動配置
啟動方式
Boot mode selection pins | Boot mode | Aliasing | |
---|---|---|---|
BOOT1 | BOOT0 | ||
x | Main Flash memory | Main Flash memory is selected as the boot space | |
1 | System memory | System memory is selected as the boot space | |
1 | 1 | Embedded SRAM | Embedded SRAM is selected as the boot space |
我的闆子啟動是在main flash memory,由前面的ARM編譯工具一節可以知道代碼從0x08000000開始運作,這個也是由分散加載檔案指定的,也是闆子上面main flash實際位址
實體位址重映射
- 下面的記憶體空間可以被重映射:
- Main Flash memory
- System memory
- Embedded SRAM1 ( KB)
- FSMC bank (NOR/PSRAM and )
映射表為
映射到0x00000000位址處的記憶體塊可以由SYSCFG控制器的(SYSCFG_MEMRMP)寄存器低二位決定,如下表所示
bit1 | bit0 | memory selected |
---|---|---|
Main Flash memory mapped at 0x0000 0000 | ||
1 | System Flash memory mapped at 0x0000 0000 | |
1 | FSMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x0000 0000 | |
1 | 1 | Embedded SRAM (SRAM1) mapped at 0x0000 0000從表中 |
可以看出來從main flash啟動的時候flash memory會被重新映射到0位址開始處,大小為1MB,但是我的闆子依然是從0x08000000位址處運作代碼的,現在由表中資料可以看出來從0位址開始運作也是可以的,可能是為了适應不同的啟動方式,是以才從0x08000000位址處開始運作系統代碼的。如果要從其他的地方運作flash memory中的代碼,隻需要在那種方式對應的被重映射到0位址空間代碼段開頭加上一個跳轉語句,直接跳轉到0x08000000位址處就可以運作代碼了
4、嵌入式flash memory
接口特性:
- Flash memory 讀操作
- Flash memory 程式設計/擦除操作
- 讀/寫保護
- 指令預取
- I-Code上面有 64 個 128 位寬的快速存取線
- I-Code上面有 8 個 128 位寬的快速存取線
flash memory特性:
- 1M byte容量
- 128位的讀資料位寬
- 支援 Byte, half-word, word and double word 寫入
- 支援扇區與塊擦除
- 支援記憶體組織
- flash memory可以被組織成下面的樣子:
- – main memory 分為 4 個 16 Kbytes 大小扇區, 1 個 64 Kbytes 大小扇區,和 7 個 128 Kbytes 大小扇區
- – 不同啟動裝置對應相應的system memory
- – 512 OTP (一次性程式設計) bytes
- – 可選配置讀寫保護
- flash memory可以被組織成下面的樣子:
- 低電量模式
記憶體分布圖
額外補充時鐘一節内容:
VOS 在 PWR_CR 寄存器的 bit15 位被設定
當 VOS = ‘0’, fHCLK 最大為 144 MHz.
當 VOS = ‘1’, fHCLK 最大為 168 MHz.
等待周期
等待周期指的是CPU通路Flash的等待時間,CPU通路Flash的周期就是等待周期加上1,這個與Flash的硬體性能有關
如果覺得本文章不錯,請關注微信公衆号-YellowMax多多支援,檢視更多文章
歡迎轉發、關注、點贊一波