/*! \brief set GPIO alternate function \param[in] port \arg GPIOx(x = A,B,C,D,F) \param[in] alt_func_num \arg GPIO_AF_0: EVENTOUT, TIMER14, SPI0, I2S0, TIMER16,MCO, SWDAT, SWCLK, TIMER14,USART0, CEC, IR_OUT, SPI1 \arg GPIO_AF_1: USART0, USART1, CEC, TIMER2, IR_OUT, EVENTOUT, I2C0, I2C1, TIMER14 \arg GPIO_AF_2: TIMER1, TIMER0, EVENTOUT, TIMER15, TIMER16 \arg GPIO_AF_3: TSI, I2C0, TIMER14, EVENTOUT \arg GPIO_AF_4: TIMER13, I2C1, I2C0, USART1 \arg GPIO_AF_5: TIMER15, TIMER16 \arg GPIO_AF_6: EVENTOUT, SPI1 \arg GPIO_AF_7: CMP0_OUT, CMP1_OUT \arg GPIO_AF_8: \arg GPIO_AF_9: CAN0,CAN1 \arg GPIO_AF_10: \arg GPIO_AF_11: SLCD \param[in] pin \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL \param[out] none \retval none */ void gpio_af_set(uint32_t port, uint8_t alt_func_num, uint16_t pin) { uint16_t i; uint32_t afrl, afrh; afrl = GPIO_AFSEL0(port); afrh = GPIO_AFSEL1(port); for (i = 0; i < 8; i++){ if (!((1 << i) & pin)){ continue; } /* clear the specified pin alternate function bits */ afrl &= ~GPIO_AFR_MASK(i); afrl |= GPIO_AFR_SET(i, alt_func_num); } for (i = 8; i < 16; i++){ if (!((1 << i) & pin)){ continue; } /* clear the specified pin alternate function bits */ afrh &= ~GPIO_AFR_MASK(i - 8); afrh |= GPIO_AFR_SET(i - 8, alt_func_num); } GPIO_AFSEL0(port) = afrl; GPIO_AFSEL1(port) = afrh; }
/*! \brief set GPIO alternate function \param[in] gpio_periph: GPIOx(x = A,B,C) only one parameter can be selected which is shown as below: \arg GPIOx(x = A,B,C) \param[in] alt_func_num: GPIO pin af function, please refer to specific device datasheet \arg GPIO_AF_0: TIMER13, TIMER14, TIMER16, SPI0, SPI1, I2S0, CK_OUT, USART0, I2C0, I2C1, SWDIO, SWCLK \arg GPIO_AF_1: USART0, USART1, TIMER2, TIMER14, I2C0, I2C1 \arg GPIO_AF_2: TIMER0, TIMER1, TIMER15, TIMER16, I2S0 \arg GPIO_AF_3: I2C0, TIMER14 \arg GPIO_AF_4(port A,B only): USART1, I2C0, I2C1, TIMER13 \arg GPIO_AF_5(port A,B only): TIMER15, TIMER16, I2S0 \arg GPIO_AF_6(port A,B only): SPI1 \arg GPIO_AF_7(port A,B only): CMP \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_af_set(uint32_t gpio_periph, uint32_t alt_func_num, uint32_t pin) { uint16_t i; uint32_t afrl, afrh; afrl = GPIO_AFSEL0(gpio_periph); afrh = GPIO_AFSEL1(gpio_periph); for(i = 0U;i < 8U;i++){ if((1U << i) & pin){ /* clear the specified pin alternate function bits */ afrl &= ~GPIO_AFR_MASK(i); afrl |= GPIO_AFR_SET(i,alt_func_num); } } for(i = 8U;i < 16U;i++){ if((1U << i) & pin){ /* clear the specified pin alternate function bits */ afrh &= ~GPIO_AFR_MASK(i - 8U); afrh |= GPIO_AFR_SET(i - 8U,alt_func_num); } } GPIO_AFSEL0(gpio_periph) = afrl; GPIO_AFSEL1(gpio_periph) = afrh; }