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

时间:2024-04-06 18:48:27

前段时间第一次接触stm32地址偏移的概念时,非常的困惑,以GPIO寄存器为例,为什么相邻寄存器的偏移地址是0x04?
stm32地址偏移:为什么相邻寄存器的地址偏移量是0x04?stm32地址偏移:为什么相邻寄存器的地址偏移量是0x04?
困惑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数值上应该会小很多,但它们表示的内存空间理论上都是相同的。
stm32地址偏移:为什么相邻寄存器的地址偏移量是0x04?
stm32地址偏移:为什么相邻寄存器的地址偏移量是0x04?