1、存储器
存储器单元实际上是时序逻辑电路的一种。按存储器的使用类型可分为只读存储器(ROM)和随机存取存储器(RAM),两者的功能有较大的区别,因此在描述上也有所不同。
存储器是许多存储单元的集合,按单元号顺序排列。每个单元由若干二进制位构成,以表示存储单元中存放的数值,这种结构和数组的结构非常相似,故在VHDL语言中,通常由数组描述存储器。
2、存储器映射
程序存储器、数据存储器、寄存器和I/O端口排列在同一顺序的4GB地址空间内。这就是我们曾提到过的被控总线的连接部分,而编程时就是操作这一块地方。存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。
程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。
可访问的存储器空间被分成8个主要块,每个块为512MB。其他所有没有分配给片上存储器和外设的存储器空间都是保留的地址空间,请参考相应器件的数据手册中的存储器映像图。
外设的地址映射
起始地址 |
外设 |
总线 |
寄存器映像 |
0x5000 0000 – 0x5003 FFFF |
USB OTG 全速 |
AHB |
|
0x4003 0000 – 0x4FFF FFFF |
保留 |
| |
0x4002 8000 – 0x4002 9FFF |
以太网 |
| |
0x4002 3400 - 0x4002 3FFF |
保留 |
AHB |
|
0x4002 3000 - 0x4002 33FF |
CRC |
| |
0x4002 2000 - 0x4002 23FF |
闪存存储器接口 |
| |
0x4002 1400 - 0x4002 1FFF |
保留 |
| |
0x4002 1000 - 0x4002 13FF |
复位和时钟控制(RCC) |
| |
0x4002 0800 - 0x4002 0FFF |
保留 |
| |
0x4002 0400 - 0x4002 07FF |
DMA2 |
| |
0x4002 0000 - 0x4002 03FF |
DMA1 |
| |
0x4001 8400 - 0x4001 7FFF |
保留 |
| |
0x4001 8000 - 0x4001 83FF |
SDIO |
| |
0x4001 4000 - 0x4001 7FFF |
保留 |
APB2 |
|
0x4001 3C00 - 0x4001 3FFF |
ADC3 |
| |
0x4001 3800 - 0x4001 3BFF |
USART1 |
| |
0x4001 3400 - 0x4001 37FF |
TIM8定时器 |
| |
0x4001 3000 - 0x4001 33FF |
SPI1 |
| |
0x4001 2C00 - 0x4001 2FFF |
TIM1定时器 |
| |
0x4001 2800 - 0x4001 2BFF |
ADC2 |
| |
0x4001 2400 - 0x4001 27FF |
ADC1 |
| |
0x4001 2000 - 0x4001 23FF |
GPIO端口G |
| |
0x4001 2000 - 0x4001 23FF |
GPIO端口F |
| |
0x4001 1800 - 0x4001 1BFF |
GPIO端口E |
| |
0x4001 1400 - 0x4001 17FF |
GPIO端口D |
| |
0x4001 1000 - 0x4001 13FF |
GPIO端口C |
| |
0X4001 0C00 - 0x4001 0FFF |
GPIO端口B |
| |
0x4001 0800 - 0x4001 0BFF |
GPIO端口A |
| |
0x4001 0400 - 0x4001 07FF |
EXTI |
| |
0x4001 0000 - 0x4001 03FF |
AFIO |
| |
0x4000 7800 - 0x4000FFFF |
保留 |
APB1 |
|
0x4000 7400 - 0x4000 77FF |
DAC |
| |
0x4000 7000 - 0x4000 73FF |
电源控制(PWR) |
| |
0x4000 6C00 - 0x4000 6FFF |
后备寄存器(BKP) |
| |
0x4000 6800 - 0x4000 6BFF |
bxCAN2 |
| |
0x4000 6400 - 0x4000 67FF |
bxCAN1 |
| |
0x4000 6000(1) - 0x4000 63FF |
USB/CAN共享的512字节SRAM |
| |
0x4000 5C00 - 0x4000 5FFF |
USB全速设备寄存器 |
| |
0x4000 5800 - 0x4000 5BFF |
I2C2 |
| |
0x4000 5400 - 0x4000 57FF |
I2C1 |
| |
0x4000 5000 - 0x4000 53FF |
UART5 |
| |
0x4000 4C00 - 0x4000 4FFF |
UART4 |
| |
0x4000 4800 - 0x4000 4BFF |
USART3 |
| |
0x4000 4400 - 0x4000 47FF |
USART2 |
| |
0x4000 4000 - 0x4000 3FFF |
保留 |
| |
0x4000 3C00 - 0x4000 3FFF |
SPI3/I2S3 |
| |
0x4000 3800 - 0x4000 3BFF |
SPI2/I2S3 |
| |
0x4000 3400 - 0x4000 37FF |
保留 |
| |
0x4000 3000 - 0x4000 33FF |
独立看门狗(IWDG) |
| |
0x4000 2C00 - 0x4000 2FFF |
窗口看门狗(WWDG) |
| |
0x4000 2800 - 0x4000 2BFF |
RTC |
| |
0x4000 1800 - 0x4000 27FF |
保留 |
| |
0x4000 1400 - 0x4000 17FF |
TIM7定时器 |
| |
0x4000 1000 - 0x4000 13FF |
TIM6定时器 |
| |
0x4000 0C00 - 0x4000 0FFF |
TIM5定时器 |
| |
0x4000 0800 - 0x4000 0BFF |
TIM4定时器 |
| |
0x4000 0400 - 0x4000 07FF |
TIM3定时器 |
| |
0x4000 0000 - 0x4000 03FF |
TIM2定时器 |
|
STM存储器分为8个Block,在这 8 个 Block 里面,要特别注意Block0、Block1 和 Block2 这 3 个块。因为其中包含了 STM32 芯片的内部 Flash、RAM 和片上外设。下面还是根据存储器映射图内信息来简单的介绍下这3个 Block 里面的具体区域功能划分。
Block0 内部区域功能划分
Block0 主要用于设计片内的 FLASH, STM32F103 系列芯片内部 FLASH 最大是 512KB,我们使用的 STM32F103ZET6 的 FLASH 是 512KB。要在芯片内部集成更大的 FLASH 或者 SRAM 都意味着芯片成本的增加,所以往往片内集成的FLASH 都不会太大。512KB 的 FLASH 已经足够我们一般的应用开发。Block0 内部又划分了好多个功能块,我们按地址从低到高顺序依次介绍。
0x0000 0000-0x0007 FFFF:取决于 BOOT 引脚,为 FLASH、系统存储器、SRAM 的别名。
0x0008 0000-0x07FF FFFF:预留。
0x0800 0000-0x0807 FFFF:片内 FLASH,我们编写的程序就放在这一区域。
0x0808 0000-0x1FFF EFFF:预留。
0x1FFF F000-0x1FFF F7FF:系统存储器,里面存放的是 ST 出厂时烧写好的isp 自举程序,用户无法改动。使用串口下载的时候需要用到这部分程序。
0x1FFF F800-0x1FFF F80F:选 项 字 节 ,用 于 配 置 读 写 保 护 、BOR 级别、软件/硬件看门狗以及器件处于待机或停止模式下的复位。当芯片不小心被锁住之后,我们可以从 RAM 里面启动来修改这部分相应的寄存器位。
0x1FFF F810-0x1FFF FFFF:预留。
Block1 内部区域功能划分
Block1用于设计片内的SRAM, 例如STM32F103ZET6 的 SRAM是64KB。从存储器映射图中可以看到 Block1 内部又划分了几个功能块,我们按地址从低到高顺序依次介绍。
0x2000 0000-0x2000 FFFF:SRAM,容量为 64KB。
0x2001 0000-0x3FFF FFFF:预留。
Block2 内部区域功能划分
Block2 用于设计片内外设, 根据外设总线速度的不同, Block2 被划分为 AHB和 APB 两部分, APB 又被分成 APB1 和 APB2 总线。 这些都可以在上面存储器映射图中可看到。下面我们按地址从低到高顺序依次介绍。
0x4000 0000-0x4000 77FF:APB1 总线外设。
0x4000 7800-0x4000 FFFF:预留。
0x4001 0000-0x4001 3FFF:APB2 总线外设。
0x4001 4000-0x4001 7FFF:预留。
0x4001 8000-0x4002 33FF:AHB 总线外设。
0x4002 4400-0x5FFF FFFF:预留。
在Block3、Block4、Block5中包含了FSMC扩展区域,可用于扩展如 SRAM,NORFLASH 和 NANDFLASH 等的外部存储器。
3、寄存器
通过给特定功能的内存单元起一个别名,此别名即所谓的寄存器。寄存器映射就是给(已分配好地址且有特定功能的)内存单元起别名的过程。