库函数的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条回答
屠鸡勇士李运好
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 ?

一周热门 更多>