#include #include #include "teensy_hal.h" #define GPIO_NUMBER 32 void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) { /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); /* Configure the port pins */ for (uint32_t position = 0; position < GPIO_NUMBER; position++) { uint32_t bitmask = 1 << position; if ((GPIO_Init->Pin & bitmask) == 0) { continue; } volatile uint32_t *port_pcr = GPIO_PIN_TO_PORT_PCR(GPIOx, position); /*--------------------- GPIO Mode Configuration ------------------------*/ /* In case of Alternate function mode selection */ if ((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) { /* Check the Alternate function parameter */ assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); } else if (GPIO_Init->Mode == GPIO_MODE_ANALOG) { GPIO_Init->Alternate = 0; } else { GPIO_Init->Alternate = 1; } /* Configure Alternate function mapped with the current IO */ *port_pcr &= ~PORT_PCR_MUX_MASK; *port_pcr |= PORT_PCR_MUX(GPIO_Init->Alternate); /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ if (GPIO_Init->Mode == GPIO_MODE_INPUT || GPIO_Init->Mode == GPIO_MODE_ANALOG) { GPIOx->PDDR &= ~bitmask; } else { GPIOx->PDDR |= bitmask; } /* In case of Output or Alternate function mode selection */ if ((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) { /* Check the Speed parameter */ assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); *port_pcr |= PORT_PCR_DSE; /* Configure the IO Speed */ if (GPIO_Init->Speed > GPIO_SPEED_MEDIUM) { *port_pcr &= ~PORT_PCR_SRE; } else { *port_pcr |= PORT_PCR_SRE; } /* Configure the IO Output Type */ if (GPIO_Init->Mode & GPIO_OUTPUT_TYPE) { *port_pcr |= PORT_PCR_ODE; // OD } else { *port_pcr &= ~PORT_PCR_ODE; // PP } } else { *port_pcr &= ~PORT_PCR_DSE; } /* Activate the Pull-up or Pull down resistor for the current IO */ if (GPIO_Init->Pull == GPIO_NOPULL) { *port_pcr &= ~PORT_PCR_PE; } else { *port_pcr |= PORT_PCR_PE; if (GPIO_Init->Pull == GPIO_PULLDOWN) { *port_pcr &= ~PORT_PCR_PS; } else { *port_pcr |= PORT_PCR_PS; } } #if 0 /*--------------------- EXTI Mode Configuration ------------------------*/ /* Configure the External Interrupt or event for the current IO */ if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) { /* Enable SYSCFG Clock */ __SYSCFG_CLK_ENABLE(); temp = ((uint32_t)0x0F) << (4 * (position & 0x03)); SYSCFG->EXTICR[position >> 2] &= ~temp; SYSCFG->EXTICR[position >> 2] |= ((uint32_t)(__HAL_GET_GPIO_SOURCE(GPIOx)) << (4 * (position & 0x03))); /* Clear EXTI line configuration */ EXTI->IMR &= ~((uint32_t)iocurrent); EXTI->EMR &= ~((uint32_t)iocurrent); if((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT) { EXTI->IMR |= iocurrent; } if((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT) { EXTI->EMR |= iocurrent; } /* Clear Rising Falling edge configuration */ EXTI->RTSR &= ~((uint32_t)iocurrent); EXTI->FTSR &= ~((uint32_t)iocurrent); if((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE) { EXTI->RTSR |= iocurrent; } if((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE) { EXTI->FTSR |= iocurrent; } } #endif } }