OpenEdv-开源电子网

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

STM32 GPIO输入上拉下拉的寄存器设置方法

[复制链接]

98

主题

408

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2010-12-14
在线时间
0 小时
发表于 2011-2-6 13:35:55 | 显示全部楼层 |阅读模式
   在Alientek的源码中的按键输入实验中有如下一段初始化代码:
void KEY_Init(void){
      RCC->APB2ENR|=1<<2;     //使能PORTA时钟
    GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入      
    GPIOA->CRL|=0X00000008;  
    GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入      
    GPIOA->CRH|=0X80800000;                   
    GPIOA->ODR|=1<<13;       //PA13上拉,PA0默认下拉
    GPIOA->ODR|=1<<15;       //PA15上拉
}
经常有用户问道,为什么端口设置为输入,然后还要对输出寄存器进行写操作, GPIOA->ODR|=1<<15;       //PA15上拉
在中文数据手册里面的确没有看到说明,下面是英文手册里面的(从网上找的):


即在将端口设置为上拉/下拉输入的状况下,是由将GPIOx->ODR相应位设置为0或1来设置为下拉输入还是上拉输入的。
希望openedv能给大家提供一个友好的技术交流平台!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

53

帖子

4

精华

高级会员

Rank: 4

积分
675
金钱
675
注册时间
2010-12-14
在线时间
8 小时
发表于 2011-2-7 09:40:21 | 显示全部楼层
 


我用的中文手册里有这说明。

STM32用户手册.pdf

15.94 MB, 下载次数: 6382

回复 支持 反对

使用道具 举报

5

主题

53

帖子

4

精华

高级会员

Rank: 4

积分
675
金钱
675
注册时间
2010-12-14
在线时间
8 小时
发表于 2011-2-7 09:49:48 | 显示全部楼层
0000(0)模拟输入,通常可用在AD采样
0100(4)浮空输入,如果有外部的上拉或下拉,则可以用这个
1000(8)上/下拉输入,使能内部上/下拉结构,使端口在空闲情况下置为某种电平,具体是某种电平就由GPIOx->ODR来决定。置1则高电平,置0则低电平。
回复 支持 反对

使用道具 举报

11

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2010-12-21
在线时间
0 小时
发表于 2011-2-24 19:36:47 | 显示全部楼层
回复【3楼】QiYuan:
------------------------------
非常感谢,看来手册还是没有看的那么细啊  
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-3-6
在线时间
0 小时
发表于 2011-3-23 15:55:58 | 显示全部楼层
顶!确实这样!
回复 支持 反对

使用道具 举报

83

主题

349

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2012-8-10
在线时间
13 小时
发表于 2012-10-6 10:11:34 | 显示全部楼层
回复【5楼】sailsmoon:
---------------------------------
多亏看到了
回复 支持 反对

使用道具 举报

17

主题

142

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2013-6-27
在线时间
0 小时
发表于 2013-7-5 20:15:14 | 显示全部楼层
嗯,稍微明白点了
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-8-8
在线时间
0 小时
发表于 2013-9-22 21:32:42 | 显示全部楼层
楼主上拉输入与下拉输入的区别是什么
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2013-9-15
在线时间
0 小时
发表于 2013-9-23 11:15:59 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2014-3-5
在线时间
0 小时
发表于 2014-4-25 18:18:33 | 显示全部楼层
回复【楼主位】张洋:
---------------------------------
为什么库函数中没有写odr,只这样配置了?
  GPIO_InitTypeDef GPIO_InitStructure;
//初始化KEY0-->GPIOA.13,KEY1-->GPIOA.15  上拉输入
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟

GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//PE2~4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

//初始化 WK_UP-->GPIOA.0   下拉输入
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉   
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2014-3-5
在线时间
0 小时
发表于 2014-4-25 18:37:48 | 显示全部楼层

回复【3楼】QiYuan:
---------------------------------
刚才仿真看了寄存器,odr为高。。有点不解
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-1-17
在线时间
6 小时
发表于 2014-9-26 17:50:10 | 显示全部楼层
回复【11楼】fangxiaoyanzhou:
---------------------------------
最后怎么解决的,我设置PB1为上拉输入时却出现一直为低电平!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-10-11
在线时间
0 小时
发表于 2014-10-15 10:47:17 | 显示全部楼层
回复【10楼】fangxiaoyanzhou:
---------------------------------
因为默认就是下拉,不用设置ODR。如果你需要上拉才设置ODR。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-10-11
在线时间
0 小时
发表于 2014-10-15 11:22:35 | 显示全部楼层
回复【11楼】fangxiaoyanzhou:
---------------------------------
你贴出来的仿真怎么是C口,程序中显示是B口的
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-7-31
在线时间
0 小时
发表于 2019-7-31 21:07:12 | 显示全部楼层
正确,确实没想到需要设置输出,不过中文手册也收写到
回复 支持 反对

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2019-5-21
在线时间
14 小时
发表于 2020-2-4 22:47:09 | 显示全部楼层
    if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
        {
          GPIOx->BRR = (((uint32_t)0x01) << pinpos);
        }

在库函数中,设置了IPD,GPIO_Init就会根据情况再次赋值上下拉。但是没有用ODR,用的是BRR和BSRR。
我觉得BRR和BSRR好处就是写的速度快,如果用ODR就存在读出来、然后与新的数据运算、赋值的过程,比较慢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 05:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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