stm32第一节:认识寄存器
初识STM32
STM32芯片架构
Cortex-M3内核(arm)——(I,S,D)——总线矩阵——外设,Flash,SRAM
外设——GPIO,USART,12C,SPI……
Flash及SRAM储存
Flash——常量
SRAM——变量
DMA作用
DMA解决了数据传输需要经过CPU的问题。使用DMA可以使CPU闲置下来,从而实现 更高的效率。
寄存器
储存器分类及其地址(blockx(x=0~7))
32位操作系统,共为2^32=4GB空间,平均分给8个储存器Block0~7。
Block 0 Code 0x0000 0000 ~ 0x1FFF FFFF(512MB)
Block 1 SRAM 0x2000 0000 ~ 0x3FFF FFFF(512MB)
Block 2 片上外设 0x4000 0000 ~ 0x5FFF FFFF(512MB)
Block 3 FSMC的bank1 ~ bank2 0x6000 0000 ~ 0x7FFF FFFF(512MB)
Block 4 FSMC的bank3 ~ bank4 0x8000 0000 ~ 0x9FFF FFFF(512MB)
Block 5 FSMC寄存器 0xA000 0000 ~ 0xCFFF FFFF(512MB)
Block 6 没有使用 0xD000 0000 ~ 0xDFFF FFFF(512MB)
Block 7 Cortex-M3 内部外设 0xE000 0000 ~ 0xFFFF FFFF(512MB)
什么是储存器映射
给储存器分配地址的过程称为储存器映射,再次分配地址叫做重映射。
什么是寄存器
给有特定功能的内存单元取一个别名,取其别名为寄存器。
什么是寄存器映射
给有特定功能的,已经分配好地址的内存单元取别名的过程就叫寄存器映射。
eg1:让GPIO端口的16个引脚输出高电平,如何实现?
通过绝对地址访问内存单元
1 // GPIOB 端口全部输出高电平
2 *(unsigned int*)(0x4001 0c0c)=0xFFFF;
系统无法识别0x4001 0c0c。要将其转为int类型的指针变量,然后再将指针变量再 次转化为指针地址。那么,通过51单片机的学习,我们知道,可以使用宏定义对该 指令进行改进:
1 #define GPIOB_ODR *(unsigned int*)(0x4001 0c0c)
2 GPIOB_ODR =0xFFFF;
STM32寄存器映射
基线总地址
APB1 0x4000 0000 相对偏移 0x0
APB2 0x4001 0000 相对偏移 0x0001 0000
AHB 0x4001 8000 相对偏移 0x0001 8000
eg2:GPIO基地址
外设基地址 0x4000 0000。GPIOx,随着x的增加,就多占用8个字节的空间内存。
GPIOA 0x4001 0800
GPIOB 0x4001 0c00
…… ……
GPIOG 0x4001 2000
C语言对寄存器的封装
总线和外设基地址宏定义:
# define PERIPH_BASE ((unsigned int) 0x4000 0000)
# define APB1_BASE PERIPH_BASE
#define APB2_BASE (PERIPH_BASE+0x0001 0000)
#define AHB_BASE (PERIPH_BASE+0x0002 0000)
+外设偏移地址
+寄存器偏移地址
PB0输出高低电平:
GPIOB-ODR&=~(1<<0); 低电平
GPIOB-ODR |=(1<<0); 高电平
总结
本节课主要是认识寄存器。包括认识STM32的芯片架构以及各部分之间的作用,包括储存器分类及其地址,储存器的映射及重映射,寄存器的映射,基线总地址,外设基地址及其宏定义以及如何输出高低电平,下节课认识使用结构体封装寄存器列表,还有使用寄存器编写程序。