OpenEdv-开源电子网

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

请教个在战舰的库函数例程中的一个c语言问题

[复制链接]

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-7-9
在线时间
14 小时
发表于 2018-3-1 00:18:10 | 显示全部楼层 |阅读模式
3金钱
void LED_Init(void)
{

GPIO_InitTypeDef  GPIO_InitStructure;
       
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);         //使能PB,PE端口时钟
       
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                 //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5);                                                 //PB.5 输出高

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                             //LED1-->PE.5 端口配置, 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure);                                           //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_5);                                                  //PE.5 输出高
}

GPIO_InitTypeDef  GPIO_InitStructure;
GPIO_Init(GPIOB, &GPIO_InitStructure);

原型:void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);         //初始化gpio

GPIO_TypeDef和GPIO_InitTypeDef都是结构体,为什么GPIO就可以直接写GPIOB,而设置模式就要写&GPIO_InitStructure,并在前面加上GPIO_InitTypeDef  GPIO_InitStructure;呢??C语言知识有点浅薄,望大神指教,谢谢!!!

最佳答案

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

GPIOB是一个宏定义,就是一个地址, #define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2018-3-1 00:18:11 | 显示全部楼层
本帖最后由 d1z1y2 于 2018-3-1 08:41 编辑

GPIOB是一个宏定义,就是一个地址,
#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)

#define GPIOB                     ((GPIO_TypeDef *) GPIOB_BASE)






回复

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1669
金钱
1669
注册时间
2018-1-29
在线时间
160 小时
发表于 2018-3-1 07:26:13 | 显示全部楼层
STM32的GPIO使用模式很复杂。所以有专用的寄存器来控制某个IO口的工作模式,甚至输出寄存器,输入寄存器都不同。所以在配置时,不同的模式访问不同的存储器,不同的存储器其每位的功能也不同,需要用结构体定义使代码清晰化,可读化。
回复

使用道具 举报

6

主题

153

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1323
金钱
1323
注册时间
2016-12-27
在线时间
156 小时
发表于 2018-3-1 08:07:45 | 显示全部楼层
GPIOB是有宏定义的呀,大哥
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2018-3-1 09:31:20 | 显示全部楼层
GPIOB本身就是指向GPIO_TypeDef的指针
回复

使用道具 举报

0

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
295
金钱
295
注册时间
2018-2-27
在线时间
36 小时
发表于 2018-3-1 10:16:14 | 显示全部楼层
如前面各位大神所说,
#define GPIOB                     ((GPIO_TypeDef *) GPIOB_BASE)       //1、GPIOB是一个指向GPIOB_BASE这个地址的一个GPIO_TypeDef类型的结构体指针
GPIO_InitTypeDef  GPIO_InitStructure;               //2、GPIO_InitStructure是楼主在LED_Init()中自己定义的一个GPIO_InitTypeDef类型的结构体变量  

        3、而在GPIO_Init()的函数原型:void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 中,
第一个入口参数:GPIO_TypeDef* GPIOx      是一个 GPIO_TypeDef类型的结构体指针
第二个入口参数:GPIO_InitTypeDef* GPIO_InitStruct      是一个 GPIO_TypeDef类型的结构体指针.
        4、因为GPIOB与第一个入口参数要求的类型相同,所以直接传入GPIOB便可,
而第二个入口参数传入的是一个GPIO_TypeDef类型的结构体指针,所以应该 取 GPIO_InitTypeDef类型的结构体变量GPIO_InitStructure  的
地址
作为参数传递进去。
回复

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-7-9
在线时间
14 小时
 楼主| 发表于 2018-3-7 16:40:41 | 显示全部楼层
TCX 发表于 2018-3-1 10:16
如前面各位大神所说,
#define GPIOB                     ((GPIO_TypeDef *) GPIOB_BASE)       //1、GPI ...

明白了,谢谢
回复

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-7-9
在线时间
14 小时
 楼主| 发表于 2018-3-7 16:42:22 | 显示全部楼层
本帖最后由 895855647 于 2018-3-7 16:45 编辑
TCX 发表于 2018-3-1 10:16
如前面各位大神所说,
#define GPIOB                     ((GPIO_TypeDef *) GPIOB_BASE)       //1、GPI ...

也就是GPIO_InitTypeDef类型的结构体变量里面的参数被用作GPIO_TypeDef类型的结构体指针存入入口,所以用这种方式对吧?
回复

使用道具 举报

0

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
295
金钱
295
注册时间
2018-2-27
在线时间
36 小时
发表于 2018-3-8 13:01:16 | 显示全部楼层
本帖最后由 TCX 于 2018-3-8 13:03 编辑

        应该是说 原型:void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);         这个函数的第二个形参意思是通过一个 GPIO_InitTypeDef* 类型的指针变量GPIO_InitStruct(指向GPIO_InitTypeDef类型的指针变量GPIO_InitStruct)来访问 这个指针变量指向的区域 的内容。
        此处你通过这句代码: GPIO_InitTypeDef  GPIO_InitStructure; 定义了一个GPIO_InitTypeDef类型的结构体变量,所以你应该将这个结构体变量的地址取出来赋值给函数原型的第二个入口参数,使GPIO_Init()这个函数能够得到你之前通过以下代码:
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                 //LED0-->PB.5 端口配置
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
        来对GPIO的配置,然后才能帮你配置好GPIO。
        举个不太恰当的例子,我(楼主)把一个什么样(GPIO_InitTypeDef)的配置表(GPIO_InitStructure)放置什么地方(&GPIO_InitStructure),(GPIO_Init())去依据配置表帮我配置好。
回复

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2017-7-9
在线时间
14 小时
 楼主| 发表于 2018-3-16 09:22:55 | 显示全部楼层
TCX 发表于 2018-3-8 13:01
应该是说 原型:void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);       ...

谢谢大佬解答
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 08:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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