请教一个问题!#define RCC ((RCC_TypeDef *) RCC_BASE)?

#define RCC                 ((RCC_TypeDef *) RCC_BASE)  

 

这一句的意思是RCC是一个指针 , 然后把地址 RCC_BASE 赋给RCC吗?

那为什么为什么RCC没有定义呢。。

以及后面   RCC->RC 的使用  和上面那个定义的联系 跳跃太大了,有点晕了。。

C语言的确不怎么扎实求教了。

 

 

#define RCC   ((RCC_TypeDef *) RCC_BASE),
这个本身就是RCC的定义,这是最基本的宏定义,
RCC_TypeDef是个结构体,有定义,找找看,
RCC_BASE是个数值,具体地说是地址,取决于RCC寄存器在芯片中的实际地址,
((RCC_TypeDef *) RCC_BASE)的意思就是把RCC_BASE这个地址强制转换为RCC_TypeDef 类型的指针,
RCC也就是((RCC_TypeDef *) RCC_BASE),就是指向RCC_BASE的RCC_TypeDef 类型的指针。

 

 

 

RCC是一个宏,它代表文本“ ((RCC_TypeDef *) RCC_BASE)  ”,预编译的时候会把代码中出现的RCC替换为 ((RCC_TypeDef *) RCC_BASE),RCC->RC就是 ((RCC_TypeDef *) RCC_BASE)->RC。了解了C语言的宏和指针后,应该就能理解这些。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是用来控制 STM32 的 GPIO 端口的,主要包含了以下几个函数: 1. `GetGPIO_RCC`:根据引脚号返回该引脚所在的 GPIO 端口的时钟 RCC_APB2Periph_GPIOx,其 x 表示端口号,如 A、B、C 等。 2. `GetGPIO_Port`:根据引脚号返回该引脚所在的 GPIO 端口,其 GPIOA_BASE 表示 A 端口的基地址,0x0400 表示一个端口的地址偏移量,因此 `(GPIOA_BASE+0x0400*(pin/16))` 就是引脚所在的端口的地址。 3. `GetGPIO_PIN`:根据引脚号返回该引脚的编号,例如引脚号为 2,返回值就是 0x0004。 4. `GPIO_SetMode`:配置 GPIO 端口的工作模式,包括输入、输出、复用功能等。 5. `Pin_Out`:将引脚设置为输出模式,并输出指定的数值(0 或 1)。 6. `Pin_Read`:读取引脚的输入值。 7. `SetPin`:将引脚设置为高电平状态。 8. `ResetPin`:将引脚设置为低电平状态。 需要注意的是,代码的 `BIT_ADDR` 是一个定义,用于读写位地址,其定义如下: ``` #define ADDR_FLASH_PAGE_31 ((uint32_t)0x08007C00) /* Base @ of Page 31, 2 Kbytes */ #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) #define GPIOA_ODR_Addr (GPIOA_BASE+0x14) #define GPIOB_ODR_Addr (GPIOB_BASE+0x14) #define GPIOC_ODR_Addr (GPIOC_BASE+0x14) #define GPIOD_ODR_Addr (GPIOD_BASE+0x14) #define GPIOE_ODR_Addr (GPIOE_BASE+0x14) #define GPIOF_ODR_Addr (GPIOF_BASE+0x14) #define GPIOG_ODR_Addr (GPIOG_BASE+0x14) #define GPIOA_IDR_Addr (GPIOA_BASE+0x10) #define GPIOB_IDR_Addr (GPIOB_BASE+0x10) #define GPIOC_IDR_Addr (GPIOC_BASE+0x10) #define GPIOD_IDR_Addr (GPIOD_BASE+0x10) #define GPIOE_IDR_Addr (GPIOE_BASE+0x10) #define GPIOF_IDR_Addr (GPIOF_BASE+0x10) #define GPIOG_IDR_Addr (GPIOG_BASE+0x10) ``` 这里使用了位带操作,将每个位单独映射到一个地址上,以实现对单个位的读写操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值