Я пытаюсь научиться писать драйверы для контактов GPIO в STM32F4 Discovery. Я просматривал учебники и наткнулся на эту строку:
static void hal_gpio_configure_pin_mode (GPIO_TypeDef *GPIOx, uint16_t pin_no, uint32_t mode)
{
GPIOx->MODER |= (mode << (2* pin_no));
}
Я относительно новичок во встроенных системах и не знаю, что делает GPIOX->MODER |= (mode << (2* pin_no));
. Кроме того, я не знаю, почему pin_no 16-битный, а режим 32-битный. Я знаю, что ‹‹ — это побитовый оператор сдвига влево. Но я все еще не понимаю полного контекста.
Кто-нибудь может все это объяснить?
pin_no
иmode
должны иметь один и тот же тип. Их значения не используются вместе, как это происходит в таких операциях, как сложение или умножение. Скорее,pin_no
— это просто индекс, используемый (с 2) для вычисления того, насколько нужно сдвинуть значение (mode
). Количество битов для сдвига просто должно быть числом; он не обязательно должен быть того же типа, что и перемещаемая вещь. Таким образом, в то время как такие операторы, как+
и*
, требуют, чтобы их операнды были преобразованы в один и тот же тип, оператор<<
может иметь разные типы слева и справа. - person Eric Postpischil   schedule 19.10.2017