标题: 使用STM32H7的HAL库函数HAL_GPIO_ReadPin为什么可以读取输出脚的电平状态? [打印本页]

作者: 谭邹邹    时间: 2019-7-3 10:49
标题: 使用STM32H7的HAL库函数HAL_GPIO_ReadPin为什么可以读取输出脚的电平状态?
在库函数开发指南里说,该函数是用来读取IO脚的输入数据,也就是输入脚的高低电平,但是我用它来读取输出脚电平的时候,发现也能读取成功。这是为什么啊?每次我用HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_RESET)  ,这个库函数改变IO脚电平之后,再用HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 来读取,都可以成功读取出来,不是只能读输入脚吗?用来读输出为什么也可以?

QQ图片20190703104159.png (10.68 KB, 下载次数: 95)

初始化的IO配置

初始化的IO配置

QQ图片20190703104246.png (130.98 KB, 下载次数: 90)

HAL的函数使用说明

HAL的函数使用说明

作者: 鹏博士PBs    时间: 2019-7-3 11:46
GPIO调用函数
作者: cjm82    时间: 2019-7-4 13:09
HAL库没用过,这个函数可能是整合了3.5库中GPIO_ReadInputDataBitT和GPIO_ReadOutputDataBit, 前者是读相应管脚所对应的位输入寄存器状态后者则是读输出的.因为没用过HAL库,不敢妄下结论,你可以把相应函数的代码打开读读.
作者: 谭邹邹    时间: 2019-7-11 17:18
我打开来看了,这个库函数是读取输入脚寄存器的值。
函数原型是这个。
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  GPIO_PinState bitstatus;

  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));

  if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
  {
    bitstatus = GPIO_PIN_SET;
  }
  else
  {
    bitstatus = GPIO_PIN_RESET;
  }
  return bitstatus;
}
IDR寄存器按照HAL库手册说是输入数据
作者: 谭邹邹    时间: 2019-7-11 17:22
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  GPIO_PinState bitstatus;

  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));

  if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
  {
    bitstatus = GPIO_PIN_SET;
  }
  else
  {
    bitstatus = GPIO_PIN_RESET;
  }
  return bitstatus;
}
这个是库函数的原型。
读取的是IDR寄存器,按照HAL库手册说,这个寄存器是输入数据。而我所改变的输出脚,并且是推挽输出。
作者: guan8812    时间: 2020-3-3 16:39
亲爱的大大,
HAL库手册 中文版 能不能发一份给我 谢谢
作者: lovexulu    时间: 2020-3-4 16:39
在GPIO输出配置一节中有

● 在开漏模式时,对输入数据寄存器的读访问可得到 I/O 状态
● 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。
作者: fxlasxy    时间: 2021-11-13 10:36
求楼主大大的hal库函数开发指南




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1