/*! \brief set GPIO mode \param[in] gpio_periph: GPIOx(x = A,B,C,F) only one parameter can be selected which is shown as below: \arg GPIOx(x = A,B,C,F) \param[in] mode: gpio pin mode \arg GPIO_MODE_INPUT: input mode \arg GPIO_MODE_OUTPUT: output mode \arg GPIO_MODE_AF: alternate function mode \arg GPIO_MODE_ANALOG: analog mode \param[in] pull_up_down: gpio pin with pull-up or pull-down resistor \arg GPIO_PUPD_NONE: floating mode, no pull-up and pull-down resistors \arg GPIO_PUPD_PULLUP: with pull-up resistor \arg GPIO_PUPD_PULLDOWN:with pull-down resistor \param[in] pin: GPIO pin one or more parameters can be selected which are shown as below: \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL \param[out] none \retval none */ void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin) { uint16_t i; uint32_t ctl, pupd; ctl = GPIO_CTL(gpio_periph); pupd = GPIO_PUD(gpio_periph); for(i = 0U;i < 16U;i++){ if((1U << i) & pin){ /* clear the specified pin mode bits */ ctl &= ~GPIO_MODE_MASK(i); /* set the specified pin mode bits */ ctl |= GPIO_MODE_SET(i, mode); /* clear the specified pin pupd bits */ pupd &= ~GPIO_PUPD_MASK(i); /* set the specified pin pupd bits */ pupd |= GPIO_PUPD_SET(i, pull_up_down); } } GPIO_CTL(gpio_periph) = ctl; GPIO_PUD(gpio_periph) = pupd; }
/*! \brief set GPIO output mode \param[in] port \arg GPIOx(x = A,B,C,D,F) \param[in] mode \arg GPIO_MODE_INPUT: input mode \arg GPIO_MODE_OUTPUT: output mode \arg GPIO_MODE_AF: alternate function mode \arg GPIO_MODE_ANALOG: analog mode \param[in] pull_up_down \arg GPIO_PUPD_NONE: without weak pull-up and pull-down resistors \arg GPIO_PUPD_PULLUP: with weak pull-up resistors \arg GPIO_PUPD_PULLDOWN:with weak pull-down resistors \param[in] pin \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL \param[out] none \retval none */ void gpio_mode_set(uint32_t port, uint8_t mode, uint8_t pull_up_down,uint16_t pin) { uint16_t i; uint32_t ctl, pupd; ctl = GPIO_CTL(port); pupd = GPIO_PUD(port); for (i = 0; i < 16; i++){ if (!((1 << i) & pin)){ continue; } /* clear the specified pin mode bits */ ctl &= ~GPIO_MODE_MASK(i); ctl |= GPIO_MODE_SET(i, mode); /* clear the specified pin pupd bits */ pupd &= ~GPIO_PUPD_MASK(i); pupd |= GPIO_PUPD_SET(i, pull_up_down); } GPIO_CTL(port) = ctl; GPIO_PUD(port) = pupd; }