Использование регистра ODR напрямую на STM32 - PullRequest
0 голосов
/ 29 мая 2019

Измените код для WriteLED (), чтобы напрямую использовать регистр ODR.Код должен прочитать текущее значение регистра и затем записать измененное значение в зависимости от того, какие светодиоды должны быть включены или выключены.

Пример кода, данный мне

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

1 Ответ

0 голосов
/ 29 мая 2019

Вы должны понимать побитовые операции C.Это ^ (исключающее ИЛИ), & (поразрядно и), | (поразрядно или)

Чтобы очистить бит GPIO->ODR &= ~pin_mask;

Чтобы установить бит GPIO->ODR |= pin_mask;

Это должно дать вам достаточно информации.

...