STM32的存储器与寄存器

本文介绍了STM32的存储器结构,包括只读存储器(ROM)和随机存取存储器(RAM)的区分,以及存储器映射的概念。在STM32中,程序存储器、数据存储器、寄存器和I/O端口共用4GB地址空间。详细阐述了各外设的地址分配,如USBOTG、以太网、CRC、闪存接口等,并展示了Block0、Block1和Block2的功能划分,包括内部Flash、SRAM和片上外设的分布。寄存器映射则是给内存单元起别名,便于访问和控制特定功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 里面,要特别注意Block0Block1 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、寄存器

通过给特定功能的内存单元起一个别名,此别名即所谓的寄存器。寄存器映射就是给(已分配好地址且有特定功能的)内存单元起别名的过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值