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

2019-07-14 18:02发布

#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就成功读取了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
报纸弟弟麦花
1楼-- · 2019-07-16 17:43
 精彩回答 2  元偷偷看……
屠鸡勇士李运好
2楼-- · 2019-07-16 18:03
报纸弟弟麦花 发表于 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 ?
嘻嘻爱哈哈
3楼-- · 2019-07-16 23:58
这个函数应该不会存在这样的问题。
IO模拟I2C的话,个人建议将IO口配置成输入模式,再去读取端口输入电平,读完再切回输出。
如果这样的逻辑下还出现库函数和寄存器操作不一样的,那我也没什么好的建议了。呵呵。
冬冬5241
4楼-- · 2019-07-17 03:21
函数也是通过寄存器来达到目的的,现在的问题是,直接用寄存器正常,而用库函数不正常,还用怀疑其他啊,肯定是库函数方面的问题
屠鸡勇士李运好
5楼-- · 2019-07-17 07:39
冬冬5241 发表于 2018-9-6 13:26
函数也是通过寄存器来达到目的的,现在的问题是,直接用寄存器正常,而用库函数不正常,还用怀疑其他啊,肯定是库函数方面的问题

问题解决了,用库函数的话 多加点延迟就能读到数据了
lanziji
6楼-- · 2019-07-17 08:03
 精彩回答 2  元偷偷看……

一周热门 更多>