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

外设与内设

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

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

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

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

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

#define GPIOB_ODR_ADDRESS  0x10000
*GPIOB_ODR_ADDRESS = 1;

就是说将地址为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 端

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朽木白露

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值