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  总线  内存分布 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic480155.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

简析stm32启动过程
说明:本文是杰杰以前保存下来的,出处已经不知道在哪了,应该是各大论坛中,当然转这种文章,到处都有。今天我就把它重写一遍。基于原作者的内容添加一些内容(源码)讲解。杰杰水平有限,出错在所难免,还望各位大神指点一二。startup_stm32f10x_cl.s互联型的STM32F105xx,STM32F107xxstartup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx,STM32F103xxstartup_stm32f10x_hd_vl.s 大容量的STM32F100xxstartup_stm32f10x_ld.s 小容量的STM32F101xx,STM32
发表于 2019-12-14
简析stm32启动过程
【干货】老外的GitHub整理的stm32f4驱动库
昨晚在github发现了一个老外自己整理的封装库,有很多,比如一些通讯啊啥的,一些显示屏驱动等等目录STM32F4Libraries and projectsHere are listed all libraries for STM32F4 devices.Libraries are designed to work with STM32F4xx series of MCU. Every project hereis created with Keil uVision, but tested with GCC compiler too (Coocox). Eachproject includes 4 targets
发表于 2019-12-14
【干货】老外的GitHub整理的stm32f4驱动库
基于Linux的kfifo移植到STM32(支持os的互斥访问)
关于kfifokfifo是内核里面的一个First In First Out数据结构,它采用环形循环队列的数据结构来实现;它提供一个无边界的字节流服务,最重要的一点是,它使用并行无锁编程技术,即当它用于只有一个入队线程和一个出队线程的场情时,两个线程可以并发操作,而不需要任何加锁行为,就可以保证kfifo的线程安全。具体什么是环形缓冲区,请看我以前的文章说明关于kfifo的相关概念我不会介绍,有兴趣可以看他的相关文档,我只将其实现过程移植重写,移植到适用stm32开发板上,并且按照我个人习惯重新命名,RingBuff->意为环形缓冲区RingBuff_t环形缓冲区的结构体成员变量,具体含义看注释。buffer: 用于存放
发表于 2019-12-14
STM32之重定向printf
学习stm32,打交道最多的莫过于串口通讯了,但是官方的串口发送库太恶心了,完全不好用甚是还念C语言的printf,想输出什么就有什么,现在,一步步来做个重定向,让你的stm32可以跟C语言一样能想看什么就看什么:首先:添加printf的头文件 :#include <stdio.h>    //当时学C语言最熟悉的stdio.h其次:改写int fputc(int ch, FILE *f)函数int fputc(int ch, FILE *f);int fputc(int ch, FILE *f){USART_SendData(USARTx, (uint8_t) ch);while
发表于 2019-12-14
STM8L051F3_02_EXTI应用
本章介绍STM8L051F3的EXTI相关知识,内容分为以下几部分:EXTI简介KEY外部中断检测1、EXTI简介EXTI也是属于GPIO的知识点,应用比较广泛。STM8L051F3每个I/O口在输入模式下都能配置为中断,在这个配置下,一个信号沿或电平输入到I/O口上将产生一个中断请求。外部中断只有在端口的输入模式下才有效。可通过配置寄存器Px_CR2相应的位来独立地使能或禁能某个端口的外部中断功能。另外,可通过ADC_TDRH和ADC_TDRL寄存器来禁用施密特触发器节省功耗。2、KEY外部中断检测2.1 KEY的外部中断配置本小节介绍将GPIO配置为外部中断输入模式,并通过KEY(PC4)来触发一个外部中断信号,然后产生中
发表于 2019-12-14
STM8L051之通过ADC1与DMA读取内部参考电压
stm8L051芯片内部的参考电压与电源电压有一定的关系这在芯片供电电压变化的情况下,测量外部ADC电压输入提供一个确定的参考电压。这里提前厘清下:该内部参考电压VREFINT 并非ADC 的参考电压,ADC 的参考电压依然是VDD。即使VDD 有所波动,这个VREFINT 电压恒定不变,对于ADC 电路而言,它只是个测试点。 对于某固定的ADC 参考电压情况下,所有被测电压点的AD转换值与该点电压值保持同一比例关系,换句话说,对于ADC参考电压固定情况下,各点的电压与ADC值与成线性关系。下面图形是芯片分别在3个不同参考电压的示意图,这里参考电压接VDD。下面三根斜线分别是VDD 为2.8V、3.2V、3.6V 时的
发表于 2019-12-14
STM8L051之通过ADC1与DMA读取内部参考电压
小广播
何立民专栏 单片机及嵌入式宝典

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

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