首页 > 其他分享 >【嵌入式系统】存储器映射与寄存器映射原理

【嵌入式系统】存储器映射与寄存器映射原理

时间:2022-11-18 11:59:18浏览次数:68  
标签:映射 存储器 嵌入式 地址 GPIOA 寄存器 CRL

嵌入式系统】存储器映射与寄存器映射原理

一、存储器映射

在这里插入图片描述

图1 存储器映射

存储器在产家制作完成后是一片没有任何信息的物理存储器,而CPU要进行访存就涉及到内存地址的概念,因此存储器映射就是为物理内存按一定编码规则分配地址的行为。值得注意,存储器映射一般是由产家规定,用户不能随意更改。
在这里插入图片描述

图2 STM32芯片存储器映射

注1

STM32中,I-Code Bus与D-Code Bus默认映射到0x00000000 ~ 0x1FFFFFFF内存地址段;AHB系统总线默认映射到0x20000000 ~ 0xDFFFFFFF和0xE0100000 ~ 0xFFFFFFFF两个内存地址段;APB外设总线默认映射到0xE0040000 ~ 0xE00FFFFF内存地址段,但由于TPIU、ETM以及ROM表占用部分空间,实际可用地址区间为0xE0042000~0xE00FF000

二、寄存器映射

寄存器映射是在存储器映射的基础上进行的。

以STM32为例,操作硬件本质上就是操作寄存器。在存储器片上外设区域,四字节为一个单元,每个单元对应不同的功能。当我们控制这些单元时就可以驱动外设工作,我们可以找到每个单元的起始地址,然后通过C 语言指针的操作方式来访问这些单元。但若每次都是通过这种方式访问地址,不好记忆且易出错。这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名实质上就是寄存器名字。给已分配好地址(通过存储器映射实现)的有特定功能的内存单元取别名的过程就叫寄存器映射
在这里插入图片描述

图3 寄存器映射

下面以GPIO寄存器CRL为例,先给出CRL定义如下:

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->CRL=0x0000 0000这种写法,表示将16进制数0赋值给GPIOA的CRL寄存器所在的存储单元。而GPIOA->CRL就构造了一个寄存器映射。具体过程如下:

#define PERIPH_BASE      ((uint32_t)0x40000000) 

这里属于存储器级别的映射,将外设基地址映射到0x40000000,可对应图2

#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)

这里对外设基地址进行偏移量为0x10000的地址偏移,偏移到APB2总线对应外设区。

#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)

这里对APB2外设基地址进行偏移量为0x0800的地址偏移,偏移到GPIOA对应区域。

#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)

这里将GPIOA宏定义为GPIOA基地址经过强制类型转换为GPIO_TypeDef的指针,这样的作用是使GPIOA结构体内对应的成员按顺序填充内存区域,如图3所示。因此GPIOA的CRL寄存器就是作为GPIOA基地址后的第一个内存块,GPIOA->CRL的本质就是这个内存块的地址,或者说是用GPIOA->CRL给这个地址取了个形象的别名,即寄存器映射。



 

标签:映射,存储器,嵌入式,地址,GPIOA,寄存器,CRL
From: https://www.cnblogs.com/amxiang/p/16902730.html

相关文章

  • 嵌入式linux实现pppoe拨号上网
    makemenuconfig->DeviceDrivers->Networkdevicesupport->PPP(point-to-pointprotocol)中,选中所有ppp选项。退出,保存配置,修改Makefile重新执行makezImage.将a......
  • vue 项目源码映射失败问题解决
    目录vue项目源码映射失败问题解决前言解决方案效果参考vue项目源码映射失败问题解决前言不知何时起,项目控制台调试进入源代码变成编译后的文件了,调试起来十分不便,强迫......
  • 《安富莱嵌入式周报》第291期:分分钟设计数字芯片,单片机版JS,神经网络DSP,microPLC,FatFS
    往期周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版:https://www.bilibili.com/video/BV1Dd4y1b74x1、英......
  • 中断控制寄存器的说明/临界区的进出
    中断控制寄存器对中断的屏蔽与否,通过一下控制寄存器决定 简单来说就是PRIMASK只留了个NMI(不可屏蔽异常,一般是系统出错)和硬件异常;FAULTMASK只留了个硬件异常......
  • 本地电脑做网站服务器,无需公网IP穿透映射80端口
    在大内网IP环境下,使用本地电脑做网站服务器,首先要解决的是没有公网IP,外网用户如何能够正常访问到本地网站的问题。在没有公网IP的情况下,想要实现外网访问内网,可以通过cpol......
  • 搞嵌入式,为什么一定要学RTOS?
    学习RTOS,一是项目需要,随着产品要实现的功能越来越多,单纯的裸机系统已经不能完美地解决问题,反而会使编程变得更加复杂,如果想降低编程的难度,就必须引入RTOS实现多任务管理。......
  • 嵌入式Linux单板连接飞燕物联网平台
    大家好,我是杂烩君。最近,我们的设备连接的云平台需要切到阿里的飞燕平台,做个笔记记录下。阿里的物联网平台有好几个:物联网平台生活物联网平台(飞燕平台)城市物联网平台它们的应......
  • 8086寄存器结构例题【微机原理】
    8086寄存器结构应用例题【微机原理】​​前言​​​​8086寄存器结构应用例题​​​​1、通用寄存器​​​​1)数据寄存器AX、BX、CX、DX​​​​ax应用例题​​​​bx应用......
  • 内存映射MMF
    usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.IO.MemoryMappedFiles;usingSystem.Linq;usingSystem.Text;namespa......
  • 嵌入式-Linux基础:Windows和Linux间的文件传输方式
    首先必须安装VMWare里面的VmWareTool(1)拖拽方式:安装完之后就可以通过拖拽的方式将Windows的文件移到虚拟机里了,同样虚拟机里的也可以拖拽到Windows中。(2)设置共享文件夹......