初学stm32,不是很理解为什么类似如下图所示的地址偏移0x04表示四个字节的偏移,转换为十进制的话,0x04=4;转换为二进制,0x04=00000100,怎么都不会是四个字节,32位!
后来在网上查阅资料后发现,我可能混淆了0x04这个16进制数值本身,首先从为什么相邻寄存器的地址偏移量是0x04开始分析,有如下两个原因:
1. 32位处理器架构
- STM32是32位处理器
- 每个寄存器都是32位宽度(4个字节)
- 即使某些寄存器只使用部分位,仍按32位分配空间
2. 内存对齐要求
- 字对齐:32位数据必须存储在能被4整除的地址上
- 性能优化:对齐的内存访问比非对齐访问快得多
- 硬件简化:简化地址解码逻辑
所以地址偏移需要设置为4个字节。其次最重要的是,在stm32中每个地址单位代表1个字节,
- 从0x40020000到0x40020004,地址相差了4
- 在16进制中,0x04 = 4(十进制)
- 所以0x04的偏移实际上是4个字节,不是1个字节
总的来说,相邻寄存器的地址偏移量0x04并不只是一个数字,它是有单位的,代表偏移量为0x04个地址单位,也就是4个字节,如下所示。
地址范围 寄存器 字节位置
0x40020000 ┐
0x40020001 │ CRL 4个字节
0x40020002 │ (32位)
0x40020003 ┘
0x40020004 ┐ ← 这里开始下一个寄存器
0x40020005 │ CRH 4个字节
0x40020006 │ (32位)
0x40020007 ┘
关键要点就是记住这个公式:
地址偏移量(16进制) = 实际字节数(10进制)
0x04 = 4字节偏移
0x08 = 8字节偏移
0x0C = 12字节偏移
而并非
❌ 0x04 = 1个字节偏移
❌ 0x04 = 第4个偏移单位