1、总线 系统结构: 系统包括一个由多个互相连接的32位AHB总线组成的矩阵。 – 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
+ K- x( F: F) l! I$ ?2 m& Y0 p c
– 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 " F2 l; ~0 D" \2 g& Z% E
总线矩阵也能够提供主到从的访问,从而使能并发访问,甚至在多个高速外设同时工作的时候也能够高效工作. 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 管理主总线之间的访问仲裁. 仲裁使用循环算法 0 t4 Z2 L/ E/ M/ H j( \
总线结构图: 4 ]3 r! ~$ y+ f7 d
4 o0 @" a$ i2 _ T5 ~: a* z: l2、内存分布 编程空间(代码空间), 数据空间, 寄存器和I/O端口被组织在同一个线性的 4Gb空间中。所有的数据都按照小端存储,可寻址内存空间被分为8个块, 每块包括512MB。 所有没有被分配到片上内存或者片上外设的空间都被成为”reserved” 嵌入式SRAM。 STM32F407ZG配置了4 Kbytes的备份 SRAM,192 Kbytes的系统SRAM。 嵌入式SRAM可以以字节,半字,字的方式访问,可以以CPU的速度进行无需等待的访问,嵌入式SRAM被分为以下3个块:
! ^ E$ ]3 G- L * P& m4 `5 L7 z9 l6 F
7 R$ |5 t/ C" w$ S: VSRAM1 和 SRAM2 映射到 0x2000 0000 地址并且可以被所有的 AHB 总线访问. SRAM3 (只有 STM32F42xxx 与 STM32F43xxx 系列可用) 映射到 0x2002 0000 地址处并且可以被所有的 AHB 总线访问 CCM (core coupled memory) 映射到 0x1000 0000 地址处只能够通过D-bus被CPU访问 5 t* ]. A6 F ?8 g& f
位带操作 在STM32中提供了两个位带操作域以及对应的位带别名域。
4 ~, s7 W1 m' I8 H' }% c% R
位带操作域 | 位带别名域 | SRAM的低1M字节 : 0x2000 0000~0x200F FFFF | 0x2200 0000~0x23FF FFFC | 外设的低1M字节 : 0x4000 0000~0x400F FFFF | 0x4200 0000~0x43FF FFFC | 5 X& O' q/ m' {8 L
位带操作公式:- bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)
复制代码 1 p4 w( s" R/ V' y
例子: - 0x22006008 = 0x22000000 + (0x300*32) + (2*4)" o6 N/ a ?/ ~& q, h
- /* 对0x22006008的读写就实现了对0x2000 0300处第2个bit的读写 */
( q. K, |, n! I% T - /* 同理,若要对0x40000000地址块进行位操作,需要把上面式子右边的0x22000000换成0x42000000 */
复制代码4 P/ M7 F& c/ A# R, f. t2 ?
以后我们想直接操作某个寄存器的某一位的时候,只需要找到这一位对应的别名地址,然后对别名地址进行读写即可实现对这一位的读写。如果想实现这中操作的话,只需要定义宏即可,例如下面的: - #define REGISTER_BIT_BAND(ofs, bit_num) (0x22000000 + (ofs << 5) + (bit_num << 2))
+ A ^8 M1 X$ ]3 a& V; E - #define WRITE_R_BIT_BAND(ofs, bit_num, stat) (*((volatile unsigned int *)REGISTER_BIT_BAND(ofs, bit_num)) = stat)0 w3 Q! ~" m8 j% ] m
- //上面两个宏可以实现对寄存器位带域的操作
复制代码
6 I! W4 [9 g! G3 `6 f0 T
内核编程手册给出的M系列4GB内存分布。 m9 P( {6 F6 G! A5 x8 I5 i
3、启动配置启动方式Boot mode selection pins | Boot mode | Aliasing | BOOT1 | BOOT0 | ; \2 d1 q$ O, [# b8 T' m+ M+ D
| x | 0 | Main Flash memory | Main Flash memory is selected as the boot space | 0 | 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 (112 KB)- FSMC bank 1 (NOR/PSRAM 1 and 2)
复制代码 + G: O3 X/ p. Y- P, g+ m) h- s
映射表为: 3 @, ]4 Y) h3 Y4 s: J8 t P4 o
映射到0x00000000地址处的内存块可以由SYSCFG控制器的(SYSCFG_MEMRMP)寄存器低二位决定,如下表所示:
/ h( ]+ h, { \bit1 | bit0 | memory selected | 0 | 0 | Main Flash memory mapped at 0x0000 0000 | 0 | 1 | System Flash memory mapped at 0x0000 0000 | 1 | 0 | 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地址处就可以运行代码了。
/ v1 [6 A4 C- a0 b8 T6 O 4、嵌入式flash memory接口特性:/ ]2 W- k" w9 c. o/ L4 H" |( Z
flash memory特性:1M byte容量 128位的读数据位宽 支持 Byte, half-word, word and double word 写入 支持扇区与块擦除 支持内存组织 8 s3 Z* Y C4 v% u3 m L1 h
4 \2 b' @! `; H– main memory 分为 4 个 16 Kbytes 大小扇区, 1 个 64 Kbytes 大小扇区,和 7 个 128 Kbytes 大小扇区 – 不同启动设备对应相应的system memory – 512 OTP (一次性编程) bytes – 可选配置读写保护 flash memory可以被组织成下面的样子: # U+ m. ]( @% r& C- W2 |
8 m# o2 j& N7 E$ x9 j! q
低电量模式 1 v) M, K) B* [- b
内存分布图:
2 L1 M6 e2 L5 _- N, j: D8 n
4 F% E/ n% Q+ c' S! V4 t 额外补充时钟一节内容: VOS 在 PWR_CR 寄存器的 bit15 位被设置。 当 VOS = ‘0’, fHCLK 最大为 144 MHz. % \ H$ \! o9 c1 i" w
当 VOS = ‘1’, fHCLK 最大为 168 MHz. 等待周期
/ w0 z8 ^/ A9 ] 等待周期指的是CPU访问Flash的等待时间,CPU访问Flash的周期就是等待周期加上1,这个与Flash的硬件性能有关。
; ?1 y0 o/ y0 G; {" i, D
, Y5 p+ p$ W9 R; {+ p |