STM32存储器映射以及寄存器映射

这篇具有很好参考价值的文章主要介绍了STM32存储器映射以及寄存器映射。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.STM32的寻址范围?

2.存储器映射

3.存储器功能划分(以STM32F1为例)

4.寄存器映射


1.STM32的寻址范围?

1.32位单片机有32根地址线,每根地址线有两种状态,导通或者不导通。

2.单片机内存地址访问的存储单元是按字节编址的,而不是bit。

比如我们要访问0x01这个地址,访问的其实是一个字节的空间,而不是一个bit的空间。

地址线 地址编号 地址编号数
1 0,1 2
2 00,01,10,11 4
3 000,001,010,011,100,101,110,111 8
...... .............. .......
n ....... 2^n

比如,现在有一根地址线,那么这一根地址线就有两种状态,导通或者不导通,就可以访问两个字节的地址空间,那么有两根地址线的话就有四种状态,两根都不导通,第一根导通第二根不导通,第一根不导通第二根导通,两个呢都导通,所以我们有n根地址线的话就有2的n次方种状态。

STM32寻址大小:2^32次方 = 4G(字节)

STM32寻址范围: 0x0000 0000 ~ 0xFFFF FFFF

2.存储器映射

存储器指的是可以存储数据的设备,存储器本身没有地址信息,对存储器分配地址的过程称为存储器映射。

地址范围:0~512K

映射1:0K~512K

映射2:1K~512K+1

映射3:100K~612K

映射4:512K~1024K

3.存储器功能划分(以STM32F1为例)

ST将2^32次方地址空间划分成8个块

存储块 功能 地址范围
Block 0 Code(GLASH) 0x0000 0000 ~ 0x1FFFF FFFF(512MB)
Block 1 SRAM 0x2000 0000 ~ 0x3FFFF FFFF(512MB)
Block 2 片上外设 0x4000 0000 ~ 0x5FFFF FFFF(512MB)
Block 3 FSMC Bank1&2 0x6000 0000 ~ 0x7FFFF FFFF(512MB)
Block 4 FSMC Bank3&4 0x8000 0000 ~ 0x9FFFF FFFF(512MB)
Block 5 FSMC寄存器 0xA000 0000 ~ 0xBFFFF FFFF(512MB)
Block 6 保留 0xC000 0000 ~ 0xDFFFF FFFF(512MB)
Block 7 Cortex M3内部外设 0xE000 0000 ~ 0xFFFFF FFFF(512MB)

我们重点学习前三个块,下面就介绍前三个块分别有什么内容,以及对应的地址是多少。

Block0 (FLASH) 功能划分:

存储块 功能 地址范围
Block 0 FLASH或系统存储器别名区 0x0000 0000 ~ 0x0007 FFFF (512KB)
保留 0x0008 0000 ~ 0x07FF FFFFc
用户FLASH,用于存储用户代码 0x0800 0000 ~ 0x0807 FFFF (512KB)
保留 0x0808 0000 ~ 0x1FFF FFFF
系统存储器,存储出厂Bootloader 0x1FFF F000 ~ 0x1FFF F7FF (2KB)
选项字节,配置读保护等 0x1FFF F800 ~ 0x1FFF F80F (16B)
选项字节,配置读保护等 0x1FFF F810 ~ 0x1FFF FFFF

Block 1 (SRAM) 功能划分:

存储块 功能 地址范围
Block 1 SRAM 0x2000 0000 ~ 0x2000 FFFF  (64KB)
保留 0x2001 0000 ~ 0x3FFF FFFF

Block 2 (外设) 功能划分:

存储块 功能 地址范围
Block 2 APB1总线外设 0x4000 0000 ~ 0x4000 77FF
保留 0x4000 7800 ~ 0x4000 FFFF
APB2总线外设 0x4001 0000 ~ 0x4000 3FFF
保留 0x4001 4000 ~ 0x4001 7FFF
AHB总线外设 0x4001 8000 ~ 0x4002 33FF
保留 0x4002 3400 ~ 0x5FFF FFFF

4.寄存器映射

寄存器基础知识

寄存器是单片机内部一种特殊的内存,可以实现对单片机各个功能的控制

简单来说:寄存器就是单片机内部的控制机构

STM32寄存器分类

大类 小类 说明
内核寄存器 内核相关寄存器 包含R0~R15,xPSR,特殊功能寄存器等
中断控制寄存器 包含NVIC和SCB相关寄存器,NVIC有:ISER,ICER,ISPR,IP等;SCB有:VTOR,AIRCR,SCR等
SysTick寄存器 包含CTRL,LOAD,VAL和CALIB四个寄存器
内存保护寄存器 可选功能,STM32F103没有
调试寄存器 ETM,ITM,DWT,IPIU等相关寄存器
外设寄存器 包含GPIO,UART,IIC,SPI,TIM,DMA,ADC,DAC,RTC,I/WWDG,PWR,CAN,USB等各种外设寄存器

寄存器映射(F1为例)

寄存器是特殊的寄存器,给寄存器地址命名的过程,就叫做寄存器映射

2.请简述stm32f1xx的存储空间组织被映射为那几个主要的部分,它们各自对应了那,嵌入式,stm32,嵌入式硬件,单片机

寄存器描述解读

2.请简述stm32f1xx的存储空间组织被映射为那几个主要的部分,它们各自对应了那,嵌入式,stm32,嵌入式硬件,单片机

摘自:STM32F10xxx参考手册_V10(中文版)

寄存器映射举例

直接操作寄存器

*(unsigned int *)(0x4001 080c) = 0XFFFF;

定义一个名字后再操作

#define GPIOA_ODR *(unsigned int *)(0x4001 080c)
GPIOA_ODR = 0XFFFF;

 寄存器地址计算

为了方便编写代码及使用,我们将寄存器地址分为三个部分:

1.总线基地址(BUS_BASE_ADDR)

2.外设基于总线基地址的偏移量(PERIPH_OFFSET)

3.寄存器相对外设基地址的偏移量(REG_OFFSET)

寄存器地址=BUS_BASE_ADDR+PERIPH_OFFSET+REG_OFFSET

总线基地址

总线 基地址 偏移量
APB1 0X4000 0000 0
APB2 0X4001 0000 0X1 0000
AHB 0X4001 8000 0X1 8000

 2.请简述stm32f1xx的存储空间组织被映射为那几个主要的部分,它们各自对应了那,嵌入式,stm32,嵌入式硬件,单片机

摘自:STM32F103xCDE数据手册

APB1总线基地址也叫外设基地址(PERIPH__BASE)

此表的偏移量:是相对外设基地址(PERIPH_BASE)来说的

参考资料:STM32F10xxx参考手册_V10(中文版).pdf 2.3小节

GPIO外设基地址偏移量

所属总线 外设 基地址 偏移量
 APB2 0X4001 0000 GPIOA 0X4001 0800 0X800
GPIOB 0X4001 0C00 0XC00
GPIOC 0X4001 1000 0X1000
GPIOD 0X4001 1400 0X1400
GPIOE 0X4001 1800 0X1800
GPIOF 0X4001 1C00 0X1C00
GPIOG 0X4001 2000 0X2000

此表的偏移量:是相对APB2外设基地址(APB2PERIPH_BASE)来说的

GPIOA外设基地址及偏移量

所属总线 所属外设 寄存器 地址 偏移量
  APB2      0X4001 0000  GPIOA 0X4001 0800 GPIOA_CRL 0X4001 0800 0X00
GPIOA_CRH 0X4001 0804 0X04
GPIOA__IDR 0X4001 0808 0X08
GPIOA_ODR 0X4001 080C 0X0C
GPIOA_BSRR 0X4001 0810 0X10
GPIOA_BRR 0X4001 0814 0X14
GPIOA__LCKR 0X4001 0818 0X18

此表的偏移量:是相对GPIOA外设基地址(GPIOA_BASE)来说的

GPIOA_ODR寄存器地址计算过程:

1.获取外设挂载在哪个总线上面?查:系统结构图

2.获取总线基地址,APB2总线基地址:0X4001 0000

3.获取外设地址偏移量,GPIOA相对APB2总线偏移量是:0X800

4.获取寄存器地址偏移量,ODR相对GPIOA外设基地址的偏移量是:0X0C

寄存器地址=BUSBASEADDR+PERIPHOFFSET+REGOFFSET

GPIOA_ODR=0X4001 0000+0X800+0X0C=0X4001 080C

使用结构体,可以很方便的完成对寄存器的映射:

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;

GPIOA_BASE: 0X4001 0800
  

#define GPIOA ((GPIO_Typedef*)GPIOA_BASE)
&GPIOA->CRL: 0X4001 0800
&GPIOA->CRL: 0X4001 0804
&GPIOA->CRL: 0X4001 0808
&GPIOA->CRL: 0X4001 080C
实际应用:
GPIOA->ODR = 0XFFFF;

//详见:stm32f103xe.h,725行开始

stm32f103xe.h主要组成部分

主要组成部分 说明
中断编号定义 定义IRQn_Type枚举类型,包含STM32F103内部所有中断编号(中断号),方便后续编写代码
外设寄存器结构体类型定义 以外设为单位,使用结构体类型定义每个外设所有寄存器,方便寄存器映射
寄存器映射

1.定义总线地址和外设基地址                

2.使用外设结构体类型定义将外设基地址强制转换成结构体指针,完成寄存器映射文章来源地址https://www.toymoban.com/news/detail-856174.html

寄存器位定义 定义外设寄存器每个功能位的位置及掩码
外设判定 判断某个外设是否合法(即是否存在该外设)

到了这里,关于STM32存储器映射以及寄存器映射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包