OpenEdv-开源电子网

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

GPIO初始化之后不能用,求解

[复制链接]

2

主题

9

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-9-12
在线时间
6 小时
发表于 2018-9-29 16:38:01 | 显示全部楼层 |阅读模式
1金钱
代码是下面那样的,但是初始化后  只有PB0和PB1能用,5 6 7 都不能用,求大神解答

[mw_shl_code=c,true]void output_init(void)  //初始化
{
        GPIO_InitTypeDef  GPIO_InitStructure;                   //定義初始化結構體
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   //打開GPIOB時鐘
       
        //風扇0
        GPIO_InitStructure.GPIO_Pin = 0;                        //Pin_0
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽輸出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //50MHz
        GPIO_Init(GPIOB, &GPIO_InitStructure);                  //初始化PB0
        GPIO_ResetBits(GPIOB,GPIO_Pin_0);                       //PB0置0
       
        //風扇1
        GPIO_InitStructure.GPIO_Pin = 1;                        //Pin_1
        GPIO_Init(GPIOB, &GPIO_InitStructure);                  //初始化PB1
        GPIO_ResetBits(GPIOB,GPIO_Pin_1);                       //PB1置0
       
        //抽風
        GPIO_InitStructure.GPIO_Pin = 5;                        //Pin_5
        GPIO_Init(GPIOB, &GPIO_InitStructure);                  //初始化PB1
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);                       //PB5置0
       
        //發熱絲
        GPIO_InitStructure.GPIO_Pin = 6;                        //Pin_6
        GPIO_Init(GPIOB, &GPIO_InitStructure);                  //初始化PB1
        GPIO_ResetBits(GPIOB,GPIO_Pin_6);                       //PB6置0
       
        //噴霧器
        GPIO_InitStructure.GPIO_Pin = 7;                        //Pin_7
        GPIO_Init(GPIOB, &GPIO_InitStructure);                  //初始化PB1
        GPIO_ResetBits(GPIOB,GPIO_Pin_7);                       //PB7置0
}
[/mw_shl_code]


最佳答案

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

1 为0001 5 为0101 6 为0110 7 为0111 所以,其实你最后一句的GPIO_InitStructure.GPIO_Pin = 7; 相当于GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; 即同时初始化了0、1、2三个引脚, 不信也把前面的GPIO_InitStructure.GPIO_Pin = 0、1、5、6; 都删除,只留下=7效果将是一样的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-9-29 16:38:02 | 显示全部楼层
YEUNG 发表于 2018-9-29 18:25
那为什么0和1没问题,,,,我的代码是直接从跑马灯实验里面复制出来改的。。。

1  为0001
5  为0101
6  为0110
7  为0111
所以,其实你最后一句的GPIO_InitStructure.GPIO_Pin = 7;
相当于GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
即同时初始化了0、1、2三个引脚,
不信也把前面的GPIO_InitStructure.GPIO_Pin = 0、1、5、6; 都删除,只留下=7效果将是一样的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2018-9-29 16:45:09 | 显示全部楼层
问题描述太不清楚,要做什么?什么现象?,现在看只是都初始化下,并没有做什么
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-9-12
在线时间
6 小时
 楼主| 发表于 2018-9-29 17:04:20 | 显示全部楼层
a5820736 发表于 2018-9-29 16:45
问题描述太不清楚,要做什么?什么现象?,现在看只是都初始化下,并没有做什么

只是别的函数调用IO口输出高低电平而已  0和1输出高电平没问题   567就输出不了高电平
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2018-9-29 17:09:28 | 显示全部楼层
先确定这几个引脚没有接其他外设,是可用的?然后有用电表之类测过引脚的电平吗?
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2018-5-28
在线时间
23 小时
发表于 2018-9-29 17:23:22 | 显示全部楼层
我试了一下,你的语句是有问题的,比如说初始化第5个脚的语句是GPIO_InitStructure.GPIO_Pin=GPIO_5,不可以直接写等于5
回复

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
发表于 2018-9-29 17:31:29 | 显示全部楼层
代码不规范导致的吧,最好不要用数字直接代替引脚编号,可以用P1,Pin1,千万别直接用1
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-9-12
在线时间
6 小时
 楼主| 发表于 2018-9-29 18:23:52 | 显示全部楼层
本帖最后由 YEUNG 于 2018-9-29 18:28 编辑
a5820736 发表于 2018-9-29 17:09
先确定这几个引脚没有接其他外设,是可用的?然后有用电表之类测过引脚的电平吗?

确定没接别的外设,引脚也没有复用和重映射,引脚的高低电平都是用万用表测的,PB0和PB1的低电平大概是0.02V   567直接是0V  本来应该输出高电平的时候也是0V
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-9-12
在线时间
6 小时
 楼主| 发表于 2018-9-29 18:25:49 | 显示全部楼层
高山景行 发表于 2018-9-29 17:23
我试了一下,你的语句是有问题的,比如说初始化第5个脚的语句是GPIO_InitStructure.GPIO_Pin=GPIO_5,不可 ...

那为什么0和1没问题,,,,我的代码是直接从跑马灯实验里面复制出来改的。。。
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-9-12
在线时间
6 小时
 楼主| 发表于 2018-9-29 18:31:17 | 显示全部楼层
午夜狼嚎 发表于 2018-9-29 17:31
代码不规范导致的吧,最好不要用数字直接代替引脚编号,可以用P1,Pin1,千万别直接用1

代码是正点原子教程里面的跑马灯程序复制出来改的,只改了引脚号,别的都没改   这样的话  应该不是规范问题吧
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-9-29 18:41:25 | 显示全部楼层
1  为0001
5  为0101
6  为0110
7  为0111
所以,其实你最后一句的GPIO_InitStructure.GPIO_Pin = 7;
相当于GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
即同时初始化了0、1、2三个引脚,
不信也把前面的GPIO_InitStructure.GPIO_Pin = 0、1、5、6; 都删除,只留下=7效果将是一样的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-9-12
在线时间
6 小时
 楼主| 发表于 2018-9-29 18:48:19 | 显示全部楼层
warship 发表于 2018-9-29 18:43
1  为0001
5  为0101
6  为0110

确实是   谢谢指导
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 05:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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