当前位置:   article > 正文

单片机外设(ram、寄存器)地址详解_mcu与fpga寄存器地址

mcu与fpga寄存器地址

外设与内设

在学习汇编语言时,我们会接触到一些寄存器,比如R0、R1、还有栈指针寄存器SP、下一条指令寄存器PC 等等。这些寄存器是存在于内核(如CPU)之内的,这些寄存器是我们无法通过c语言访问到的,而只能用汇编语言操作。因此区别于可以用C语言访问的外部寄存器,这些寄存器可以称之为内部寄存器。

汇编语言的强大之处便在于其不但可以访问内部寄存器,还可以读写外部寄存器。因此在单片机引导程序建立了c语言的运行环境之后,便可以通过c语言指针的方式访问外部寄存器。在内核之外的所有设备都是通过总线连接到内核(CPU)上的,通过对总线寻址,加上外设的偏移地址后便可以准确地访问到相关的寄存器。

我们可以把内存也看作是外部寄存器,区别只是它是连续的一片存储单元,因此具有连续的一片地址。但本质上两者是一样的,都是通过总线地址访问的。

下面首先转载别人的一篇博客说明单片机外部寄存器的地址映射,在之后转载一篇讲解单片机总线结构的博客,如果对总线不清楚的可以先看看后一篇博客。这里需要补充的首先是,所谓映射,实际上就是说可以用C语言指针的方式访问数据。因为在计算机中c语言指针一般访问的是内存,所以这里也就叫做了寄存器地址映射为内存地址,但本质上两者都是总线地址上的不同地址范围。

另一方面要强调的就是C语言指针的用法:

#define GPIOB_ODR_ADDRESS  0x10000
*GPIOB_ODR_ADDRESS = 1;
  • 1
  • 2

就是说将地址为GPIOB_ODR_ADDRESS的寄存器(或ram上的一个存储单元)赋值为1。而如果先定义一个变量int a = 0;然后a = 1;赋值,表示的就是计算机从堆栈中取出变量a的地址,然后寻址到该存储单元(此时必然是寻址到ram),然后修改内存单元。在这里我们也看出,直接使用指针的速度必然快于变量。

最后要说明的就是#define,这是在编译时期就将宏定义复制到代码之中了,因此不会影响程序运行时的快慢。

单片机STM32学习笔记之寄存器映射详解

原文地址:https://www.cnblogs.com/923327iu/p/12095094.html

  在存储器Block2 这块区域,设计的是片上外设,它们以四个字节为一个单元,共32bit,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到每个单元的起始地址,然后通过C 语言指针的操作方式来访问这些单元,如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

  比如,我们找到GPIOB 端口的输出数据寄存器ODR 的地址是0x4001 0C0C(至于这个地址如何找到可以先跳过,后面我们会有详细的讲解),ODR 寄存器是32bit,低16bit有效,对应着16 个外部IO,写0/1 对应的的IO 则输出低/高电平。现在我们通过C 语言指针的操作方式,让GPIOB 的16 个IO 都输出高电平。

  1 // GPIOB 端口全部输出 高电平

  2 *(unsigned int*)(0x4001 0C0C) = 0xFFFF;

  0x4001 0C0C 在我们看来是GPIOB 端口ODR 的地址,但是在编译器看来,这只是一个普通的变量,是一个立

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/565907
推荐阅读
相关标签
  

闽ICP备14008679号