关于强制类型转换和内存地址单位

关于强制类型转换和内存地址单位

以stm32f10x官方库中的 #define RCC ((RCC_TypeDef *) RCC_BASE)为例说明

声明时钟寄存器组结构体RCC_TypeDef

typedef struct{
  __IO uint32_t CR;
  __IO uint32_t CFGR;
  __IO uint32_t CIR;
  __IO uint32_t APB2RSTR;
  __IO uint32_t APB1RSTR;
  __IO uint32_t AHBENR;
  __IO uint32_t APB2ENR;
   __IO uint32_t APB1ENR;
  __IO uint32_t BDCR;
  __IO uint32_t CSR;
} RCC_TypeDef;

将地址进行一系列偏移,使RCC_BASE 等于 0x40021000

#define PERIPH_BASE      ((uint32_t)0x40000000)
#define AHBPERIPH_BASE   (PERIPH_BASE + 0x20000)
#define RCC_BASE         (AHBPERIPH_BASE + 0x1000) 

将RCC_BASE所对应的16进制数(0x40021000)转换成指针地址与RCC相对应,而这个地址指向的是RCC_TypeDef结构体类型的变量的首个元素*/

  #define RCC              ((RCC_TypeDef *) RCC_BASE)

RCC->CR等价于(*RCC).CR,此句将CR的值赋值为32位整数0x00000001 */
C语言中内存地址以字节为单位,结构体中的首个元素对应结构体的首地址,其后元素地址偏移0x04

RCC->CR |= (uint32_t)0x00000001;

执行结果:将0x40021000的地址中的位0存入1。

RCC->CFGR &= (uint32_t)0xF0FF0000;  /*对应的二进制数为(1111 0000 1111 1111 0000 0000 0000 0000)*/

执行结果:将0x40021004的地址中的位0-15和位24-27存入0。

文中代码为STM32官方库文件中摘取
可对照STM32中文参考手册的寄存器说明查看具体设置

内存地址单位与地址偏移

在计算机中最小的信息单位是一个二进制位(bit),8个位组成一个字节(Byte),中央处理器(CPU)一次处理的数据长度称为字(word)。如:8位机的字长是八位,16位机的字长是16位,32位机的字长是32位,通常寄存器的位数等于字长。单片机对寄存器的数据以字节为单位进行处理,地址编排是一个字节一个地址,称为字节寻址,即一次存储或者读取一个Byte。

内存地址的单位是字节是由内存的物理构造决定的,一个内存是由若干个黑色的内存颗粒构成,每一个内存颗粒叫做一个chip,每一个chip中包含8个bank,bank内部为电容的行列矩阵结构,(二维矩阵中每一个元素一般存储8个bit,即包含8个小电容),通过内存的物理结构可以看出内存的最小的单位就是字节。
原文地址:https://www.jianshu.com/p/bc8252f18ecf?tdsourcetag=s_pcqq_aiomsg

STM32单片机的寄存器为32位,需要32bit变量来为其赋值,因此在结构体中要申明占有32bit的uint32_t(无符号的32位整形变量)元素,对应4个字节,因为字节寻址机制,这4个字节的数据需要4个地址单位,所以结构体中其后的元素地址为前一元素地址的基础上加0x04。

自学新手,个人总结,如有出入,请多指教!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值