首页 > 解决方案 > STM32上直接使用ODR寄存器

问题描述

修改 WriteLED() 的代码以直接使用 ODR 寄存器。代码应读取寄存器的当前值,然后根据要打开或关闭的 LED 写回修改后的值。

给我的示例代码

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->ODR ˆ= GPIO_Pin;
}

需要修改的代码

WriteLED (uint8_t LED, uint8_t State)
{
  // Check for correct state
 if ((State != LED_OFF) && (State != LED_ON))
  {
    return;
  }

  // Turn on/off the LED
  switch (LED)
    {
    case 'L':
      HAL_GPIO_WritePin (LD4_GPIO_Port, LD4_Pin, State);
      break;
    case 'T':
      HAL_GPIO_WritePin (LD3_GPIO_Port, LD3_Pin, State);
      break;
    case 'B':
      HAL_GPIO_WritePin (LD6_GPIO_Port, LD6_Pin, State);
      break;
    case 'R':
      HAL_GPIO_WritePin (LD5_GPIO_Port, LD5_Pin, State);
      break;
    }

  return;
}

输出到 ODR 寄存器时,上面的代码应该是什么样子

标签: cstm32gpio

解决方案


您需要了解 C 位运算。这三个是^(异或),&(按位与),|(按位或)

清除一点 GPIO->ODR &= ~pin_mask;

设置一点 GPIO->ODR |= pin_mask;

这应该给你足够的信息。


推荐阅读