OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4962|回复: 1

结构体与结构体指针做函数形参的问题

[复制链接]

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
发表于 2015-2-9 11:28:24 | 显示全部楼层 |阅读模式
5金钱
#define GPIOB_BASE (0x50004040) // GPIOB Control Registers
GPIO_T GPIOB __attribute__((at(GPIOB_BASE), zero_init));
typedef struct
{
GPIO_PMD_T PMD; // GPIO Port Bit Mode Control
GPIO_OFFD_T OFFD; // GPIO Port Bit OFF Digital enable
GPIO_DOUT_T DOUT; // GPIO Port Data Output Value
GPIO_DMASK_T DMASK; // GPIO Port Data Output Write Mask
GPIO_PIN_T PIN; // GPIO Port Pin Value
__I uint32_t RESERVE;
GPIO_IMD_T IMD; // GPIO Port Interrupt Mode Control
GPIO_IEN_T IEN; // GPIO Port Interrupt Enable
GPIO_ISRC_T ISRC; // GPIO Port Interrupt Source Flag
} GPIO_T;

DrvGPIO_EnableQuasiPins(&GPIOB,PORTB_TRGKEY_PINS); // Enable pins which are configured as quasi-mode for PGIOB
void DrvGPIO_EnableQuasiPins(GPIO_T* pGPIO, UINT32 u32Pins)
;===========================================
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)
#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)
typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;

GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

;===================================================
以上有两个问题还请大家帮忙解答一下:
(1)
GPIO_T GPIOB __attribute__((at(GPIOB_BASE), zero_init));
请问这样的定义是什么意思呢?
__attribute__的用法还是第一次见到,不知道它的作用是什么,网上说是设置什么属性的,但是解释的不是很清楚
还请大家帮忙解答一下
(2)

第二个问题是关于结构体结构体指针做函数参数的疑惑
GPIO_T GPIOB      这个定义应该是GPIOB被定义成GPIO_T型的结构体吧

#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)       这个是把GPIOB强制转换成GPIO_TypeDef型的结构体指针

而两者在做函数参数的时候前者需要加&符号,后者是不需要的,
这样的原因是不是前者是结构体,而后者是结构体指针的原因?
如果不是的话,还请大家帮忙解答下,谢谢!


DrvGPIO_EnableQuasiPins(&GPIOB,PORTB_TRGKEY_PINS); // Enable pins which are configured as quasi-mode for PGIOB
void DrvGPIO_EnableQuasiPins(GPIO_T* pGPIO, UINT32 u32Pins)

GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

















最佳答案

查看完整内容[请看2#楼]

1,这个按我的理解就是,定义GPIO_T GPIOB ,GPIOB的地址是:GPIOB_BASE,且,初始化GPIOB所有数据为0. 2,前者是结构体,后者是结构体指针。
天道酬勤
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-2-9 11:28:25 | 显示全部楼层
1,这个按我的理解就是,定义GPIO_T GPIOB ,GPIOB的地址是:GPIOB_BASE,且,初始化GPIOB所有数据为0.
2,前者是结构体,后者是结构体指针。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 12:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表