STM32F429

1. 存储器和总线架构

1.1 系统架构


I总线:

此总线用于将 Cortex™-M4F 内核的指令总线连接到总线矩阵。内核通过此总线获取指令。

此总线访问的对象是包含代码的存储器(内部 Flash/SRAM 或通过 FSMC 的外部存储器)。

D总线:

此总线用于将 Cortex™-M4F 数据总线和 64 KB CCM 数据 RAM 连接到总线矩阵。内核通过此总线进行立即数加载和调试访问。此总线访问的对象是包含代码或数据的存储器(内部Flash 或通过 FSMC 的外部存储器)

注意:

CCM(Core Coupled Memory)是给F4内核专用的全速64KB RAM, 它们没有经过总线矩阵, F4内核与之直接相连, 地址空间在0x1000_0000 ~ 0x1000_FFFF。可以用作堆栈以及高速运算的数据缓存。

参考应用:CCM中移植FreeRTOS

s:总线:

此总线用于将 Cortex™-M4F 内核的系统总线连接到总线矩阵。此总线用于访问位于外设或 SRAM 中的数据。也可通过此总线获取指令(效率低于 ICode)。此总线访问的对象是112 KB、 64 KB 和 16 KB 的内部 SRAM、包括 APB 外设在内的 AHB1 外设、 AHB2 外设以及通过 FSMC 的外部存储器

S3,S4:DMA存储器总线

此总线用于将 DMA 存储器总线主接口连接到总线矩阵。 DMA 通过此总线来执行存储器数据的传入和传出。此总线访问的对象是数据存储器:内部 SRAM( 112 KB、 64 KB、 16 KB)以及通过 FSMC 的外部存储器。

S5:DMA外设总线:

此总线用于将 DMA 外设主总线接口连接到总线矩阵。 DMA 通过此总线访问 AHB 外设或执行存储器间的数据传输。此总线访问的对象是 AHB 和 APB 外设以及数据存储器:内部SRAM 以及通过 FSMC 的外部存储器。

S6:以太网 DMA 总线

此总线用于将以太网 DMA 主接口连接到总线矩阵。以太网 DMA 通过此总线向存储器存取数据。此总线访问的对象是数据存储器:内部 SRAM( 112 KB、 64 KB 和 16 KB)以及通过FSMC 的外部存储器。

S7: USB OTG HS DMA 总线

此总线用于将 USB OTG HS DMA 主接口连接到总线矩阵。 USB OTG DMA 通过此总线向存储器加载/存储数据。此总线访问的对象是数据存储器:内部 SRAM(112 KB、 64 KB 和 16 KB)以及通过 FSMC 的外部存储器。

AHB、APB总线图:


结合以上两张图可见:GPIO由AHB1控制,DMA1可以访问TIM2、3、4、5、12、13;DMA2访问GPIO(因为在AHB1总线上)

1.2.存储器映射

存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射,具体见图 5-5。 如果给存储器再分配一个地址就叫存储器重映射


模块0:FLASH、CCM等

模块1:SRAM1、SRAM2、SRAM3(根据图1,以太网和AHB总线能访问SRAM1\2\3,并且支持并发访问,即CPU读写SRAM1时,以太网可读写SRAM2)

外设地址APB1、APB2、AHB1可以详细查找 stm32F4xx中文参考手册

1.3、自举配置


嵌入式自举程序模式用于通过以下串行接口重新编程 Flash:
● USART1(PA9/PA10)
● USART3( PB10/11 和 PC10/11)
● CAN2(PB5/13)
● USB OTG FS(PA11/12) 从设备模式( DFU:器件固件升级)。

本文转自:CSDN 博主 Musing_jk
遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_37058227/article/details/80881169

围观 23

一、STM32 芯片架构简图


STM32 有三种启动方式,从 FLASH 启动(包含系统存储器),从内部 SRAM 启动,从外部 RAM 启动。

二、存储器映射

存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射,具体见下图。 如果给存储器再分配一个地址就叫存储器重映射。


在这 4GB 的地址空间中, ARM 已经粗线条的平均分成了 8 个块,每块 512MB,每个块也都规定了用途,具体分类见下表。每个块的大小都有 512MB,显然这是非常大的,芯片厂商在每个块的范围内设计各具特色的外设时并不一定都用得完,都是只用了其中的一部分而已。


在这 8 个 Block 里面,有 3 个块非常重要,也是我们最关心的三个块。 Boock0 用来设计成内部 FLASH, Block1 用来设计成内部 RAM, Block2 用来设计成片上的外设,下面我们简单的介绍下这三个 Block 里面的具体区域的功能划分。

1、存储器 Block0 内部区域功能划分

Block0 主要用于设计片内的 FLASH, F429 系列片内部 FLASH 最大是 2MB,STM32F429IGT6 的 FLASH 是 1MB。


2、储存器 Block1 内部区域功能划分

Block1 用于设计片内的 SRAM。 F429 内部 SRAM 的大小为 256KB,其中 64KB 的CCM RAM 位于 Block0,剩下的 192KB 位于 Block1,分 SRAM1 112KB, SRAM2 16KB,SRAM3 64KB, Block 内部区域的功能划分具体见下表。


3、储存器 Block2 内部区域功能划分

Block2 用于设计片内的外设,根据外设的总线速度不同, Block 被分成了 APB 和 AHB两部分,其中 APB 又被分为 APB1 和 APB2, AHB 分为 AHB1 和 AHB2,具体见下表。还有一个 AHB3 包含了 Block3/4/5/6,这四个 Block 用于扩展外部存储器,如 SDRAM,NORFLASH 和 NANDFLASH 等。


三、寄存器映射

根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

1、STM32 的外设地址映射

片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设, APB挂载低速外设, AHB 挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。其中 APB1 总线的地址最低,片上外设从这里开始,也叫外设基地址。

(1)总线基地址


(2)外设基地址

总线上挂载着各种外设,这些外设也有自己的地址范围,特定外设的首个地址称为“ XX 外设基地址”,也叫 XX 外设的边界地址。


(3)外设寄存器

GPIO 有很多个寄存器,每一个都有特定的功能。每个寄存器为 32bit,占四个字节,在该外设的基地址上按照顺序排列,寄存器的位置都以相对该外设基地址的偏移地址来描述。


2、C 语言对寄存器的封装
(1)封装总线和外设基地址

为了方便理解和记忆,我们把总线基地址和外设基地址都以相应的宏定义起来,总线或者外设都以他们的名字作为宏名。


(2)封装寄存器列表

GPIOA-GPIOH 都各有一组功能相同的寄存器,如 GPIOA_MODER/GPIOB_MODER/GPIOC_MODER 等等,它们只是地址不一样,但却要为每个寄存器都定义它的地址。为了更方便地访问寄存器,我们引入 C 语言中的结构体语法对寄存器进行封装。



这样的地址偏移与 STM32 GPIO 外设定义的寄存器地址偏移一一对应,只要给结构体设置好首地址,就能把结构体内成员的地址确定下来,然后就能以结构体的形式访问寄存器了。


3、修改寄存器的位操作方法

用 C 语言对寄存器赋值时,我们常常要求只修改该寄存器的某几位的值,且其它的寄存器位不变,这个时候我们就需要用到 C 语言的位操作方法了。

(1)把变量的某位清零

此处我们以变量 a 代表寄存器,并假设寄存器中本来已有数值,此时我们需要把变量a 的某一位清零,且其它位不变。


(2)把变量的某几个连续位清零

由于寄存器中有时会有连续几个寄存器位用于控制某个功能,现假设我们需要把寄存器的某几个连续位清零,且其它位不变。


(3)对变量的某几位进行赋值

寄存器位经过上面的清零操作后,接下来就可以方便地对某几位写入所需要的数值了,且其它位不变,这时候写入的数值一般就是需要设置寄存器的位参数。


(4)对变量的某位取反

某些情况下,我们需要对寄存器的某个位进行取反操作,即 1 变 0 , 0 变 1,这可以直接用如下操作,其它位不变。


本文为CSDN博主 Sumjess 原创文章,
遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:
https://blog.csdn.net/qq_38351824/article/details/104157958

围观 152
订阅 RSS - STM32F429