6、存储器与寄存器介绍

本讲主要内容

1.什么是存储器映射
  2.什么是寄存器及寄存器映射
  3.如何访问STM32寄存器内容

1.什么是存储器映射
   存储器本身不具有地址信息,它的地址是由芯片厂商或
用户分配,给存储器分配地址的过程称为存储器映射,如果
再分配一个地址就叫重映射(具体地址分配参考芯片数据手
册及中文参考手册)

2.什么是寄存器及寄存器映射
 通过给有特定功能的内存单元起一个别名,这个别名就是
我们所说的寄存器。给已经分配好地址的有特定功能的内存
单元起别名的过程就叫寄存器映射

3.如何访问STM32寄存器内容
 我们知道寄存器就是一些有特定功能的内存单元,所以要
访问STM32寄存器也就是操作STM32的内存单元,根据C语言
指针的特点,可以使用指针来操作STM32的内存单元。
   假如我们要让STM32的GPIOC的第0管脚输出低电平,我
们怎么使用C语言来处理?
   首先我们要知道GPIOC挂接在哪个总线上,需要知道其地
址,STM32总线地址如下:

所以使用C语言宏可以定义外设基地址:
#define PERIPH_BASE ((unsigned int)0x40000000)
然后分别定义APB2总线基地址:
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)

然后还需要知道端口外设地址,
同样使用C语言宏定义其端口地址:
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)

有了外设端口地址后,还需要知道GPIOC端口的寄存器地址,
如下表格:

同样使用C语言宏定义其端口寄存器地址:

#define GPIOC_CRL           *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH           *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR           *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR           *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR           *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR           *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR           *(unsigned int*)(GPIOC_BASE+0x18)

控制 GPIOC 引脚 0 输出低电平(即通过BSRR 寄存器的 BR0
置 1)
GPIOC_BSRR = (0x01<<(16+0));
控制 GPIOC 引脚 0 输出高电平(即通过BSRR 寄存器的 BS0
置 1)
GPIOC_BSRR = 0x01<<0;

读取GPIOC端口所有引脚的电平(读 IDR 寄存器)
unsigned int temp;
temp = GPIOC_IDR;

我们这里仅仅以GPIO这个外设为例,给大家讲解了如何
使用C语言对寄存器封装的,对于其他的外设也是使用同样
方法。其实到了后面的实验程序的编写时,我们都是使用ST
公司提供的固件库,他把STM32所有外设都已经封装好了,
我们这里分析这个封装过程只是想让大家更加清楚理解如何
使用C来封装寄存器的。

原文地址:https://www.cnblogs.com/zhb123456/p/10494981.html

时间: 2024-10-10 03:34:07

6、存储器与寄存器介绍的相关文章

嵌入式C语言开发---存储器与寄存器

概述: 讲述如何使用C语言来对底层寄存器进行封装 内容: 存储器映射 寄存器与寄存器映射 C语言访问寄存器 存储器映射 程序存储器.数据存储器.寄存器和I/O 端口排列在同一个顺序的4 GB 地址空间内 存储器映射: 存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射. 存储器区域划分 ARM 将这4GB 的存储器空间,平均分成了8 块区域,每块区域的大小是512MB,这个容量是非常大的,因此芯片厂商就在每块容量范围内设计

80X86寄存器介绍

80X86寄存器介绍 32位CPU所含有的寄存器有: 4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES.CS.SS.DS.FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1.数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间. 32位CPU有4个32位的通用寄存器EAX.EBX.ECX和EDX.对低16位数据的存取,不会影响高

STM32 BKP备份寄存器介绍

1.  BKP可以用来保存数据 BKP中包括了42个16位的寄存器,共可保存84字节的内容,它们由VBAT的供电来维挂. 2.  BKP内保存的数据可以被毁灭(如果有人希望恶意得到这些数据的话,令其丢失比保护数据更重要).STM32提供了一种称之为TAMPER的机制来完成.中文译为“侵入检测”,这需要占用一个外部引脚(PC13). 3.  如果不用侵入检测功能,那么这个外部引脚可以用作RTC校准功能,这个稍后再研究. 4.  当有系统复位/电源复位/待机模式下被唤醒这三种情况时,BKP中的值不会

存储器与寄存器的差别

存储器在CPU外,一般指硬盘,U盘等可以在切断电源后保存资料的设备,容量一般比较大,缺点是读写速度都很慢,普通的机械硬盘读写速度一般是 50MB/S左右.内存和寄存器就是为了解决存储器读写速度慢而产生的多级存储机制,从20世纪50年代开始,磁芯存储器曾一度成为主存的主要存储介质, 但从20世纪70年代开始,逐步被半导体存储器所取代,目前的计算机都是用半导体存储器.现在的DDR2内存的读写速度一般为6~8GB/S,跟机器性能 也有关系.    而寄存器(又称缓存)一般是指由基本的RS触发器结构衍生

ARM寄存器介绍

ARM处理器共有37个寄存器.其中包括:31个通用寄存器,包括程序计数器(PC)在内.这些寄存器都是32位寄存器.以及6个32位状态寄存器.但目前只使用了其中12位.ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组.任意时刻(也就是任意的处理器模式下),可见的寄存器包括15个通用寄存器(R0-R14).一个或两个状态寄存器及程序计数器(PC).在所有的寄存器中,有些是各模式共用的同一个物理寄存器:有一些寄存器是各模式自己拥有的独立的物理寄存器.表1列出了各处理器模式

Arm处理器寄存器介绍及汇编基础

1. ARM处理器支持7种工作模式 · User (usr): The normal ARM program execution state· FIQ (fiq): Designed to support a data transfer or channel process· IRQ (irq):    Used for general-purpose interrupt handling· Supervisor (svc):   Protected mode for the operating

寄存器介绍

x86-64的所有寄存器都是与机器字长(数据总线位宽)相同,即64位的,x86-64将x86的8个32位通用寄存器扩展为64位(eax.ebx.ecx.edx.eci.edi.ebp.esp),并且增加了8个新的64位寄存器(r8-r15),在命名方式上,也从”exx”变为”rxx”,但仍保留”exx”进行32位操作,下表描述了各寄存器的命名和作用. 描述 32位 64位 通用寄存器组 eax rax ecx rcx edx rdx ebx rbx esp rsp ebp rbp esi rsi

modbus 寄存器介绍

modbus 的查询命令 命令 地址开始(两个地址)     地址长度(两个地址)          检验 01  xx     xx xx                                xx xx                              xx xx modbus 设置命令 命令           地址                              值 检验 01    06            00 04                   

CPU 寄存器

CPU 寄存器 寄存器是中央处理器内的组成部分,是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和地址.在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC). 寄存器是集成电路中非常重要的一种存储单元,通常由D触发器组成.在集成电路设计中,寄存器可分为电路内部使用的寄存器和充当内外部接口的寄存器这两类.内部寄存器不能被外部电路或软件访问,只是为内部电路的实现存储功能或满足电路的时序要求.而接口寄存器可以同时被内部电路和外部电路或软件访问,CPU中的寄存器就是其中一