OpenEdv-开源电子网

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

STM32F103设置上拉输入后GPIOE->IDR寄存器疑惑 PA按键有效PE key2按键无效

[复制链接]

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-6-1
在线时间
0 小时
发表于 2015-11-13 19:42:11 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]
[mw_shl_code=c,true]//战舰V2板 // GPIOE->ODR |= 0xf<<2;//上拉2345 //按我的理解设置上拉后 //IDR寄存器的值应该是xxxx xxxx xx11 11xx,为什么不能执行i=2;即为什么值不是xxxx xxxx xx11 11xx,不执行GPIOE->IDR &4 == 4这个if语句 //程序如下 #include "sys.h" #include "stm32f10x_map.h" #include "stm32f10x_nvic.h" #include "delay.h" int main(void) { u8 i=0; Stm32_Clock_Init(9);//系统时钟设置 //RCC->APB2ENR |= 9<<3; //使能PORTB和PORTE时钟,原子原句 RCC->APB2ENR |= 0x13 << 2; //改写使能PORTE PORTB PORTA时钟 GPIOB->CRL &= 0xFF0FFFFF;//原子原句 GPIOB->CRL |= 0x00300000;//原子原句 GPIOB->ODR |= 1<<5; //原子原句 //GPIOE->CRL &= 0xFF0FFFFF; //GPIOE->CRL |= 0x00300000; //改写成 GPIOE->CRL &= 0xFF0000FF;//改写PE5推挽,PE234上拉输入 GPIOE->CRL|=0X00388800; //1111B==0xfh GPIOE->ODR |= 0xf<<2;//上拉2345 //按我的理解设置上拉后 //IDR寄存器的值应该是xxxx xxxx xx11 11xx GPIOA->CRL&=0XFFFFFFF0;//PA0 设置成输入,默认下拉,原子原句 GPIOA->CRL|=0X00000008; delay_init(72); //延时函数初始化 /*原子按键初始化原句开始*/ //RCC->APB2ENR|=1<<2; //使能 PORTA 时钟 //RCC->APB2ENR|=1<<6; //使能 PORTE 时钟 //上边注释掉的两句,可以跟led的io初始化一起使能 //即10011B==0x13h代表PE PB PA,只需要左移两位,所以<<2 //GPIOA->CRL&=0XFFFFFFF0;//PA0 设置成输入,默认下拉 //GPIOA->CRL|=0X00000008; //GPIOE->CRL&=0XFFF000FF;//PE2~4 设置成输入 //GPIOE->CRL|=0X00088800; //GPIOE->ODR|=7<<2; //PE2~4 上拉 //上边注释掉的3句,可以和ledPE口初始化一起 /*按键初始化结束*/ while(1) { GPIOB->ODR &= !(1<<5);//LED0亮 GPIOE->ODR &= !(1<<5);//LED1亮 delay_ms(500);//闪烁 GPIOE->ODR |= 1<<5; delay_ms(500); GPIOB->ODR |= 1<<5; GPIOE->ODR &= !(1<<5); delay_ms(500); GPIOE->ODR |= 1<<5; delay_ms(500); if(GPIOA->IDR & 1)//key_up可以执行 { i=1; } else if((GPIOE->IDR & 0x0004)==4)//key2无论是否按键都不执行 { i=2; } else { i=0; } while(i==1) //下面按键执行结果,LED闪烁速度变化,可以忽略 { if((GPIOA->IDR & 1)==0) { i=0; break; } GPIOB->ODR &= !(1<<5); GPIOE->ODR &= !(1<<5); delay_ms(250); GPIOE->ODR |= 1<<5; delay_ms(250); GPIOB->ODR |= 1<<5; GPIOE->ODR &= !(1<<5); delay_ms(250); GPIOE->ODR |= 1<<5; delay_ms(250); } while(i==2) { if((GPIOE->IDR & 1<<2)==0) { i=0; break; } GPIOB->ODR &= !(1<<5); GPIOE->ODR &= !(1<<5); delay_ms(120); GPIOE->ODR |= 1<<5; delay_ms(120); GPIOB->ODR |= 1<<5; GPIOE->ODR &= !(1<<5); delay_ms(120); GPIOE->ODR |= 1<<5; delay_ms(120); } } }[/mw_shl_code]
[/mw_shl_code]

最佳答案

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

GPIOE->ODR &= !(1<<5); 问题找到了GPIOE->ODR &= !(1<<5);这个语句,虽然LED1可以亮灭,但也把PE234值设为0了,注释掉就好了。 改成GPIOE->ODR &= ~(1<<5);按位取反就对了。 我还得多巩固下C基础啊 研究了快一个礼拜了。 麻烦原子哥了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-6-1
在线时间
0 小时
 楼主| 发表于 2015-11-13 19:42:12 | 显示全部楼层
GPIOE->ODR &= !(1<<5);
问题找到了GPIOE->ODR &= !(1<<5);这个语句,虽然LED1可以亮灭,但也把PE234值设为0了,注释掉就好了。

改成GPIOE->ODR &= ~(1<<5);按位取反就对了。
我还得多巩固下C基础啊

研究了快一个礼拜了。
麻烦原子哥了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-11-13 20:27:58 | 显示全部楼层
外部电路如果有下拉或者接了其他外设,那就可能影响你的IO设置。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-6-1
在线时间
0 小时
 楼主| 发表于 2015-11-13 20:32:09 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
没有改动板子啊,你的例程下载进去就能正常执行
我是按你的例程修改,只是合并了LED和KEY io初始化,别的都没动
只不过想研究寄存器IDR,就试着读IDR寄存器操作了,结果keyup有效,PE口的按键就无效。
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-6-1
在线时间
0 小时
 楼主| 发表于 2015-11-13 20:43:11 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
//  GPIOE->ODR |= 0xf<<2;//上拉2345
//按我的理解设置上拉后
//IDR寄存器的值应该是xxxx xxxx xx11 11xx

设置2345上拉后,理论上读IDR寄存器是xxxx xxxx xx11 11xx这个值吗?
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-12-7
在线时间
60 小时
发表于 2019-12-17 21:45:06 | 显示全部楼层
正点原子 发表于 2015-11-13 20:27
外部电路如果有下拉或者接了其他外设,那就可能影响你的IO设置。

原子哥,我这里STM32和FPGA直连,写数据和地址没问题,读并行数据的时候IDR寄存器总全是0,端口设定的是上拉输入模式。如你所说,外部电路的存在会影响IO设置?? 我看到读取输入数据时可以将IO设定成开漏输出,把ODR全置1,再读IDR。我这样尝试了,还是不行。是不是跟FPGA本身有关系啊?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-21 17:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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