OpenEdv-开源电子网

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

STM32 F103 VET6 PA0、PA1、PA2、PA3引脚 配置为有上拉输入,不工作

[复制链接]

1

主题

5

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-10-23
在线时间
2 小时
发表于 2016-10-23 12:47:42 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 1770106568 于 2016-10-24 10:38 编辑

本人菜鸟,第一次用STM32 F103 VET6,想通过按键控制PC7IO口输出高低电平,如下详述:

PC0、PC1、PC2、PC3  PA0、PA1、PA2、PA3、PC4、PC5、PB0、PB1 都 配置为有内部上拉输入,
然后通过按键接地,按下其中一个按键 ,想让PC.7 输出高电平,松开按钮后,输出低电平。

这时候通过实验 C0、PC1、PC2、PC3 能实现PC7电平翻转。

而其余PA0、PA1、PA2、PA3、PC4、PC5、PB0、PB1 这8 个按钮输入,系统却不能正常识别。

用万能表测量IO口,未按下,均为3.3V,说明配置上拉输入已经生效,按下按钮,IO口,也
能变成低电平0V。

现在现象是:分别按后PA0、PA1、PA2、PA3、PC4、PC5、PB0、PB1 这8 个
按钮,PC7仅有很低的电压输出,因为输出经过驱动后接LED,所以能看到微微亮。

不知道是什么原因出现这种现象?

代码如下:

void IN_Init(void)
{
         GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);        //使能PA,PB,PC,PD,PE端口时钟

        //IN1
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;           //IN1-->PC.1端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入
        GPIO_Init(GPIOC, &GPIO_InitStructure);              //根据设定参数初始化GPIOC.1

        //IN2
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;           //IN2-->PC.0端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入
        GPIO_Init(GPIOC, &GPIO_InitStructure);              //根据设定参数初始化GPIOC.0

        //IN3
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;           //IN3-->PC.4端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入
        GPIO_Init(GPIOC, &GPIO_InitStructure);              //根据设定参数初始化GPIOC.3

        //IN4
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;           //IN4-->PC.3端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入
        GPIO_Init(GPIOC, &GPIO_InitStructure);              //根据设定参数初始化GPIOC.2



        //IN5
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;           //IN5-->PA.1端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);              //根据设定参数初始化GPIOA.1

        //IN6
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;           //IN6-->PA.0端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);              //根据设定参数初始化GPIOA.0

        //IN7
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;           //IN7-->PA.3端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);              //根据设定参数初始化GPIOA.3

        //IN8
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;           //IN8-->PA.2端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);              //根据设定参数初始化GPIOA.2



        //IN9               
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;           //IN9-->PC.5端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入
        GPIO_Init(GPIOC, &GPIO_InitStructure);              //根据设定参数初始化GPIOD.5

        //IN10============================================================================
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;           //IN10-->PC.4端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入
        GPIO_Init(GPIOC, &GPIO_InitStructure);              //根据设定参数初始化GPIOD.4

        //IN11============================================================================
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;           //IN11-->PB.1端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入
        GPIO_Init(GPIOB, &GPIO_InitStructure);              //根据设定参数初始化GPIOB.1

        //IN12============================================================================
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;           //IN12-->PB.0端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入
        GPIO_Init(GPIOB, &GPIO_InitStructure);              //根据设定参数初始化GPIOB.0
}

void OUT_Init(void)
{
                GPIO_InitTypeDef  GPIO_InitStructure;
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);         //使能PA,PB,PC,PD,PE端口时钟
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                                 //OUT1-->PC.7 端口配置
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                 //IO口速度为2MHz
                GPIO_Init(GPIOC, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOC.7
}
void IN_16(void)
{

                //IN1
                if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0) == Bit_RESET) // = 0
                        GPIO_SetBits(GPIOC,GPIO_Pin_7);            //PC.7 输出高
                else
                        GPIO_ResetBits(GPIOC,GPIO_Pin_7);          //PC.7  输出低

                //IN2
                if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1) == Bit_RESET) // = 0
                        GPIO_SetBits(GPIOC,GPIO_Pin_7);            //PC.7 输出高
                else
                        GPIO_ResetBits(GPIOC,GPIO_Pin_7);          //PC.7  输出低

                //IN3
                if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3) == Bit_RESET) // = 0
                        GPIO_SetBits(GPIOC,GPIO_Pin_7);            //PC.7 输出高
                else
                        GPIO_ResetBits(GPIOC,GPIO_Pin_7);          //PC.7  输出低
               
                //IN4
                if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2) == Bit_RESET) // = 0
                        GPIO_SetBits(GPIOC,GPIO_Pin_7);            //PC.7 输出高
                else
                        GPIO_ResetBits(GPIOC,GPIO_Pin_7);          //PC.7  输出低
               

                //IN1-IN4 输入,PC.7输出高低电平,工作正常!

                //IN5
                if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == Bit_RESET) // = 0
                GPIO_SetBits(GPIOC,GPIO_Pin_7);            //PC.7 输出高
                else
                GPIO_ResetBits(GPIOC,GPIO_Pin_7);          //PC.7  输出低
               
                //IN6
                if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET) // = 0
                        GPIO_SetBits(GPIOC,GPIO_Pin_7);            //PC.7 输出高
                else
                        GPIO_ResetBits(GPIOC,GPIO_Pin_7);          //PC.7  输出低
               
                //IN7
                if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3) == Bit_RESET) // = 0
                        GPIO_SetBits(GPIOC,GPIO_Pin_7);            //PC.7 输出高
                else
                        GPIO_ResetBits(GPIOC,GPIO_Pin_7);          //PC.7  输出低
               
                //IN8
                if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2) == Bit_RESET) // = 0
                        GPIO_SetBits(GPIOC,GPIO_Pin_7);            //PC.7 输出高
                else
                        GPIO_ResetBits(GPIOC,GPIO_Pin_7);          //PC.7  输出低
               
                //IN9
                if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5) == Bit_RESET) // = 0
                        GPIO_SetBits(GPIOC,GPIO_Pin_7);            //PC.7 输出高
                else
                        GPIO_ResetBits(GPIOC,GPIO_Pin_7);          //PC.7  输出低
               
                //IN10
                if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4) == Bit_RESET) // = 0
                        GPIO_SetBits(GPIOC,GPIO_Pin_7);            //PC.7 输出高
                else
                        GPIO_ResetBits(GPIOC,GPIO_Pin_7);          //PC.7  输出低
               
                //IN11
                if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == Bit_RESET) // = 0
                        GPIO_SetBits(GPIOC,GPIO_Pin_7);            //PC.7 输出高
                else
                        GPIO_ResetBits(GPIOC,GPIO_Pin_7);          //PC.7  输出低
               
                //IN12
                if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == Bit_RESET) // = 0
                        GPIO_SetBits(GPIOC,GPIO_Pin_7);            //PC.7 输出高
                else
                        GPIO_ResetBits(GPIOC,GPIO_Pin_7);          //PC.7  输出低
               
                //  IN5 - IN12   工作不正常,按下输入按钮后,PC.7只有微弱的高输出。
}


最佳答案

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

我简化了一下程序,还是不行!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-10-23
在线时间
2 小时
 楼主| 发表于 2016-10-23 12:47:43 | 显示全部楼层
本帖最后由 1770106568 于 2016-10-24 10:43 编辑
silentk 发表于 2016-10-24 09:24
1.看板子上IO口是否复用了(接了别的东西)2.D的时钟打开了,但D口并未初始化啊。。。。。设置为推挽输出! ...
我简化了一下程序,还是不行!
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-10-24 08:43:06 | 显示全部楼层
到底输入输出,描述和程序俩状态,醉
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-9-23
在线时间
52 小时
发表于 2016-10-24 09:24:05 | 显示全部楼层
1.看板子上IO口是否复用了(接了别的东西)2.D的时钟打开了,但D口并未初始化啊。。。。。设置为推挽输出!
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-10-23
在线时间
2 小时
 楼主| 发表于 2016-10-24 10:08:29 | 显示全部楼层
本帖最后由 1770106568 于 2016-10-24 10:44 编辑
龙之谷 发表于 2016-10-24 08:43
到底输入输出,描述和程序俩状态,醉
我修改了一下问题描述,同时也简化了一下程序,目前还是不行,
主要是后8个按钮是不是初始化时候 复用功能也需要关闭呢?怎么设置?
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-9-23
在线时间
52 小时
发表于 2016-10-24 10:19:31 | 显示全部楼层
1770106568 发表于 2016-10-24 10:06
板子上输入口没有接其它电路,D输出口因为别的输入端口能正常让其输出,所以排除D输出配置问题。
目前就 ...

你把5后面的改成上面能用的IO口试试呢!比如把5的D13改成上面能用的!
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-10-23
在线时间
2 小时
 楼主| 发表于 2016-10-24 10:49:07 | 显示全部楼层
silentk 发表于 2016-10-24 10:19
你把5后面的改成上面能用的IO口试试呢!比如把5的D13改成上面能用的!

修改了,还是不行啊!
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-10-23
在线时间
2 小时
 楼主| 发表于 2016-10-24 11:21:06 | 显示全部楼层
犯了低级错误,第一个按钮打开IO了,第二按钮就关闭了,如此重复。呵呵
问题解决,结贴了!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 06:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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