uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

今天碰到检测管脚电平的时候需要使用这个函数,不过对于

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

这两个函数有点分不清楚,后来理解了才知道

> uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
> //一次读取一组IO口中一个或几个管脚的输入状态
> //读取几个管脚的输入状态时,如果一个为1,则输出为1

返回的是引脚的高低电平状态(0或1)

> uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

一次读取一组IO口中所有管脚的输入状态
也就是函数返回的是寄存器GPIOx->IDR的值

这里只需要看函数就可以了解

GPIO_ReadInputDataBit

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;
}

(GPIOx->IDR & GPIO_Pin) 如果为真,代表就是有高电平输入
所以整句话意思就是如果有高电平输入,
则输出 bitstatus = (uint8_t)Bit_SET;
否则输出bitstatus = (uint8_t)Bit_RESET;
结合下边枚举可知

typedef enum
{ 
  Bit_RESET = 0,
  Bit_SET
}BitAction;

有高电平输入,
则输出 bitstatus = (uint8_t)Bit_SET=1;
否则输出 (uint8_t)Bit_RESET=0;

GPIO_ReadInputData

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

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

return ((uint16_t)GPIOx->IDR);

读取所有管脚的输入状态
返回的是寄存器GPIOx->IDR的值

关于引脚的输出电平状态也是一样的

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)

第一个检测一组IO口中一个或多个输出状态
第二个检测一组IO口中所有输出状态

你可能感兴趣的:(学习笔记)