6存储器与寄存器介绍

Posted zhb123456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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来封装寄存器的。
 

以上是关于6存储器与寄存器介绍的主要内容,如果未能解决你的问题,请参考以下文章

计算机基础之——计算机硬件

80X86寄存器介绍

寄存器与存储器

存储器与寄存器的差别

ARM寄存器与汇编指令详解

Android so文件