void gpio_set_output_options(u32 gpioport, u8 otype, u8 speed, u16 gpios) { u16 i; u32 ospeedr; if (otype == 0x1) GPIO_OTYPER(gpioport) |= gpios; else GPIO_OTYPER(gpioport) &= ~gpios; ospeedr = GPIO_OSPEEDR(gpioport); for (i = 0; i < 16; i++) { if (!((1 << i) & gpios)) continue; ospeedr &= ~GPIO_OSPEED_MASK(i); ospeedr |= GPIO_OSPEED(i, speed); } GPIO_OSPEEDR(gpioport) = ospeedr; }
/** @brief Set GPIO Output Options When the pin is set to output mode, this sets the configuration (analog/digital and open drain/push pull) and speed, for a set of GPIO pins on a given GPIO port. @param[in] gpioport Unsigned int32. Port identifier @ref gpio_port_id @param[in] otype Unsigned int8. Pin output type @ref gpio_output_type @param[in] speed Unsigned int8. Pin speed @ref gpio_speed @param[in] gpios Unsigned int16. Pin identifiers @ref gpio_pin_id If multiple pins are to be set, use bitwise OR '|' to separate them. */ void gpio_set_output_options(uint32_t gpioport, uint8_t otype, uint8_t speed, uint16_t gpios) { uint16_t i; uint32_t ospeedr; if (otype == 0x1) { GPIO_OTYPER(gpioport) |= gpios; } else { GPIO_OTYPER(gpioport) &= ~gpios; } ospeedr = GPIO_OSPEEDR(gpioport); for (i = 0; i < 16; i++) { if (!((1 << i) & gpios)) { continue; } ospeedr &= ~GPIO_OSPEED_MASK(i); ospeedr |= GPIO_OSPEED(i, speed); } GPIO_OSPEEDR(gpioport) = ospeedr; }