From 45763badb4ff7cee56a38b72d7546eae4205630b Mon Sep 17 00:00:00 2001 From: Marti Bolivar Date: Mon, 26 Mar 2012 15:38:08 -0400 Subject: stm32f2: Improve GPIO alternate function support. Add GPIO_AFRL and GPIO_AFRH bit definitions; these seem to have been overlooked. Add enum gpio_af to give labels to the various functions. Add gpio_set_af() convenience routine for configuring a GPIO's alternate function. Signed-off-by: Marti Bolivar --- libmaple/stm32f2/gpio.c | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) (limited to 'libmaple/stm32f2/gpio.c') diff --git a/libmaple/stm32f2/gpio.c b/libmaple/stm32f2/gpio.c index 61b71f7..e441fbc 100644 --- a/libmaple/stm32f2/gpio.c +++ b/libmaple/stm32f2/gpio.c @@ -122,16 +122,16 @@ void gpio_init_all(void) { /** * @brief Set the mode of a GPIO pin. * @param dev GPIO device. - * @param pin Pin on the device whose mode to set, 0--15. + * @param bit Bit on dev whose mode to set, 0--15. * @param mode Mode to set the pin to. * @param flags Flags to modify basic mode configuration */ void gpio_set_modef(gpio_dev *dev, - uint8 pin, + uint8 bit, gpio_pin_mode mode, unsigned flags) { gpio_reg_map *regs = dev->regs; - unsigned shift = pin * 2; + unsigned shift = bit * 2; uint32 tmp; /* Mode */ @@ -141,7 +141,7 @@ void gpio_set_modef(gpio_dev *dev, regs->MODER = tmp; /* Output type */ - bb_peri_set_bit(®s->OTYPER, pin, flags & 0x1); + bb_peri_set_bit(®s->OTYPER, bit, flags & 0x1); /* Speed */ tmp = regs->OSPEEDR; @@ -155,3 +155,31 @@ void gpio_set_modef(gpio_dev *dev, tmp |= (flags >> 2) << shift; regs->PUPDR = tmp; } + +/** + * @brief Set a pin's alternate function. + * + * The pin must have its mode set to GPIO_MODE_AF for this to take + * effect. + * + * @param dev Device whose pin to configure. + * @param bit Pin whose alternate function to set. + * @param af Alternate function to use for pin. + * @see gpio_set_modef() + */ +void gpio_set_af(gpio_dev *dev, uint8 bit, gpio_af af) { + __io uint32 *afr; + unsigned shift; + uint32 tmp; + if (bit >= 8) { + afr = &dev->regs->AFRH; + shift = 4 * (bit - 8); + } else{ + afr = &dev->regs->AFRL; + shift = 4 * bit; + } + tmp = *afr; + tmp &= ~(0xF << shift); + tmp |= (af << shift); + *afr = tmp; +} -- cgit v1.2.3