STM32存储器映射

嵌入式学习 - ARM体系结构
嵌入式学习 - STM32存储器映射
嵌入式学习 - STM32F4启动分析

STM32, 从字面上来理解,ST是意法半导体,M是Microelectronics的缩写,32表示32位,合起来理解,STM32就是指ST公司开发的32位微控制器

STM32产品命名规范

STM32的应用

STM32的应用于可穿戴、物联网、无人机、工业控制、医疗电子、汽车电子、电力系统、石油系统、燃气系统 ...等等领域。


STM32产品介绍

STM32F4体系架构

STM32F407采用的是Cortex-M4内核,内核即CPU,由ARM公司设计。ARM公司并不生产芯片,而是出售其芯片技术授权。芯片生产厂商(SOC)如ST、TI、Freescale, 负责在内核之外设计部件并生产整个芯片,这些内核之外的部件被称为核外外设或片上外设SoC。如GPIO、USART(串口)、I2C、SP等都叫做片上外设。

STM32F4存储器映射

32位系统下,每个进程的寻址范围是4G,即0x00 00 00 00 ~ 0xff ff ff ff
SoC上被控单元的FLASH, RAM和各类片上外设,这些功能部件的内存空间,共同排列在一个4GB的地址空间内,每个外设都有自己独有地址。我们在编程的时候,可以通过他们的地址找到这些外设,然后来操作他们;

存储器本身没有地址,给存储器分配地址的过程叫存储器映射;如果给存储器再分配一个地址就叫存储器重映射存储器映射就是为物理内存按一定编码规则分配地址的行为。

在下图Memory Map中的 8 个Block 里面,有 3 个块非常重要,也是我们最关心的三个块。 Block0用来设计成内部 FLASHBlock1用来设计成内部 RAMBlock2用来设计成片上的外设

STM32F4寄存器映射

寄存器映射基础上,给有特定功能的内存单元(外设)取别名的过程就叫寄存器映射

STM32F4为例,在存储器片上外设区域(存储器功能分类中Block2),内部以4字节为一个单元,每个单元对应不同的功能,且有对应的起始地址

操作硬件本质上就是操作寄存器。我们操作这些有特定功能的内存单元就可以控制外设工作;即找到特定功能单元的起始地址,通过C语言指针操作外设内存单元,从而实现对外设的控制

为了更便捷直接的访问每个内存单元的起始地址,我们根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名实质上就是寄存器名字。给已分配好地址(通过存储器映射实现)的有特定功能的内存单元取别名的过程就叫寄存器映射

STM32F4寄存器的访问

以访问GPIOA寄存器组、读写ORD寄存器为例,可在下图中文参考文档STM32F4xx 寄存器边界地址(续)了解到GPIOA 端口置位/复位功能的起始地址为:0x4002 0000

STM32F4xx中文参考手册.存储器映射

GPIOA各寄存器的偏移地址

MODER; //Address offset:0x00
OTYPER; //Address offset:0x04
OSPEEDR; //Address offset:0x08
PUPDR; //Address offset:0xOC
IDR; //Address offset:0x10
ODR; //Address offset:0x14
BSRR; //Address offset:0x18
LCKR; //Address offset:0x1C
:每一组GPIO端口都有一套上述的寄存器去配置它自己的功能(STM32F4xx中文参考手册-GPIO)

读、写ORD寄存器
//对地址进行宏定义
#define GPIOA_BASE (unsigned int 0x40020000)
#define GPIOA_ODR  (GPIOA_BASE +0x14)
//读操作
val = *(unsigned int *)GPIOA_ODR;
//写操作
*(unsigned int *)GPIOA_ODR = val;

//改进
#define GPIOA_ODR (*(unsigned int *)GPIOA_BASE + 0x14 )
val = GPIOA_ODR; //读
GPIO_ ODR=val; //写
/* 用结构体封装寄存器
根据每一类外设对应的寄存器组地址都是连续增长的特点,引入C语言中的结构体语法对寄存器进行封装。
我们访问GPIOA的控制寄存器组时,直接使用宏定义好GPIO_TypeDef类型的指针,指针指向GPIOA端口的首地址,这样我们直接用宏GPIOA访问该外设的任意一个寄存器。
注:“stm32f407xx.h”已经封装了所有的外设访问

// -- 寄存器的访问 --
GPIOA->MODER = 0x20;
GPIOA->OSPEEDR = 0x16; 
*/
typedef struct {
uint32_t        MODER;      /*Address offset: 0x00 */
uint32_t        OTYPER;     /*Address offset: 0x04 */
uint32_t        OSPEEDR;    /*Address offset: 0x08 */
uint32_t        PUPDR;      /*Address offset: 0x0C */
uint32_t        IDR;        /*Address offset: 0x10 */
uint32_t        ODR;        /*Address offset: 0x14 */
uint32_t        BSRR;       /*Address offset: 0x18 */
uint32_t        LCKR;       /*Address offset: 0x1C */
} GPIO_TypeDef;

#define     GPIOA_BASE        ( (unsigned int ) 0x40020000 )
#define     GPIOA    ((GPIO_TypeDef *) GPIOA_BASE)

写在最后:

STM32开发环境搭建、存储器映射、启动流程分析
STM32寄存器映射
STM32 F4 存储结构
玩转STM32(13)存储空间的开始地址

STM32F4x7-Datasheet.pdf
STM32F4xx中文参考手册.pdf
STM32F407IGT核心板原理图.pdf

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容