stm32 总线与内存分布

发布者:灵感之翼最新更新时间:2019-11-15 来源: eefocus关键字:stm32  总线  内存分布 手机看文章 扫描二维码
随时随地手机看文章

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 FFFF0x2200 0000~0x23FF FFFC
外设的低1M字节 : 0x4000 0000~0x400F FFFF0x4200 0000~0x43FF FFFC

位带操作公式:

bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)


例子:

0x22006008 = 0x22000000 + (0x300*32) + (2*4)

/* 对0x22006008的读写就实现了对0x2000 0300处第2个bit的读写 */

/* 同理,若要对0x40000000地址块进行位操作,需要把上面式子右边的0x22000000换成0x42000000 */


以后我们想直接操作某个寄存器的某一位的时候,只需要找到这一位对应的别名地址,然后对别名地址进行读写即可实现对这一位的读写。如果想实现这中操作的话,只需要定义宏即可,例如下面的:


#define REGISTER_BIT_BAND(ofs, bit_num) (0x22000000 + (ofs << 5) + (bit_num << 2))

#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 pinsBoot modeAliasing
BOOT1BOOT0
x0Main Flash memoryMain Flash memory is selected as the boot space
01System memorySystem memory is selected as the boot space
11Embedded SRAMEmbedded 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)


映射表为

内存映射表

映射到0x00000000地址处的内存块可以由SYSCFG控制器的(SYSCFG_MEMRMP)寄存器低二位决定,如下表所示

bit1bit0memory selected
00Main Flash memory mapped at 0x0000 0000
01System Flash memory mapped at 0x0000 0000
10FSMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x0000 0000
11Embedded 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 写入

  • 支持扇区与块擦除

  • 支持内存组织 

    • – 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的硬件性能有关

CPU等待周期


关键字:stm32  总线  内存分布 引用地址:stm32 总线与内存分布

上一篇:STM32总线架构笔记
下一篇:怎样用STM32CAN总线接口发送和接收数据

推荐阅读最新更新时间:2024-11-10 15:41

stm32单片机引脚介绍及功能
stm32是一种ARM Cortex-M内核单片机,下面小编为大家介绍一下单片机引脚介绍及功能。单片机旁边的一排金属针脚就是引脚,不同的引脚有不同的功能。 引脚大概分为4种,分别是电源、时钟、控制和I/O引脚。stm32的引脚一般有GPIO和AFIO两种用途。 比如有的引脚是电源正极和黑色标记的电源负极,这是来给单片机提供电源的,要把电流引到对应的引脚才能正常工作。 还有晶体震荡电路反向输入端和输出端引脚,晶体能够为单片机提供基本的震荡源。如果没有晶振的话,单有电源单片机是不能启动的,就和人们的心跳一样。 RESET(PC6)复位信号输入端引脚是用来重启单片机的,和电脑一样,有时候单片机也会死机,这个时候就需要RE
[单片机]
STM32直流风机通过按键PWM调速同时各参数在LCD上显示
依然还记得当时学完STM32之后感觉什么都不会,然后基本上是靠单片机的知识撑过期末的测试的,然后其实一直想把STM32学好,但是感觉学太多也不好吧,总感觉这是样,学得多并不是坏事 ,但是总觉得吧,应该要在你学的技能中有一项是你非常突出的。 // //Design:直流电机调速,通过按键改变占空比以达到调速目的,同时显示各参数 //Author:Touch //Time :2017.6.5 // #include led.h #include delay.h #include sys.h #include usart.h #include lcd.h #include key.h #include pwm.h int main(v
[单片机]
STM32之ADC+步骤小技巧
神通广大的各位互联网的网友们、大家早上中午晚上好好好、今早起来很准时的收到了两条10086的扣月租的信息、心痛不已、怀着这心情、又开始了STM32的研究、早上做了计算机控制的PID实验,又让我想起了飞思卡尔的电磁小车、、曾经的电感电压采集让我心碎的多少次、又让我开心了多少次、但已经成为过去、(软件和硬件都会影响),呵呵、估计有人已经猜到我接下来要介绍什么了、在你们面前、我已无秘密、额、其实标题也直接“表白”了、看到标题,别吓到哈、并不是要用英文写、至于原因是什么、请往下看: 好吧、言归正传:STM32的ADC模块,请允许我用如此通俗的语言:普通话 来介绍STM32ADC模块的特色 1、1MHz转换速率、12位转换结果(1
[单片机]
<font color='red'>STM32</font>之ADC+步骤小技巧
STM32单片机GPIO口的学习
  GPIO:   STM32的(64引脚的)IO口一共有3个,分别是PA、PB、PC.   STM32的IO端口可以由软件配置成8种模式:   1,输入浮空   2,输入上拉   3,输入下拉   4,模拟输入   5,开漏输出   6,推挽输出   7,推挽复用功能   8,开漏复用功能   STM32的每个IO端口都有7个寄存器来控制。他们分别是:配置模式的2个32位的端口配置寄存器CRL和CRH;2个32位的数据寄存器IDR和ODR;1个32位的置位/复位寄存器BSRR;一个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR;我们常用的IO端口寄存器只有4个:CRL、CRH、IDR、ODR。   注意(在配置ST
[单片机]
STM32-AHB、APB1、APB2的使(失)能函数
一、RCC_AHBPeriphClockCmd函数 其中RCC_AHBPeriph的取值范围: 二、RCC_APB2PeriphClockCmd函数 其中RCC_APB2Periph的取值范围:GPIOx 、高级定时器TIM1,TIM8,高速SPI1,高速异步通信USART1,ADC1,ADC2,ADC3,温度传感器等接口 三、RCC_APB1PeriphClockCmd函数: 其中RCC_APB1Periph的取值范围:备份接口,通用定时器,基本定时器,异步通信USART2,USART3,异步通信USART4,USART5,IIC1,IIC2,SPI2/IIS3,SPI3/IIS3 CAN总线,USB2,0,
[单片机]
STM32-AHB、APB1、APB2的使(失)能函数
STM32使用CubeMAX配置的串口中断接收方法
STM32使用cubeMAX可以快速建立工程模板,但是默认使用的是Hal库构成的工程,对于习惯使用了ST标准库的同学来说,灵活调用HAL库可能会比较生疏,我也是这么觉得的,但是还是要逐步去接触学习它,毕竟这个hal库的封装还是相当好的,有好多先进的思想和用法。 在学习过程中,我遇到了一个问题,之前也遇到过,但是没时间去研究,就是串口在CUBUMAX上配置好后,如何实现串口中断接收,接下来就来记录一下我学习到的知识: 1.定位串口中断发生的地方 HAL库的中断处理还是和标准库一样的,在stm32xxxx_it.c中定义我们定位到如下函数: HAL_UART_IRQHandler(&huart1); 再往下定位,我们找
[单片机]
I2C总线学习感想总结(二)——相关疑惑
1:上次说SCL上升沿写到总线上,SCL下降沿读总线上的数据,到底是谁读,谁写?还是二者有读有写,相互配合? 因为我的理解是CPU其控制作用,IC才具有I2C特征,上升沿写入总线,下降沿读取数据都是是针对从器件IC而言的 2:如果我的理解没问题,那当CPU发给从器件数据时,肯定有上升沿和下降沿,那下降沿好理解,从器件读取SDA,那上升沿呢,从器件还发数据至SDA吗? 同理,那当CPU接收从器件数据时,肯定有上升沿和下降沿,那上降沿好理解,从器件发SDA至总线,那下沿呢,从器件读SDA数据吗? 3:应答问题 I2C规定,每传送一个字节数据,都要有一个应答信号,应答信号由接收设备产生,应答信号表现为在SCL为
[单片机]
STM32在MDK中使用外部RAM浅解
使用简介: 开发板 神舟王STM32F207开发板 问题描述: 在使用emwin的时候由于占用的变量较多,出现了STM32F207内部RAM不够用的尴尬局面,开发板自带了4M的外部SRAM,因此考虑速度和存储的平衡,使用芯片内部RAM作为堆栈区使用,外部RAM则用来存储其他变量 修改内容: 启动文件即startup_stm32f2xx.s文件 1.添加标志量:DATA_IN_ExtSRAM EQU 1 ;主要是方便控制切换使用内部和外部RAM 2.修改栈区: IF DATA_IN_ExtSRAM == 1 __initial_sp EQU 0x20000000 + Stack_Size
[单片机]
<font color='red'>STM32</font>在MDK中使用外部<font color='red'>RAM</font>浅解
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved