| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #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));
- }
- 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_FREQ_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
- }
- }
|