Exemple #1
0
/*!
    \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;
}