#include "pinAccess.h" #ifndef IS_GPIO_ALL_INSTANCE #define IS_GPIO_ALL_INSTANCE(INSTANCE) (((INSTANCE) == GPIOA) || \ ((INSTANCE) == GPIOB) || \ ((INSTANCE) == GPIOC) || \ ((INSTANCE) == GPIOD) || \ ((INSTANCE) == GPIOE) || \ ((INSTANCE) == GPIOF) || \ ((INSTANCE) == GPIOG) || \ ((INSTANCE) == GPIOH) || \ ((INSTANCE) == GPIOI) || \ ((INSTANCE) == GPIOJ) || \ ((INSTANCE) == GPIOK)) #endif void clockForGpio(GPIO_TypeDef *port) { if (port == GPIOA) RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; else if(port == GPIOB) RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; else if(port == GPIOC) RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; else if(port == GPIOD) RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; else if(port == GPIOE) RCC->AHB1ENR |= RCC_AHB1ENR_GPIOEEN; else if(port == GPIOF) RCC->AHB1ENR |= RCC_AHB1ENR_GPIOFEN; else if(port == GPIOG) RCC->AHB1ENR |= RCC_AHB1ENR_GPIOGEN; else if(port == GPIOH) RCC->AHB1ENR |= RCC_AHB1ENR_GPIOHEN; else if(port == GPIOI) RCC->AHB1ENR |= RCC_AHB1ENR_GPIOIEN; else if(port == GPIOJ) RCC->AHB1ENR |= RCC_AHB1ENR_GPIOJEN; else if(port == GPIOK) RCC->AHB1ENR |= RCC_AHB1ENR_GPIOKEN; } int pinMode(GPIO_TypeDef *port, unsigned char numBit, mode m) { int mask2Bits; //mask for 2bit fields //check arguments if(!IS_GPIO_ALL_INSTANCE(port)) return -1; if(numBit > 15) return -1; // clockForGpio(port); mask2Bits = (3U << (numBit*2)); switch(m) { case UNUSED: //MODER = 0, PUPDR = 0 port->MODER &= ~mask2Bits; port->PUPDR &= ~mask2Bits; break; case OUTPUT: //MODER = 1, PUPDR = 0 port->MODER &= ~mask2Bits; port->MODER |= (1<<(numBit*2)); port->PUPDR &= ~mask2Bits; break; case INPUT: //MODER = 0, PUPDR = 0 port->MODER &= ~mask2Bits; port->PUPDR &= ~mask2Bits; break; case INPUT_PULLUP: //MODER = 0, PUPDR = 1 port->MODER &= ~mask2Bits; port->PUPDR &= ~mask2Bits; port->PUPDR |= (1<<(numBit*2)); break; case INPUT_PULLDOWN: //MODER = 0, PUPDR = 3 port->MODER &= ~mask2Bits; port->PUPDR &= ~mask2Bits; port->PUPDR |= (1<<((numBit*2)+1)); break; default: break; } return 0; } void digitalWrite(GPIO_TypeDef *port, unsigned char numBit, unsigned int value) { if(!IS_GPIO_ALL_INSTANCE(port)) return; if(numBit > 15) return; if(value) port->BSRRL = 1U << numBit; else port->BSRRH = 1U << numBit; } void digitalToggle(GPIO_TypeDef *port, unsigned char numBit) { if(!IS_GPIO_ALL_INSTANCE(port)) return; if(numBit > 15) return; if(port->IDR & (1U << numBit)) //if is set port->BSRRH = 1U << numBit; //reset else port->BSRRL = 1U << numBit; //set } unsigned char digitalRead(GPIO_TypeDef *port, unsigned char numBit) { if(!IS_GPIO_ALL_INSTANCE(port)) return 0xFF; if(numBit > 15) return 0xFF; if(port->IDR & (1U< 15) return 0xFF; if(AFId > 15) return 0xFF; //clock clockForGpio(port); //set MODER to 10 uint32_t mask2Bits = (3U << (numBit*2)); port->MODER &= ~mask2Bits; port->MODER |= (2U<<(numBit*2)); //set alternate function uint32_t shift; int AFRReg; if(numBit < 8U) //AFRL { shift = numBit<<2; AFRReg = 0; } else { //AFRH shift = (numBit-8U)<<2; AFRReg = 1; } port->AFR[AFRReg] &= ~(0xfU<AFR[AFRReg] |= (AFId< 15) return 0xFF; //clock clockForGpio(port); port->MODER |= (3U<<(numBit*2)); //analog config mask2Bits = (3U << (numBit*2)); port->PUPDR &= ~mask2Bits; //remove pull-up/down return 0; }