c - 在STM32上直接使用ODR寄存器

标签 c stm32 gpio

修改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 寄存器时应该是什么样子

最佳答案

您需要了解 C 位运算。三者分别是^(异或)、&(按位与)、|(按位或)

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

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

这应该为您提供足够的信息。

关于c - 在STM32上直接使用ODR寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56351752/

相关文章:

c - 将地址缓冲区从一个文件返回到另一个文件

c - 如何从另一个c文件调用静态函数?

c - STM32 USB VCP(虚拟串口)

c - 如何将 C#defines 包含在 .icf 链接器文件中?

java - Odroid N2 "getGpioList()"返回空数组,无法访问 gpio 端口

c - 尝试读取目录中的文件并将其写入列表

c - 从sql表达式中提取表

c - UART 至 UART 桥接器 STM32

linux - 为什么树莓派驱动中有 `gpio_request`而不是 `request_region`?

python - 如果 GPIO 输入改变,倒计时线程 RPi 停止