OpenEdv-开源电子网

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

跑马灯实验配置(库函数,GPIO_InitTypeDef GPIO_InitStructure的定义),

[复制链接]

5

主题

8

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-8-16
在线时间
4 小时
发表于 2016-8-16 09:33:08 | 显示全部楼层 |阅读模式
1金钱
void LED_Init(void)
{

GPIO_InitTypeDef  GPIO_InitStructure;为什么要这样去定义,如果我不定义的话该怎么初始化E5 和B5口,就是直接库函数里面的调用,不另外定义这个地址,( GPIO_InitTypeDef这个是不是一个宏指令,类似于 #define GPIO_Init **** 的意思,麻烦大神讲解下,我有强迫症,虽然知道怎么用,但感觉了解不透彻)
  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;     
GPIO_Init(GPIOE, &GPIO_InitStructure);   
GPIO_SetBits(GPIOE,GPIO_Pin_5);
}


最佳答案

最佳答案

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

你用库函数的话,原函数是这个GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 而GPIO_TypeDef和GPIO_InitTypeDef都是结构体。GPIO_TypeDef*这个代表结构体指针,要传入跟跟它数据类型相同的变量地址,后面那个也是一个道理。 两个结构体变量的原型是这下面这两个: [mw_shl_code=c,true]typedef struct { __IO uint32_t CRL; __IO uint32_t CRH; __IO uint32_t IDR; __IO uint32_t ODR; ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

281

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2504
金钱
2504
注册时间
2015-8-17
在线时间
383 小时
发表于 2016-8-16 09:33:09 | 显示全部楼层
你用库函数的话,原函数是这个GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
而GPIO_TypeDef和GPIO_InitTypeDef都是结构体。GPIO_TypeDef*这个代表结构体指针,要传入跟跟它数据类型相同的变量地址,后面那个也是一个道理。
两个结构体变量的原型是这下面这两个:
[mw_shl_code=c,true]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;[/mw_shl_code]
[mw_shl_code=c,true]typedef struct
{
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;[/mw_shl_code]
而且要给GPIO_Init();传递两个结构体指针,这样就可以引用外部的变量值,如果传递的形参不是指针,那么初始化就要在函数内部赋值,鬼知道你要赋的值是什么,所以要用指针指向外部变量。而且里面有很多的参数,如果不用结构体指针的话,那个形参变会变得非常的长和多,这样是很不好用的,都记不清哪个位置要放哪个参数,这应该是为了提高代码的可读性。
如果你不用这种方法的话,可以用寄存器,那样要记的东西会更多。
你还是好好看看C语言吧,这些都是基本问题。
做事的原则:
1.每个问题重复三遍、研究三遍后再提问,直接得到答案的人什么都没学会。
2.做事要有始有终,感谢那些帮助自己解决问题的人,把解决的方法总结起来。
回复

使用道具 举报

5

主题

8

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-8-16
在线时间
4 小时
 楼主| 发表于 2016-8-17 09:05:16 | 显示全部楼层
wszdxmh 发表于 2016-8-16 09:59
你用库函数的话,原函数是这个GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
而GP ...

大概了解了,类似于先去找到到这个结构体,然后再对结构体里面的组员进行操作
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-10-7
在线时间
4 小时
发表于 2016-11-9 22:50:05 | 显示全部楼层
GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_5;

为什么我直接在函数里面敲这句会报错?GPIO_InitTypeDef不是应经定义好的结构体吗?这句应该是很简单的一个赋值吧!

原句
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
改为
GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_5;


求解!

补充内容 (2016-11-21 18:57):
http://www.cnblogs.com/qyaizs/articles/2039101.html
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-10-7
在线时间
4 小时
发表于 2016-11-21 18:56:12 | 显示全部楼层
鸿飞6 发表于 2016-11-9 22:50
GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_5;

为什么我直接在函数里面敲这句会报错?GPIO_InitTypeDef不是 ...

http://www.cnblogs.com/qyaizs/articles/2039101.html
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 10:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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