微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > C语言问题?

C语言问题?

时间:10-02 整理:3721RD 点击:
以下一段代码是关于32的但是我的问题是关于C语言的:GPIO_TypeDef* GPIOx是一个结构体类型的指针,可为什么在往void GPIO_Init()函数里面写数据时(例如是写 GPIO_Init(GPIOB, &GPIO_InitStructure)),那么为什么第一个参数是写成  GPIOB  而不是写成  &GPIOB   呢?(求赐教,谢谢)

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
  uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
  uint32_t tmpreg = 0x00, pinmask = 0x00;
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
  assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));  
  ...
}

你看一下GPIOB的define:
“#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)”(这个是我用的一个32的固件库里的头文件stm32f10x.h定义)
GPIOB已经指向GPIOB_BASE,是一个地址,不需要再用取地址了。

我的理解是这样的,GPIOB是底层库里面定义的一个指向B口寄存器的指针,所以就不用再次取址了。不知道对不对

GPIOB本身就被定义为一个地址了,并且定义为GPIO_TypeDef *类型的指针。也就是从GPIOB地址开始往后一块内存单元里被结构化为GPIO_TypeDef 类型的数据。

其实寄存器对我们使用而言就是普通的指针变量,对于单片机而言,他不懂什么是强制类型转换,这些都是编译层次上的。看看你寄存器的定义就明白了。或者仿真的时候看看你的memory映射。现在都讲究模块化设计,所以对这些io操作归类。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top