搜索
bottom↓
回复: 12

请教STM32通过寄存器获取GPIO状态的基本问题

[复制链接]

出3670入191汤圆

发表于 2024-2-3 16:49:59 | 显示全部楼层 |阅读模式
大家小年后一天好!

已知STM32操作gpio状态主要通过ODR、IDR、BSRR三个寄存器。

我现在的疑问是关于ODR的。在结构图中可以看到ODR是在状态输出控制路径上的。

如果一个引脚配置为GPIO输出模式,那么按道理我通过BSRR设置了引脚状态后,通过ODR寄存器获取状态是可以的啊,因为ODR寄存器是r/w都可以的。

我刚才测试了一下,通过ODR获取不到,而通过IDR就能正确获取。我理解应该是两个寄存器都能获取才对。

我的判断方法是

  1. if ((GPIOA->ODR & PIN) > 0) ...
复制代码


是我理解有误吗?

顺祝大家新年筹备工作顺利!

出0入89汤圆

发表于 2024-2-3 17:00:34 | 显示全部楼层
本帖最后由 youkebing 于 2024-2-3 17:07 编辑

仔细看看手册就懂了, 一个读的是输出状态,一个读的是输入状态

出20入22汤圆

发表于 2024-2-3 17:24:05 来自手机 | 显示全部楼层
读ODR不行,可能会被外部拉低

出130入129汤圆

发表于 2024-2-3 17:25:57 | 显示全部楼层
库函数都可以读取
  1. u8 GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
  2. {
  3.   u8 bitstatus = 0x00;

  4.   /* Check the parameters */
  5.   assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  6.   assert_param(IS_GET_GPIO_PIN(GPIO_Pin));
  7.   
  8.   if ((GPIOx->ODR & GPIO_Pin) != (u32)Bit_RESET)
  9.   {
  10.     bitstatus = (u8)Bit_SET;
  11.   }
  12.   else
  13.   {
  14.     bitstatus = (u8)Bit_RESET;
  15.   }
  16.   return bitstatus;
  17. }
复制代码

出110入26汤圆

发表于 2024-2-3 17:42:37 来自手机 | 显示全部楼层
正如3楼所说,ODR并不反映IO的状态

出0入18汤圆

发表于 2024-2-3 18:08:43 | 显示全部楼层
只有4楼看懂了楼主的问题。

LZ不是问的IO状态和输出值是不是一致,而是对于输出,通过IDR能读到引脚状态,ODR为什么不行?

通过BSRR肯定会改变ODR的,你打开寄存器看一下,如果ODR读不到置1的结果,应该是程序出了问题。

出1310入193汤圆

发表于 2024-2-3 18:26:22 来自手机 | 显示全部楼层
古二真   

出0入31汤圆

发表于 2024-2-3 18:45:38 | 显示全部楼层
管脚配置成输出状态后,其状态可以通过BSRR或ODR两个途径设置,ODR并不反映管脚状态。

出0入442汤圆

发表于 2024-2-3 19:14:47 | 显示全部楼层
gyzzg2030 发表于 2024-2-3 17:24
读ODR不行,可能会被外部拉低
(引用自3楼)

通常情况下mcu io的ODR寄存器直接挂在总线输出后面,是一个内部寄存器,只反映最后一次写入的值。io不管怎么拉都不会变。。类似的还包括TDR(三态控制)。只有读IDR时,才会从io进来数据。

出0入22汤圆

发表于 2024-2-3 21:46:24 | 显示全部楼层
如果IO  是OC 输出,不管你如何设置ODR,如果外面没上拉,你ODR读出来和实际的IO电平不一定对。

ODR 反应的是程序要求的输出状态。IDR 才是IO实际的状态。

出3670入191汤圆

 楼主| 发表于 2024-2-3 22:55:32 | 显示全部楼层
感谢大家热情回复。

发完贴就出去吃饭了,现在七荤八素的。我明天测试一下再回复。

出3670入191汤圆

 楼主| 发表于 2024-2-4 12:34:58 | 显示全部楼层
今天我又测试一下,实现现象确实如大家所说那样。

我昨天所遇到的问题也无法复现了,我是说,我把一个GPIO配置为输出状态来驱动一个BJT作为开关,按道理我用ODR也可以正确得到当前状态的,虽然用IDR更科学一点。昨天我感觉从ODR没正确读到,但今天就可以了。

所以bug一定是我脑子造成的。

不过经此讨论,对这几个寄存器的记忆更加深了。😌😌

出1310入193汤圆

发表于 2024-2-4 16:32:47 来自手机 | 显示全部楼层
驱动三极管,原理图看看。b基电阻多大呢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 20:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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