嵌入式学习 - ARM体系结构
嵌入式学习 - STM32存储器映射
嵌入式学习 - STM32F4启动分析
STM32
, 从字面上来理解,ST
是意法半导体,M
是Microelectronics的缩写,32
表示32位,合起来理解,STM32
就是指ST公司开发的32位微控制器
。
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
用来设计成内部 FLASH
,Block1
用来设计成内部 RAM
,Block2
用来设计成片上的外设
。
STM32F4寄存器映射
在
寄存器映射
基础上,给有特定功能的内存单元(外设)
取别名的过程就叫寄存器映射
。以
STM32F4
为例,在存储器片上外设区域(存储器功能分类中Block2
),内部以4字节为一个单元,每个单元对应不同的功能,且有对应的起始地址
。
操作硬件本质
上就是操作寄存器
。我们操作这些有特定功能的内存单元就可以控制外设工作;即找到特定功能单元的起始地址
,通过C语言指针
操作外设内存单元
,从而实现对外设的控制
。为了更便捷直接的访问每个内存单元的起始地址,我们根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名实质上就是寄存器名字。给已分配好地址(通过存储器映射实现)的有特定功能的内存单元取别名的过程就叫
寄存器映射
。
STM32F4寄存器的访问
以访问
GPIOA
寄存器组、读写ORD
寄存器为例,可在下图中文参考文档STM32F4xx 寄存器边界地址(续)
了解到GPIOA 端口置位/复位功能的起始地址为:0x4002 0000
。
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