Cortex M内核 & 芯片
F407系统架构
注:64KB CCM(内核耦合存储器)数据 RAM不属于总线矩阵,只能存数据,不支持DMA,但访问速度快
总线矩阵:总线矩阵用于主控总线之间的访问仲裁管理。仲裁采用循环调度算法。
8条主控总线
1. S0: I-BUS
此总线用于将 Cortex™-M4F 内核的指令总线连接到总线矩阵。内核通过此总线获取指令。 此总线访问的对象是包含代码的存储器(内部 Flash/SRAM 或通过 FSMC 的外部存储器)。
2. S1: D-BUS
此总线用于将 Cortex™-M4F 数据总线和 64 KB CCM 数据 RAM 连接到总线矩阵。内核通过此总线进行立即数加载和调试访问。此总线访问的对象是包含代码或数据的存储器(内部Flash 或通过 FSMC 的外部存储器)。
3. S2: S-BUS
此总线用于将 Cortex™-M4F 内核的系统总线连接到总线矩阵。此总线用于访问位于外设 或 SRAM 中的数据。也可通过此总线获取指令(效率低于ICode)。此总线访问的对象是 112 KB、64 KB 和 16 KB 的内部 SRAM、包括 APB 外设在内的 AHB1 外设、AHB2 外设以 及通过 FSMC 的外部存储器。
4. S3\S4: DMA存储器总线
此总线用于将 DMA 存储器总线主接口连接到总线矩阵。DMA 通过此总线来执行存储器数据的传入和传出。此总线访问的对象是数据存储器:内部 SRAM(112 KB、64 KB、16 KB) 以及通过 FSMC 的外部存储器。
5. S5: DMA外设总线
此总线用于将 DMA 外设主总线接口连接到总线矩阵。DMA 通过此总线访问 AHB 外设或执 行存储器间的数据传输。此总线访问的对象是 AHB 和 APB 外设以及数据存储器:内部 SRAM 以及通过 FSMC 的外部存储器。
6. S6: 以太网总线
此总线用于将以太网 DMA 主接口连接到总线矩阵。以太网 DMA 通过此总线向存储器存取 数据。此总线访问的对象是数据存储器:内部 SRAM(112 KB、64 KB 和 16 KB)以及通过 FSMC 的外部存储器。
7. S7: USB\OTG\HS\DMA总线
此总线用于将 USB OTG HS DMA 主接口连接到总线矩阵。USB OTG DMA 通过此总线向存储 器加载/存储数据。此总线访问的对象是数据存储器:内部 SRAM(112 KB、64 KB 和 16 KB) 以及通过 FSMC 的外部存储器。
AHB/APB 总线桥:借助两个 AHB/APB 总线桥 APB1 和 APB2,可在 AHB 总线与两个 APB 总线之间实现完全 同步的连接,从而灵活选择外设频率。
总线时钟频率:
AHB1/2: 168MHz
APB1: 42MHz
APB2: 84MHz
F407存储器映射
寻址范围
- 32位的单片机有32根地址线,每根地址线有两种状态(导通1/不导通0)
- 单片机单片机内存地址访问的存储单元是按字节编址的(而不是bit)
STM32寻址大小:2^32 = 4G
STM32寻址范围:0x0000 0000 ~ 0xFFFF FFFF
存储器映射
存储器本身没有地址信息,对存储器分配地址的过程称为存储器映射。
ST将4GB(2^32)地址空间分成8个块,每个块512M
F407寄存器映射
寄存器是单片机内部一种特殊的内存,可以实现对单片机各个功能的可控制。给寄存器地址命名的过程,就叫寄存器映射。
STM32寄存器分类
寄存器描述解读
①寄存器名字
②偏移量及复位值
偏移量针对外设的基地址
③寄存器位表
④位功能描述
寄存器操作举例
*(unsighed int*)(0x4001 080C) = 0xFFFF;
#define GPIOA_ODR *(unsighed int*)(0x4001 080C)
GPIOA_ODR = 0xFFFF;
如何计算寄存器地址
首先将寄存器地址分为三个部分
- 总线基地址(BUS_BASE_ADDR)
APB1总线基地址也叫做外设基地址(PERIPH_BASE)
2. 外设基于总线基地址的偏移量(PERIPH_OFFSET)
3. 寄存器相对于外设基地址的偏移量(REG_OFFSET)
寄存器地址 = BUS_BASE_ADDR + PERIPH_OFFSET + REG_OFFSET
使用结构体对寄存器进行映射
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
#define GPIOA ((GPIO_TypeDef*)GPIOA_BASE)
GPIOA-> ODR = 0xFFFF;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)