OpenEdv-开源电子网

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

关于多个gpio的初始化问题,大神求解

[复制链接]

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2016-9-14
在线时间
17 小时
发表于 2017-2-13 21:35:19 | 显示全部楼层 |阅读模式
GPIO_InitStructure.GPIO_Pin = (3<<0)|(3<<4)|(7<<8)|(3<<14);//PD0,1,4,5,8,9,10,14,15 AF OUT

       
  GPIO_InitStructure.GPIO_Pin = (0X1FF<<7);//PE7~15,AF OUT
  麻烦大神解释下这两句代码的具体意思

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2017-2-8
在线时间
12 小时
发表于 2017-2-13 21:49:21 | 显示全部楼层
回复 支持 反对

使用道具 举报

9

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-9-27
在线时间
23 小时
发表于 2017-2-13 23:03:29 | 显示全部楼层
就是选个引脚啊,哪有什么具体意思,你勤快点把二进制数都写出来再对一下寄存器就都知道可
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2016-9-14
在线时间
17 小时
 楼主| 发表于 2017-2-14 08:56:16 | 显示全部楼层
lnsylyl 发表于 2017-2-13 21:49
你是想问左移,右移吗?

不是的,这行代码的意思就是初始化多个io口。但是他这个移位用的有点搞不明白,注释上是初始化这些PD0,1,4,5,8,9,10,14,15 引脚,但使用或也能达到目的,他用移位可能是种简化的写法,打就是这些值搞不明白
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2016-9-14
在线时间
17 小时
 楼主| 发表于 2017-2-14 08:57:33 | 显示全部楼层
zzz 发表于 2017-2-13 23:03
就是选个引脚啊,哪有什么具体意思,你勤快点把二进制数都写出来再对一下寄存器就都知道可

你的意思是吧上面那些值全化为二进制???再和他的寄存器值作比较??
回复 支持 反对

使用道具 举报

23

主题

69

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-1-5
在线时间
50 小时
发表于 2017-2-14 09:12:43 | 显示全部楼层
(3<<0)|(3<<4)|(7<<8)|(3<<14) 这个式子算出来 哪些为1就使能哪些引脚,至于为什么,我是用的HAL,而且寄存器版的也是与非  或非来赋值的
回复 支持 反对

使用道具 举报

9

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-9-27
在线时间
23 小时
发表于 2017-2-14 16:55:29 | 显示全部楼层
涝池岸黑科技 发表于 2017-2-14 08:57
你的意思是吧上面那些值全化为二进制???再和他的寄存器值作比较??

没毛病
生死看淡,低头猛干
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2017-2-8
在线时间
12 小时
发表于 2017-2-14 20:26:27 | 显示全部楼层
本帖最后由 lnsylyl 于 2017-2-14 20:28 编辑

我觉得你不必纠结这些东西,人家的代码没毛病,每个人都有自己的书写习惯,其实,个人觉得还是下面的写法,更易于理解   
GPIO_InitStructure.GPIO_Pin =GPIO_PIN_1 |\
                         | GPIO_PIN_4 \
                         | GPIO_PIN_5 \  
                         | GPIO_PIN_8 \
                         | GPIO_PIN_9 \
                         | GPIO_PIN_10 \
                         | GPIO_PIN_14 \
                         | GPIO_PIN_15;




回复 支持 反对

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-2-14
在线时间
15 小时
发表于 2017-2-14 20:34:05 | 显示全部楼层
GPIO_InitStructure.GPIO_Pin = (3<<0)|(3<<4)|(7<<8)|(3<<14);//PD0,1,4,5,8,9,10,14,15 AF OUT
回复 支持 反对

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-2-14
在线时间
15 小时
发表于 2017-2-14 20:58:10 | 显示全部楼层
初始化单个IO口:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
初始化多个IO口可以写成:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;

其中GPIO_Pin_x是宏定义 :如下 (在MDK中 按键盘F12可以跟踪)
#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */
................

GPIO_InitStructure.GPIO_Pin = (3<<0)|(3<<4)|(7<<8)|(3<<14);
(3<<0)==(GPIO_PIN_0 | GPIO_PIN_1)

(3<<4)==(GPIO_PIN_0 | GPIO_PIN_1)<<4==(3<<0)==(GPIO_PIN_4 | GPIO_PIN_5)

(3<<0)|(3<<4)== (3<<0)==(GPIO_PIN_0 | GPIO_PIN_1)| (3<<0)==(GPIO_PIN_4 | GPIO_PIN_5)

按这推算
回复 支持 反对

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-2-14
在线时间
15 小时
发表于 2017-2-14 21:01:00 | 显示全部楼层
上面倒数第3行写错了应该是(3<<4)==(GPIO_PIN_0 | GPIO_PIN_1)<<4==(GPIO_PIN_4 | GPIO_PIN_5)
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2016-9-14
在线时间
17 小时
 楼主| 发表于 2017-3-5 16:41:58 | 显示全部楼层
lnsylyl 发表于 2017-2-14 20:26
我觉得你不必纠结这些东西,人家的代码没毛病,每个人都有自己的书写习惯,其实,个人觉得还是下面的写法,更易 ...

其实我也习惯这种写法

回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2016-9-14
在线时间
17 小时
 楼主| 发表于 2017-3-5 16:42:51 | 显示全部楼层
2017214 发表于 2017-2-14 20:58
初始化单个IO口:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
初始化多个IO口可以写成:
GPIO_InitStructur ...

谢谢回复,解决了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-12 22:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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