OpenEdv-开源电子网

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

STm32的IDR 和 ODR 寄存器是连在一起的吗????

[复制链接]

10

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2018-5-8
在线时间
27 小时
发表于 2018-8-22 09:48:59 | 显示全部楼层 |阅读模式
5金钱
如图见于库函数的一个函数,就是读寄存器,为啥是读ODR,难道ODR和IDR在芯片内部是连在一起的??
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  return ((uint16_t)GPIOx->ODR);
}


望知道的坛友不吝赐教??????
dddddddd.png

最佳答案

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

是这样的,为了对GPIO进行操作,意法半导体在设计的时候对每组GPIO都用了一组寄存器来控制其工作状态。ODR(Output Data Register)是存储要输出的数据,IDR(Input Data Register)是存储引脚上接收到的数据,这部分可以参考STM32的数据手册: 另外不知道楼主所言“ODR IDR是否是连在一起的”应该是何种意思,逻辑上ODR IDR都是STM32片内RAM中的一个字节,具有固定的地址,前面的 GPIOx->ODR就是这个寻址操作;并且根 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-22 09:49:00 | 显示全部楼层
是这样的,为了对GPIO进行操作,意法半导体在设计的时候对每组GPIO都用了一组寄存器来控制其工作状态。ODR(Output Data Register)是存储要输出的数据,IDR(Input Data Register)是存储引脚上接收到的数据,这部分可以参考STM32的数据手册:

1.png
2.png


另外不知道楼主所言“ODR IDR是否是连在一起的”应该是何种意思,逻辑上ODR IDR都是STM32片内RAM中的一个字节,具有固定的地址,前面的 GPIOx->ODR就是这个寻址操作;并且根据数据手册,这两个寄存器在一个GPIO寄存器组里面还都是连续的:

4.png

对于指定的一个GPIO寄存器组也是有自己的内存地址的:
3.png


十六进制带我飞。
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-22 10:11:59 | 显示全部楼层
另,楼主提问的意思可能是为什么不读IDR。我觉得意法半导体应该是这样想的,如果要读取“送出去的引脚状态”,就是直接读这个ODR寄存器;而如果是想要读取“我把状态送出后,当前引脚上实际的电平状态”就需要读取IDR了。从这图上可以看到他们的操作回路还是有些不一样的。

5.png
十六进制带我飞。
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-8-22 10:32:18 | 显示全部楼层
本帖最后由 kvdong 于 2018-8-22 10:34 编辑

你确定你不是来搞笑的?
看看函数名啊,GPIO_ReadOutputData(),就是读输出寄存器数据,当然要读ODR了,有啥可奇怪的呢?
想读IDR的话用GPIO_ReadInputData()呀,库里同样提供了的。
==============================分割一下=================================
对不起,刚才的口气不是很好,如果你是个新人,那么这种研究库追根问底的精神很可贵,继续,坚持。
如果是个大佬故意开玩笑的,那就当我上面的话是互相调侃吧
回复

使用道具 举报

10

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2018-5-8
在线时间
27 小时
 楼主| 发表于 2018-8-22 10:41:57 | 显示全部楼层
kvdong 发表于 2018-8-22 10:32
你确定你不是来搞笑的?
看看函数名啊,GPIO_ReadOutputData(),就是读输出寄存器数据,当然要读ODR了,有 ...

眼瞎,有GPIO_ReadInputData,很少用库,最近有别的需要,刚好研究了一下
回复

使用道具 举报

10

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2018-5-8
在线时间
27 小时
 楼主| 发表于 2018-8-22 10:42:53 | 显示全部楼层
DreamWaterPro 发表于 2018-8-22 10:06
是这样的,为了对GPIO进行操作,意法半导体在设计的时候对每组GPIO都用了一组寄存器来控制其工作状态。ODR ...

明白嘎嘎嘎
回复

使用道具 举报

10

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2018-5-8
在线时间
27 小时
 楼主| 发表于 2018-8-22 10:45:36 | 显示全部楼层
kvdong 发表于 2018-8-22 10:32
你确定你不是来搞笑的?
看看函数名啊,GPIO_ReadOutputData(),就是读输出寄存器数据,当然要读ODR了,有 ...

眼瞎,没看到GPIO_ReadInputData
回复

使用道具 举报

10

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2018-5-8
在线时间
27 小时
 楼主| 发表于 2018-8-22 10:48:09 | 显示全部楼层
dscx05 发表于 2018-8-22 10:45
眼瞎,没看到GPIO_ReadInputData

还有一个比较诡异的是,比如别人设某个io口为上拉输入,是利用ODR对其上拉,手册中写到输出时 输出缓冲器被禁止,顺路请交一下
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-8-22 10:53:17 | 显示全部楼层
这样给你解释吧, 大多数情况ODR的值会==IDR, 但有的情况是可以不一样
例如, 在IIC时, DATA线设置为开漏, 当要读ACK时, 不需要把IO口设为输入, 只需直接读IDR的值即可, 此时ODR的值会是1, 但IDR的值不一定是1
回复

使用道具 举报

10

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2018-5-8
在线时间
27 小时
 楼主| 发表于 2018-8-22 11:14:31 | 显示全部楼层
edmund1234 发表于 2018-8-22 10:53
这样给你解释吧, 大多数情况ODR的值会==IDR, 但有的情况是可以不一样
例如, 在IIC时, DATA线设置为开 ...

我是想知道为啥会一样,有没手册的依据,或者原理图片什么的??
还有一个比较诡异的是,比如别人设某个io口为上拉输入,是利用ODR对其上拉,手册中写到输出时 输出缓冲器被禁止,顺路请交一下
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-8-22 11:19:04 | 显示全部楼层
dscx05 发表于 2018-8-22 10:48
还有一个比较诡异的是,比如别人设某个io口为上拉输入,是利用ODR对其上拉,手册中写到输出时 输出缓冲器 ...

没看明白你这句话想要表达什么。
IO口设置为输入时,输出缓冲器被禁止,也就是此时IO口对外是没有驱动能力的,如果设置为上下拉输入的话,则利用ODR相应位来区分是上拉还是下拉。由于输出缓冲器已经被禁止了,所以写ODR不会有输出。
IO口设置为输出时,输出缓冲器被激活,写入ODR相应位的状态被输出到IO口(高电平或低电平)。此时上下拉是被禁止的,不会出现什么冲突的情况。
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-8-22 12:26:30 | 显示全部楼层
dscx05 发表于 2018-8-22 11:14
我是想知道为啥会一样,有没手册的依据,或者原理图片什么的??
还有一个比较诡异的是,比如别人设某个 ...

3楼的图13不就是依据了么?
你说的是stm某个糸列, 忘记了是不是f0, 当IO为输入模式时, ODR作为是否上拉的寄存器。
我个人认为这只不过是为了省去一个上一下拉寄存器的空间而已
回复

使用道具 举报

10

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2018-5-8
在线时间
27 小时
 楼主| 发表于 2018-8-25 08:27:24 | 显示全部楼层
kvdong 发表于 2018-8-22 11:19
没看明白你这句话想要表达什么。
IO口设置为输入时,输出缓冲器被禁止,也就是此时IO口对外是没有驱动能 ...

令我不解的是,为啥输出缓冲器被禁止以后,ODR的值会拉的到输入
回复

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
发表于 2018-8-25 11:38:23 | 显示全部楼层
当你的IO配置为推挽输出模式时,对输出数据寄存器的读访问可以得到最后一次写的值。
回复

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
发表于 2018-8-25 11:43:32 | 显示全部楼层
本帖最后由 午夜狼嚎 于 2018-8-25 11:45 编辑
dscx05 发表于 2018-8-22 11:14
我是想知道为啥会一样,有没手册的依据,或者原理图片什么的??
还有一个比较诡异的是,比如别人设某个 ...

不会吧!ODR每位对应的是IO状态,怎么会扯到上下拉,ODR寄存器离上下拉电阻还隔着输出驱动器和MOS管呢。还有那个输出缓冲器怎么会被禁止
回复

使用道具 举报

10

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2018-5-8
在线时间
27 小时
 楼主| 发表于 2018-8-31 08:52:30 | 显示全部楼层
等我有空了再拿芯片试试,看别人的有疑问,自己不动手是解决不了疑问的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 14:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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