stm32地址偏移:为什么相邻寄存器的地址偏移量是0x04? 您所在的位置:网站首页 gpiob的idr寄存器的地址是多少 stm32地址偏移:为什么相邻寄存器的地址偏移量是0x04?

stm32地址偏移:为什么相邻寄存器的地址偏移量是0x04?

2024-07-15 12:19| 来源: 网络整理| 查看: 265

前段时间第一次接触stm32地址偏移的概念时,非常的困惑,以GPIO寄存器为例,为什么相邻寄存器的偏移地址是0x04? 答:首先大家要弄明白两个概念 1、 寄存器地址 != 内存空间,寄存器地址只是内存空间的编号,它不占据寄存器的物理空间,根据这个编号CPU可以改变寄存器内部的实参(利用指针)。 2、stm32中的内存单元为一个字节(8位),寄存器占据32位的内存空间(4个内存单元)。 以GPIO两个相邻寄存器为例,如下图所示:在这里插入图片描述在这里插入图片描述 将0x04转换为我们熟悉的十进制数等于4,“偏移地址:0x04”的意思就是:在空间上偏移4个内存单元

/································以下为原答案,作为错误理解演示·······················/ 困惑1:当时以为,0x04是一个十六进制数,由8个二进制数组成,所以偏移地址实际上偏移了8位。然而教学视频上一再强调,偏移地址0x04是偏移了4个字节(32位)。 解惑1:由于产生困惑1的时候,C语言的基础不好,连基本的进制转换都会头晕,所以去补了补C语言的基础知识。粗略看了C语言基础后感觉豁然开朗,认为0x01是2个十六进制数一共是8位,那4个0x01等于0x04就是32位,然后就又困惑了。 困惑2:既然2个十六进制数可以表示8位,那0x02可以表示8位,偏移32位就是4个0x02相加等于0x08,为什么相邻寄存器偏移地址不是0x08? 解惑2:地址的偏移是一个空间上的概念,而我将十六进制的地址理解成单纯的数值,实际上它表示内存空间。stm32将32位的内存空间作为一个内存单元,所以相邻寄存器之间的地址相差32位(4个字节)。2个十六进制数可以表示8位(一个字节),4个十六进制数表示32位(4个字节)。这里的0x01并不是一个单纯的十六进制数,而是表示基地址后第一个8位的内存空间,0x04表示前四个连续的8位的内存地址,也就是基地址后的32位的内存空间,所以相邻寄存器的地址偏移量是0x04。 困惑3:当我写完解惑2后以为自己全明白了,然后突然困惑了,为什么不直接使用偏移地址0x0000 0001表示基地址之后的第一个32位空间,救救孩子吧! 解惑3:(只是猜测)我们现在所看到的stm32的寄存器地址,实际上都是最初的基地址0x0000 0000由字节偏移得到的。偏移量0x04叫做字节偏移,那么偏移量0x0000 0001就是字偏移。如果使用字偏移作为地址的偏移规则,那么我们现在所看到的地址数值,比如GPIOA基地址0x4001 0800数值上应该会小很多,但它们表示的内存空间理论上都是相同的。 最初的基地址 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有