STM32/STM8技术william hill官网
直播中

胡卫伟

7年用户 285经验值
私信 关注
[问答]

库函数的GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)读IO口有时候会读不到

#define SDA_read      GPIOE->IDR  & GPIO_Pin_3 //GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)

我用库函数的GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)这个来读IO口,做了几天发现 居然有的时候会读不到。但是只要改成GPIOE->IDR  & GPIO_Pin_3
它就能正常读到了 。


调试进去一看
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  uint8_t bitstatus = 0x00;

  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GET_GPIO_PIN(GPIO_Pin));

  if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
  {
    bitstatus = (uint8_t)Bit_SET;
  }
  else
  {
    bitstatus = (uint8_t)Bit_RESET;
  }
  return bitstatus;
}
就没差别 ,可是死活读不到 只要一换成 GPIOE->IDR  & GPIO_Pin_3就成功读取了

回帖(28)

胡卫伟

2018-9-6 09:33:31
   //I2C  SDA(PE3) SCL(PE2)
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //
    GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_UP;  //
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;  /
                GPIO_Init(GPIOE, &GPIO_InitStructure);
举报

胡卫伟

2018-9-6 09:48:43
上了配置
举报

余少虹

2018-9-6 10:04:25
确实感觉莫名其妙的。。。帮顶
举报

谭子薇

2018-9-6 10:15:56
我记得IIC的引脚不能拿来直接用的,内部上拉是没用的,如果要用,还是外部 上拉
举报

孙婷婷

2018-9-6 10:26:19
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  

只设置这2个试试。
举报

胡卫伟

2018-9-6 10:45:53
引用: 曹志静1314 发表于 2018-9-6 10:28
我记得IIC的引脚不能拿来直接用的,内部上拉是没用的,如果要用,还是外部 上拉

哥,我要是没接上拉 ,我能读的到应答信号吗?我肯定是接了外部上拉的
举报

胡卫伟

2018-9-6 10:51:12
引用: TOPCB 发表于 2018-9-6 10:38
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  

试过了,可能电池没电的时候,用库函数读不出来吧 用寄存器就可以
举报

孙婷婷

2018-9-6 11:01:04
库也是读取的寄存器,理论是一样的。这样只能是仿真一下,看看他走到函数里面执行到哪儿跳出了。
举报

胡卫伟

2018-9-6 11:13:05
引用: TOPCB 发表于 2018-9-6 11:13
库也是读取的寄存器,理论是一样的。这样只能是仿真一下,看看他走到函数里面执行到哪儿跳出了。

我死死用万用表量着它的 3.3V 它硬是读出为0 换了寄存器就读出为1  纠结的我。。。
举报

王健

2018-9-6 11:26:32
时不时你那里配置的出了问题程序没有执行配置就返回了啊?
举报

何秀珍

2018-9-6 11:33:19
你好像把PE2,PE3设置成输出了:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; ;
举报

孙婷婷

2018-9-6 11:51:59
引用: ctwewer 发表于 2018-9-6 11:45
你好像把PE2,PE3设置成输出了:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; ;

楼主说按我改的也不行。我的模拟I2C就这样配置的。前面留贴有。
举报

袁富存

2018-9-6 12:06:27
那就是你的库函数的问题了
举报

蔡彦壁

2018-9-6 12:18:35
官方库的bug,很明显 GPIOx->IDR & GPIO_Pin,在GPIO_Pin = 0 的时候,这句话读出来的值永远都是0.   (xxxxx & 0) == 0,这是&计算的基本常识.


if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
  {
    bitstatus = (uint8_t)Bit_SET;
  }

改为如下测试:

if (((GPIOx->IDR >> GPIO_Pin) & 0x01) != (uint32_t)Bit_RESET)  
  {  
    bitstatus = (uint8_t)Bit_SET;  
  }  
举报

胡卫伟

2018-9-6 12:36:18
引用: 报纸弟弟麦花 发表于 2018-9-6 12:30
官方库的bug,很明显 GPIOx->IDR & GPIO_Pin,在GPIO_Pin = 0 的时候,这句话读出来的值永远都是0.   (xxxxx & 0) == 0,这是&计算的基本常识.

#define GPIO_Pin_0                 ((uint16_t)0x0001)  /* Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /* Pin 1 selected */
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /* Pin 2 selected */
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /* Pin 3 selected */
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /* Pin 4 selected */
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /* Pin 5 selected */
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /* Pin 6 selected */
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /* Pin 7 selected */
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /* Pin 8 selected */
#define GPIO_Pin_9                 ((uint16_t)0x0200)  /* Pin 9 selected */
#define GPIO_Pin_10                ((uint16_t)0x0400)  /* Pin 10 selected */
#define GPIO_Pin_11                ((uint16_t)0x0800)  /* Pin 11 selected */
#define GPIO_Pin_12                ((uint16_t)0x1000)  /* Pin 12 selected */
#define GPIO_Pin_13                ((uint16_t)0x2000)  /* Pin 13 selected */
#define GPIO_Pin_14                ((uint16_t)0x4000)  /* Pin 14 selected */
#define GPIO_Pin_15                ((uint16_t)0x8000)  /* Pin 15 selected */
#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /* All pins selected */
哪里来的 0 ?
举报

李雨坤

2018-9-6 12:54:44
这个函数应该不会存在这样的问题。
IO模拟I2C的话,个人建议将IO口配置成输入模式,再去读取端口输入电平,读完再切回输出。
如果这样的逻辑下还出现库函数和寄存器操作不一样的,那我也没什么好的建议了。呵呵。
举报

袁富存

2018-9-6 13:14:04
函数也是通过寄存器来达到目的的,现在的问题是,直接用寄存器正常,而用库函数不正常,还用怀疑其他啊,肯定是库函数方面的问题
举报

胡卫伟

2018-9-6 13:33:56
引用: 冬冬5241 发表于 2018-9-6 13:26
函数也是通过寄存器来达到目的的,现在的问题是,直接用寄存器正常,而用库函数不正常,还用怀疑其他啊,肯定是库函数方面的问题

问题解决了,用库函数的话 多加点延迟就能读到数据了
1 举报

郝汉

2018-9-6 13:44:42
本帖最后由 王建 于 2014-12-17 09:28 编辑

GPIO_ReadInputDataBit换成
GPIO_ReadInputData
看看
举报

更多回帖

发帖
×
20
完善资料,
赚取积分