OpenEdv-开源电子网

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

这两句话是什么意思?寄存器不太懂

[复制链接]

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
发表于 2016-8-19 11:20:27 | 显示全部楼层 |阅读模式
1金钱
#define SDA_IN() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}

最佳答案

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

楼主在用MPU6050吧,这是原子哥6050的例程。 #define SDA_IN() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8CRH|=8CRH|=3CRH|=3
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

281

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2504
金钱
2504
注册时间
2015-8-17
在线时间
383 小时
发表于 2016-8-19 11:20:28 | 显示全部楼层
楼主在用MPU6050吧,这是原子哥6050的例程。
#define SDA_IN() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}这句话的意思是把PC11引脚设置为上拉/下拉输入模式 1.png
2.png
先看第一句话GPIOC->CRH&=0XFFFF0FFF;把第12到15位清零,再看第2句话GPIOC->CRH|=8<<12;就是0x08左移12位,也就是二进制的00001000 左移12位;得到的结果就是第15位为1;
而第13和第12位也就都为0,也就是说MODE[1:0]==00这个条件成立,所以设置为了输入模式,在这个模式下,CNFy[1:0]==10,也就是设置为上拉/下拉模式,正好是IIC接收数据所要的。

#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}这句话的意思是把设置为推挽输出。
GPIOC->CRH&=0XFFFF0FFF;把第12到15位清零,GPIOC->CRH|=3<<12;就是0x03左移12位,也就是二进制的00000011 左移12位;得到的结果就是第13位和第12位为1;而第13和第12位也就都为1,也就是说MODE[1:0]>00这个条件成立,所以设置为了输出模式,最大速度50MHz,在这个模式下,CNFy[1:0]==00,也就是设置为通用推挽输出模式,正好是IIC发送数据所要的。
要学会看数据手册啊。
做事的原则:
1.每个问题重复三遍、研究三遍后再提问,直接得到答案的人什么都没学会。
2.做事要有始有终,感谢那些帮助自己解决问题的人,把解决的方法总结起来。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11541
金钱
11541
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-8-19 11:25:40 | 显示全部楼层

宏定义,
SDA_IN()表示把SDA管脚设置为输入状态,后面大括号是具体的寄存器操作语句。
下一句类似。


回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-8-19 11:28:03 | 显示全部楼层
xuande 发表于 2016-8-19 11:25
宏定义,
SDA_IN()表示把SDA管脚设置为输入状态,后面大括号是具体的寄存器操作语句。
下一句类似。

可以用库函数代替吗?
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-8-19 11:29:12 | 显示全部楼层
怎么用库函数代替啊
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-8-19 11:57:39 | 显示全部楼层
为什么没有I2C的库房的操作的例程?
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-8-19 12:32:02 | 显示全部楼层
a295055641 发表于 2016-8-19 11:57
为什么没有I2C的库房的操作的例程?

http://www.openedv.com/thread-71743-1-1.html这里,库和寄存器结合方式
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

1

主题

140

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2016-8-15
在线时间
20 小时
发表于 2016-8-19 12:32:33 | 显示全部楼层
宏定义
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-8-19 13:38:40 | 显示全部楼层
八度空间 发表于 2016-8-19 12:32
http://www.openedv.com/thread-71743-1-1.html这里,库和寄存器结合方式

我现在就是这两句话的问题,这两段代码是不是把GPIOC一个设置为输出模式一个是输入模式?    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
            GPIO_Init(GPIOA, &GPIO_InitStructure);是不是跟GPIO_Init一样的?
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-16
在线时间
30 小时
发表于 2016-8-19 14:00:43 | 显示全部楼层
a295055641 发表于 2016-8-19 13:38
我现在就是这两句话的问题,这两段代码是不是把GPIOC一个设置为输出模式一个是输入模式?    GPIO_InitSt ...

第一个配置为上拉/下拉输入模式  ; 第二个配置为通用推挽输出模式,最大速度50MHz。
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-8-19 14:03:48 | 显示全部楼层
XXDDDGS 发表于 2016-8-19 14:00
第一个配置为上拉/下拉输入模式  ; 第二个配置为通用推挽输出模式,最大速度50MHz。

那我用库函数来代替也行吧,主要是寄存器不熟悉,我用的是STM32F207的芯片
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-8-19 14:09:08 | 显示全部楼层
STM32F207没有CRH寄存器该怎么配置
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-8-19 14:10:35 | 显示全部楼层
a295055641 发表于 2016-8-19 14:03
那我用库函数来代替也行吧,主要是寄存器不熟悉,我用的是STM32F207的芯片

他这个配置的是所有的GPIOC的吗?
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-8-19 15:42:29 | 显示全部楼层
wszdxmh 发表于 2016-8-19 15:25
楼主在用MPU6050吧,这是原子哥6050的例程。
#define SDA_IN() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8CRH ...

刚刚设置好了F2的寄存器没有CRH!
回复

使用道具 举报

22

主题

131

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-6
在线时间
49 小时
 楼主| 发表于 2016-8-19 15:43:14 | 显示全部楼层
#define SDA_IN()  {GPIOC->MODER &= 0xFFCFFFFF;GPIOF->MODER |= 0x00000000;}
#define SDA_OUT() {GPIOC->MODER &= 0xFFCFFFFF;GPIOF->MODER |= 0x00100000;}
F2的寄存器好像不一样  我觉得应该这样配置
回复

使用道具 举报

25

主题

281

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2504
金钱
2504
注册时间
2015-8-17
在线时间
383 小时
发表于 2016-8-19 15:57:15 | 显示全部楼层
a295055641 发表于 2016-8-19 15:43
#define SDA_IN()  {GPIOC->MODER &= 0xFFCFFFFF;GPIOF->MODER |= 0x00000000;}
#define SDA_OUT() {GPIOC ...

没用过F2,自己试一下就知道了
做事的原则:
1.每个问题重复三遍、研究三遍后再提问,直接得到答案的人什么都没学会。
2.做事要有始有终,感谢那些帮助自己解决问题的人,把解决的方法总结起来。
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-3-16
在线时间
30 小时
发表于 2016-8-20 09:52:04 | 显示全部楼层
a295055641 发表于 2016-8-19 14:03
那我用库函数来代替也行吧,主要是寄存器不熟悉,我用的是STM32F207的芯片

调用相应的库函数也是可以的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-1 02:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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