IvanNauka
@IvanNauka

Можете объяснить код на STM32?

MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
  uint8_t led_state = 0x02;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  HAL_GPIO_WritePin(GPIOE, 0xFF00, GPIO_PIN_RESET);
	   HAL_GPIO_WritePin(GPIOE, led_state << 8, GPIO_PIN_SET);
	   HAL_Delay(5000);
	   led_state = led_state >> 1 | led_state << 7;
	   /* USER CODE BEGIN 3 */
	   }
  /* USER CODE END 3 */
}

Здравствуйте, объясните пожалуйста простецкий год из учебного пособия. В наличии STM32F303VC Discovery. На плате светодиоды с PE8-PE15.65db2b79b2df2973744059.png
Данный код зажигает светодиод в последовательности PE9,PE8,PE15 и тд.
Вопрос следующий:
1) uint8_t led_state = 0x03; Данной командой мы завели переменную, которая равна 3, что под этим подразумевается? Если изменить это число, то изменяется шаг включение светодиода и одновременно включается PE9 и PE8. Не очень понимаю
2)HAL_GPIO_WritePin(GPIOE, led_state << 8, GPIO_PIN_SET); Это я так понимаю мы сначала устанавливаем самый первый светодиод, т.е. 8, но на практике ни так.
3) led_state = led_state >> 1 | led_state << 7; Эту строку совсем не понимаю. Мы сначала сдвигает светодиод вправо, т.е. до 9 и тут же влево на 7. И эта команда зажигает одновременно два светодиода. Вот она меня особенно вводит в ступор. А в совокупности с uint8_t led_state = 0x02; становится совсем не понятно.
Данный код можно само собой интерпретировать значительно проще через последовательность и без uint8_t led_state = 0x03;, но хочется разобраться именно в нем.
  • Вопрос задан
  • 242 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
uint8_t led_state = 0x03; Данной командой мы завели переменную, которая равна 3

В коде написано 2.

что под этим подразумевается?

2 -- это вот такое 8-битное двоичное число: 00000010. А если 2 заменить на 3, то число станет таким: 00000011. Улавливаешь связь с количеством и номерами включенных светодиодов?

HAL_GPIO_WritePin(GPIOE, led_state << 8, GPIO_PIN_SET); Это я так понимаю мы сначала устанавливаем самый первый светодиод, т.е. 8, но на практике ни так.

Нет, светодиоды на схеме подключены к битам 8..15, а led_state ты выше видел какое. Этой командой мы сдвигаем биты 0..7 led_state в биты 8..15.

led_state = led_state >> 1 | led_state << 7;Эту строку совсем не понимаю.

Это циклический сдвиг вправо на 1. Т.е. биты "выдвигаемые" вправо за пределы led_state появляются слева.
т.е. двоичное число abcdefgh превращается в 0abcdefg | h0000000 = habcdefg.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Изучайте двоичную арифметику и битовые операции в C.
https://learn.microsoft.com/ru-ru/cpp/c-language/c...
https://learn.microsoft.com/ru-ru/cpp/c-language/b...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы