OpenEdv-开源电子网

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

关于CRH、CRL、ODR和IDR寄存器的使用总结

[复制链接]

19

主题

52

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2013-7-9
在线时间
0 小时
发表于 2013-7-20 18:01:21 | 显示全部楼层 |阅读模式
            

     一.CRHCRL的使用:fficeffice" />

       CRHCRL的使用基本相同,CRH用于控制GPIOXX表示A---G)的高8位(Pin15---Pin8,CRL用于控制GPIOXX表示A---G)的低8位Pin7----Pin0)。

      二.ODR的使用:

            1.

RCC->APB2ENR|=1<<2;    //使能PORTA时钟             

                    GPIOA->CRH&=0XFFFFFFF0;//清除该位原来的设置

                    GPIOA->CRH|=0X00000003;//PA8 推挽输出           

                    GPIOA->ODR|=1<<8;      //PA8 输出高

     由以上代码看出,PA8设置成了推挽输出。大家都知道一个端口可以输出高电平,也可以输出低电平,而GPIOA->ODR|=1<<8;这个表达式就把PA8设置成了在空闲的时候输出高电平;GPIOA->ODR|=0<<8;这个表达式,把PA8设置成了在空闲的时候输出低电平。

     如果想设置PA8为推挽输出,并且希望输出为低电平,可以不要这个表达式GPIOA->ODR|=0<<8;  ,因为系统会默认端口输出为低电平

         2.          
                  RCC->APB2ENR|=1<<2;    //使能PORTA时钟

                 GPIOA->CRH&=0XFF0FFFFF;      

                 GPIOA->CRH|=0X00800000; //PA13设置成上拉/下拉输入                      
                 GPIOA->ODR|=1<<13;        //PA13上拉

    由以上代码看出,PA13设置成了上拉输入,即输入高电平。大家都知道,一个端口设置成了输入模式,那么它可以输入高电平,也可以输入低电平。GPIOA->ODR|=1<<13;      这个表达式把PA13设置成了上拉模式,即表示在端口空闲的时候输入高电平;GPIOA->ODR|=0<<13;这个表达式把PA13设置成了下拉模式,即端口在空闲的时候输入低电平。

    如果想设置PA13为输入模式,并且希望输入低电平,可以不要这个表达式GPIOA->ODR|=0<<13;   ,因为系统会默认端口输入为低电平。

    三.IDR的使用:               

IDR是一个端口输入数据寄存器,只用了低16位。该寄存器为只读寄存器,并且只能以16位的形式读出。读出的值为对应IO口的状态。

 

 

 

注:IDR的使用我只知道这么多,具体的使用,我还没有实际操作过,我也很想知道IDR具体的使用,希望我在这里抛砖,能引来各位高手的玉!

关于CRH、CRL、ODR和IDR寄存器的使用总结.doc

26.5 KB, 下载次数: 3329

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

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-7-24
在线时间
1 小时
发表于 2014-7-24 16:47:24 | 显示全部楼层
回复【8楼】八角DA蜘蛛:
---------------------------------
YA 理解了
GPIOA->CRH&=0XFFFFFFF0;//清除该位原来的设置 
 GPIOA->CRH|=0X00000003;//PA8 推挽输出  
GPIO的高八位CRH 四位一端口 A8是CRH的最后四位 故写作 0xFFFFFFF0。
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-20 21:19:40 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

10

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-10-17
在线时间
0 小时
发表于 2013-12-3 16:22:42 | 显示全部楼层
茅塞顿开,感谢感谢
回复 支持 反对

使用道具 举报

7

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-2-19
在线时间
0 小时
发表于 2014-4-12 23:23:00 | 显示全部楼层
回复【楼主位】给力王海潮:
---------------------------------
  GPIOA->ODR|=1<<13;        //PA13上拉
为什么加上这句之后就是上拉了呢
一代龙影-KPL
回复 支持 反对

使用道具 举报

2

主题

35

帖子

0

精华

高级会员

Rank: 4

积分
533
金钱
533
注册时间
2014-5-17
在线时间
81 小时
发表于 2014-5-17 15:33:36 | 显示全部楼层
GPIOA->CRH&=0XFFFFFFF0;//清除该位原来的设置
 GPIOA->CRH|=0X00000003;//PA8 推挽输出 

为什么要先清除,再设置成推挽?直接用第二行不可以吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-17 20:55:46 | 显示全部楼层
 回复【5楼】 zhangfj2010 :
---------------------------------
如果原来:GPIOA->CRH=0XFFFFFFFF; 
你设置: GPIOA->CRH|=0X00000003 
你觉得最后CRH的值是多少?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

35

帖子

0

精华

高级会员

Rank: 4

积分
533
金钱
533
注册时间
2014-5-17
在线时间
81 小时
发表于 2014-5-22 10:14:23 | 显示全部楼层
呵呵,明白了。不是2bit,是4bit都被改变
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-7-24
在线时间
1 小时
发表于 2014-7-24 15:11:45 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
GPIOA->CRH&=0XFFFFFFF0;//清除该位原来的设置
 GPIOA->CRH|=0X00000003;//PA8 推挽输出 
//
GPIOA->CRH&=0XFF0FFFFF;      
GPIOA->CRH|=0X00800000; //PA13设置成上拉/下拉输入
//
原子老哥,我是初学者,想问下怎么确定哪一位需要被重新设置?
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-9-2
在线时间
6 小时
发表于 2014-9-16 14:47:51 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2013-9-23
在线时间
0 小时
发表于 2015-3-17 15:54:01 | 显示全部楼层
看了楼主的文章受益匪浅,学到了很多知识,先谢谢楼主。不过有一点疑问,GPIOA->ODR|=1<<8;这个表达式就把PA8设置成了在空闲的时候输出高电平,这是对的,但是GPIOA->ODR|=0<<8;把PA8设置成了在空闲的时候输出低电平,觉得不对哦,如果原来ODR的值时1,0和1或之后还是1哦,这就不是把PA8设置成了在空闲的时候输出低电平,PA8输出的仍然是高电平。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
49
金钱
49
注册时间
2014-3-19
在线时间
8 小时
发表于 2015-5-10 16:37:05 | 显示全部楼层
回复【9楼】八角DA蜘蛛:
---------------------------------
给力!
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-7-11
在线时间
0 小时
发表于 2015-7-16 10:18:21 | 显示全部楼层
10楼说的有道理,我是初学者,还有个疑问,如果有两个口(如PA8和PA10)要输出高电平怎么办呢?或者一个要输出高一个要输出低怎么办呢?
努力改变命运,汗水成就理想
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-7-23
在线时间
3 小时
发表于 2015-7-23 10:44:54 | 显示全部楼层
能问下我的为什么出错么

回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-8-26
在线时间
0 小时
发表于 2015-8-30 13:22:42 | 显示全部楼层
回复【13楼】MZJ:
---------------------------异或
回复 支持 反对

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-4-13
在线时间
0 小时
发表于 2015-8-30 20:46:58 | 显示全部楼层
感谢分享!!!
回复 支持 反对

使用道具 举报

11

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-9-18
在线时间
1 小时
发表于 2015-9-28 10:47:04 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
如果设置了PB5为推挽输出。没有设置他的高低电平,然而在IDR上PB5默认是1还是0?这个问题我想了好久了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-28 22:46:24 | 显示全部楼层
回复【17楼】只 筷:
---------------------------------
0
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
332
金钱
332
注册时间
2016-11-3
在线时间
49 小时
发表于 2016-11-9 16:33:41 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

19

帖子

0

精华

高级会员

Rank: 4

积分
729
金钱
729
注册时间
2016-7-7
在线时间
86 小时
发表于 2016-11-14 18:04:38 | 显示全部楼层
Thank you
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-7-9
在线时间
13 小时
发表于 2017-2-13 16:48:21 | 显示全部楼层
不赖!
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2018-9-23
在线时间
21 小时
发表于 2018-9-27 09:56:46 | 显示全部楼层
对于小白的我来说  看完楼主的分享  一下子明白了  感谢楼主的分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 00:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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