OpenEdv-开源电子网

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

请问对于一组GPIO口,将IO口设置为输入模式的时候,怎么一下读书这组IO口的所有输入值?

[复制链接]

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
发表于 2014-8-23 18:23:04 | 显示全部楼层 |阅读模式
5金钱

能否用一句语句,读出一组IO口的所有输入值?

最佳答案

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

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2014-8-23 18:23:05 | 显示全部楼层
回复

使用道具 举报

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
 楼主| 发表于 2014-8-24 08:34:24 | 显示全部楼层
回复【2楼】as564335sa:
---------------------------------
默认输入的是高吗??
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-7-13
在线时间
0 小时
发表于 2014-8-24 08:59:26 | 显示全部楼层
回复【3楼】why always me:
---------------------------------
大多数的IO口初始化为高阻输入,但也有例外如与JTAG相关的IO口。至于输入寄存器的值则与IO口的实际电平一致。建议楼主先看看STM32手册上讲解GPIO的章节。
回复

使用道具 举报

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
 楼主| 发表于 2014-8-24 09:51:51 | 显示全部楼层
回复【4楼】zhululai:
---------------------------------
看过了,但是也不是很了解。
比如在键盘实验的时候,PA.15和PA.0都作为了输入使用,但是一个是上拉输入一个是下拉输入,
例程里面都是对PA.15和PA.0进行的位判断,分开判断两个按键状态
我现在想能否用一个语句就判断PA.15和PA.0其中一个是否有按下、
比如在51单片机的时候,可以用P0!=0XFF来判断有按键按下,
然后可以用 if(P0==0XFE)来判断是否P0.0按下了
回复

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2014-8-24 12:08:17 | 显示全部楼层
回复【5楼】why always me:
---------------------------------
用与运算或者或运送取出对应的位判断就好了,好好看看寄存器就知道了
回复

使用道具 举报

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
 楼主| 发表于 2014-8-24 14:22:04 | 显示全部楼层
回复【6楼】as564335sa:
---------------------------------
嗯,谢谢、
我还想问一下怎么把PA.13 A.14 .15和PB.3 B.4都作为普通IO口来使用啊?
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试  我加了这句话没作用啊
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-7-13
在线时间
0 小时
发表于 2014-8-25 13:34:46 | 显示全部楼层
回复【7楼】why always me:
---------------------------------
通过GPIOx_CRL和GPIOx_CRH这两组寄存器,可以将IO口配置为需要的输入输出模式。另外,当除能JTAG,使能SWD时,SWD必须占用PA.13和PA.14,因而只能使用PA.15、PB.3和PB.4。
回复

使用道具 举报

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
 楼主| 发表于 2014-8-25 16:12:05 | 显示全部楼层
回复【8楼】zhululai:
---------------------------------
谢谢,我还想问下,
我自己做了四个按键,公共端接地,然后输入是上拉模式的时候一切正常。
当公共端接VCC,然后输入模式为下拉模式的时候,总会有一个或者两个端口不正常,请问怎么回事呢?
回复

使用道具 举报

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
 楼主| 发表于 2014-8-25 16:15:26 | 显示全部楼层
回复【8楼】zhululai:
---------------------------------
//按键初始化函数 
void KEY_Init(void)
{     
     GPIO_InitTypeDef GPIO_InitStructure; 
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA,时钟

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_All;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;  //设置成下拉输入
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA



void KEY_Scan(void)
{

    if(KEY0==1)
        GPIO_ResetBits(GPIOB,GPIO_Pin_12);
    if(KEY1==1)
        GPIO_ResetBits(GPIOB,GPIO_Pin_13);
    if(KEY2==1)
        GPIO_ResetBits(GPIOB,GPIO_Pin_14);
    if(KEY3==1)
        GPIO_ResetBits(GPIOB,GPIO_Pin_15);

}

#define KEY0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)
#define KEY2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)
#define KEY3 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)

现在我一上电,就会有PB14,PB.15两个灯是亮的(不正常),PB.13和PB.15只有按键的时候才会亮(正常)
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-7-13
在线时间
0 小时
发表于 2014-8-26 13:25:30 | 显示全部楼层
回复【10楼】why always me:
---------------------------------
分别单独初始化PA.4~PA.7,并且KEY_Scan增加else分支,试试看。另外,建议使用JTAG单步调试,通过查看变量和寄存器,可以很容易找出错误。
回复

使用道具 举报

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
 楼主| 发表于 2014-8-26 14:11:56 | 显示全部楼层
回复【11楼】zhululai:
---------------------------------
试过,还是不行
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-7-13
在线时间
0 小时
发表于 2014-8-26 15:40:33 | 显示全部楼层
回复【12楼】why always me:
---------------------------------
增加这一句试试:
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
回复

使用道具 举报

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
 楼主| 发表于 2014-8-26 15:42:03 | 显示全部楼层
回复【13楼】zhululai:
---------------------------------
输入模式也需要这语句吗?
回复

使用道具 举报

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
 楼主| 发表于 2014-8-26 15:44:31 | 显示全部楼层
回复【13楼】zhululai:
---------------------------------
试过了,没什么变化
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-7-13
在线时间
0 小时
发表于 2014-8-26 15:45:43 | 显示全部楼层
回复【14楼】why always me:
---------------------------------
从C语言的角度来说,GPIO_InitStructure是一个局部变量,如果GPIO_InitStructure.GPIO_Speed没有赋值,则GPIO_InitStructure.GPIO_Speed的值不确定,那么GPIO_Init()没有进行容错处理可能引起问题。
回复

使用道具 举报

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
 楼主| 发表于 2014-8-26 15:50:07 | 显示全部楼层
回复【16楼】zhululai:
---------------------------------
嗯,我在试试吧。
是不是平时用下拉输入的时候比较少啊,?
回复

使用道具 举报

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
 楼主| 发表于 2014-8-26 15:54:40 | 显示全部楼层
回复【16楼】zhululai:
---------------------------------
我现在把IO口换了一下,按键换成了PB4-PB.7 LED灯的换成PA.1-PA.4就正常。
奇怪呀
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-7-13
在线时间
0 小时
发表于 2014-8-26 15:56:36 | 显示全部楼层
回复【17楼】why always me:
---------------------------------
其实,解决问题最好的方法是单步调试,这里也只能给你一些方向性的建议。
回复

使用道具 举报

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
 楼主| 发表于 2014-8-26 16:02:55 | 显示全部楼层
回复【19楼】zhululai:
---------------------------------
单调试我试过,当进入到key_scan()函数的时候,
我是用if语句判断是否有按键按下,
void key_scan()
{
    if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4))==1)
        GPIO_ResetBits(GPIOB,GPIO_Pin_2);
    if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5))==1)
        GPIO_ResetBits(GPIOB,GPIO_Pin_3);
    if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6))==1)
        GPIO_ResetBits(GPIOB,GPIO_Pin_4);
    if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))==1)
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
前面两个if语句不会进入,但是到了后面两个就会进入了。
我也就不知道哪里出错了,
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2015-5-21
在线时间
1 小时
发表于 2015-6-10 11:22:49 | 显示全部楼层
对于一个GPIO口,将IO口设置为输入模式的时候,怎么一下读书这一个IO口的输入值?
回复

使用道具 举报

2

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2016-10-21
在线时间
88 小时
发表于 2017-3-15 15:37:36 | 显示全部楼层
fei88808 发表于 2015-6-10 11:22
对于一个GPIO口,将IO口设置为输入模式的时候,怎么一下读书这一个IO口的输入值?

请问这个问题您解决了吗。。。。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 18:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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