STM32F10XXX总线架构和存储器组织

1. 总线架构

以互联网大容量产品为例,整体总线架构如下图:

其中,

DCode,也即D-bus,顾名思义就是数据总线。它通过总线矩阵连接Contex-M3和闪存存储器的数据接口,可用于常量加载(我的理解是RO DATA的访问)和调试访问(如何应用,尚未得知)。

ICode,指令总线,实现Contex-M3和闪存存储器的指令接口的连接,用于程序RO CODE(.text)的读取。

System,系统总线,实现外设总线到总线矩阵的连接。对内置SRAM就是通过系统总线访问的。

DMA总线,连接DMA硬件的AHB主控接口到总线矩阵。

总线矩阵:DMA可以通过DMA总线访问SRAM、闪存和外设。我们知道Contex-M3同样可以通过DCode或者System总线访问这些资料。为了不让两者冲突,需要总线矩阵逻辑进行仲裁决断。

AHB,通过总线矩阵和系统总线相连。再加上AHB/APB桥,构成了到外设的通道。从上图可以看出,APB分为两种:APB1和APB2。这样是为了适应不同速率的外设,同时兼顾性能功耗的考虑。APB1的操作频率限于36MHz,APB2操作于全速(最高72MHz)。

 

2. 存储器组织

STM32F10XXX中flash,内置SRAM,片上寄存器等一起构成一个4GB的线性地址空间。数据采用小端格式存储,即低字节位于低地址(两低为小端)。

下图是片上外设寄存器的映射地址,这便是C程序中以下类型定义的来源。

<span style="font-size:12px;">#define PERIPH_BB_BASE        ((u32)0x42000000)
#define SRAM_BB_BASE          ((u32)0x22000000)
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)</span>

 

 

2.1 再来说一下bit-band的概念

        它其实是8051就有的一个技术。它操作的是将某段地址区间的数据,把这些数据的每个bit映射到另外一个地址空间。这样对映射后地址的访问,就等同于映射之前bit的访问。

Cortex™-M3存储器映像包括两个位段(bit-band)区。分别是:

0x2000_0000‐0x200F_FFFF(SRAM 区中的最低 1MB) 
0x4000_0000‐0x400F_FFFF(片上外设区中的最低 1MB)

这两个位段区将别名存储器区中的每个字映射到位段存储器区的一个位,在别名存储区写入一个字具有对位段区的目标位执行读-改-写(RCU)操作的相同效果。
在STM32F10xxx里,外设寄存器和SRAM都被映射到一个位段区里,这允许执行单一的位段的写和读操作。 下面的映射公式给出了别名区中的每个字是如何对应位带区的相应位的:
bit_word_addr = bit_band_base + (byte_offset×32) + (bit_number×4)
其中:

所乘常数32和4是映射后的地址4字节对齐的缘故。
bit_word_addr是别名存储器区中字的地址,它映射到某个目标位。
bit_band_base是别名区的起始地址。
byte_offset是包含目标位的字节在位段里的序号
bit_number是目标位所在位置(0-31)

采用bit-band的优势:

1. 直接操作bit位,加大方便的GBIO口等寄存器的控制。

2. RCU是原子操作,实现资源互斥访问。

3. 使得代码标书更加简洁。

可以在C语句中运用bit-band功能。可以直接#define映射后地址区域,如:

<span style="font-size:12px;">#define DEVICE_REG0 ((volatile unsigned long *) (0x40000000)) 
#define DEVICE_REG0_BIT0 ((volatile unsigned long *) (0x42000000)) 
#define DEVICE_REG0_BIT1 ((volatile unsigned long *) (0x42000004)) 
*DEVICE_REG0_BIT1 = 0x1;       // 通过位带别名地址设置 bit1</span>

同时,在 GCC和 RealView MDK (即 Keil)  开发工具中,允许定义变量时手工指定其地址。

<span style="font-size:12px;">volatile unsigned long bbVarAry[7] __attribute__(( at(0x20003014) )); 
volatile unsigned long* const pbbaVar= (void*)(0x22000000+0x3014*8*4);
pbbaVar[136]=1;   //置位第 136号比特</span>

2.2 嵌入式闪存

结构图如下:

在STM32F10xxx里,可以通过BOOT[1:0]引脚选择从主存储块,系统存储器或者内置SRAM启动程序运行。

另外,ST在生产线上往系统存储器写入内嵌的自举程序,用于通过可用的串行接口对闪存存储器进行重新编程。具体可参见

http://www.st.com/content/ccc/resource/technical/document/application_note/b9/9b/16/3a/12/1e/40/0c/CD00167594.pdf/files/CD00167594.pdf/jcr:content/translations/en.CD00167594.pdf

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值