找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 20445|回复: 7
收起左侧

使用STM32H7的HAL库函数HAL_GPIO_ReadPin为什么可以读取输出脚的电平状态?

[复制链接]
ID:484801 发表于 2019-7-3 10:49 | 显示全部楼层 |阅读模式
在库函数开发指南里说,该函数是用来读取IO脚的输入数据,也就是输入脚的高低电平,但是我用它来读取输出脚电平的时候,发现也能读取成功。这是为什么啊?每次我用HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_RESET)  ,这个库函数改变IO脚电平之后,再用HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 来读取,都可以成功读取出来,不是只能读输入脚吗?用来读输出为什么也可以?

初始化的IO配置

初始化的IO配置

HAL的函数使用说明

HAL的函数使用说明
回复

使用道具 举报

ID:282095 发表于 2019-7-3 11:46 | 显示全部楼层
GPIO调用函数
回复

使用道具 举报

ID:388197 发表于 2019-7-4 13:09 | 显示全部楼层
HAL库没用过,这个函数可能是整合了3.5库中GPIO_ReadInputDataBitT和GPIO_ReadOutputDataBit, 前者是读相应管脚所对应的位输入寄存器状态后者则是读输出的.因为没用过HAL库,不敢妄下结论,你可以把相应函数的代码打开读读.
回复

使用道具 举报

ID:484801 发表于 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库手册说是输入数据
回复

使用道具 举报

ID:484801 发表于 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库手册说,这个寄存器是输入数据。而我所改变的输出脚,并且是推挽输出。
回复

使用道具 举报

ID:700794 发表于 2020-3-3 16:39 | 显示全部楼层
亲爱的大大,
HAL库手册 中文版 能不能发一份给我 谢谢
回复

使用道具 举报

ID:687694 发表于 2020-3-4 16:39 | 显示全部楼层
在GPIO输出配置一节中有

● 在开漏模式时,对输入数据寄存器的读访问可得到 I/O 状态
● 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。
回复

使用道具 举报

ID:980546 发表于 2021-11-13 10:36 | 显示全部楼层
求楼主大大的hal库函数开发指南
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表