diff options
Diffstat (limited to 'teensy/hal_gpio.c')
-rw-r--r-- | teensy/hal_gpio.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/teensy/hal_gpio.c b/teensy/hal_gpio.c new file mode 100644 index 0000000000..0811f76fda --- /dev/null +++ b/teensy/hal_gpio.c @@ -0,0 +1,115 @@ +#include <stdint.h> +#include <mk20dx128.h> +#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)); + /* 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)); + + /* 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; + } else { + *port_pcr &= ~PORT_PCR_ODE; + } + } + + /* 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 + } +} + |