STM32 HAL库详解(一):GPIO

stm32 对输入输出的控制是通过读写对应的寄存器来实现的。

控制gpio的寄存器可以看作是这样的结构体:

typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;

CRL与CRH储存输出频率与输入输出模式(CRL储存0-7号,CRH储存8-15号)

IDR是输入数据寄存器,储存了输入到该端口的寄存器,储存方式是如果引脚x输入1,则IDR的第x位为1,若输入0则第x位为0.

ODR是输出数据寄存器,储存了输出到该端口的寄存器,如果想让引脚x输出1,则在x为储存1,如果输出0则在x+8为储存1.

BSRR是置位数据寄存器,如果想让引脚x输出1,则在x为储存1,如果输出0则在x+8为储存1.


我们常用STM32CubeMX配置GPIO

而stm32CubeMX是通过HAL库来控制GPIO的

下面会通过详解HAL库中的具体代码解释这些寄存器


一、输入输出

输出:

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));

  if (PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = GPIO_Pin;
  }
  else
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;
  }
}

如果输出1,则在BSRR对应位置1,如果输出0,则在BSRR对应位+8置1,单片机会根据BSRR修改ODR从而输出指定信号。

输入:

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

如果输入1,那么IDR寄存器对应位就会置1,如果为0则置0.

还有一个翻转引脚输出:

<
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值