#include "pin.h" #define MODER_IN 0x0UL #define MODER_OUT 0x1UL #define MODER_ALTERNATE 0x2UL #define MODER_ANALOG 0x3UL #define OSPEEDR_LOW 0x0UL #define OSPEEDR_MEDIUM 0x1UL #define OSPEEDR_HIGH 0x3UL #define PUPDR_NO_PULL 0x0UL #define PUPDR_PULL_UP 0x1UL #define PUPDR_PULL_DOWN 0x2UL #define PIN_BASE ((GPIO_TypeDef *)(pinNo&~0xFF)) const uint32_t moderMode[5] = { MODER_ANALOG, MODER_IN, MODER_OUT, MODER_ANALOG, MODER_ALTERNATE }; const uint32_t pinPort[3] = { RCC_AHBENR_GPIOAEN, RCC_AHBENR_GPIOBEN, RCC_AHBENR_GPIOFEN }; const uint32_t pinPullUpDown[3] = { PUPDR_NO_PULL, PUPDR_PULL_UP, PUPDR_PULL_DOWN }; const uint32_t speedList[4] = { 0, 0, 1, 3 }; void setMode(pinNo_t pinNo, mode mode) { init(pinNo); //Clear entry. PIN_BASE->MODER &=~ (0x3 << ((pinNo & 0x0F) * 2)); //Set to corresponding mode. PIN_BASE->MODER |= (moderMode[mode] << ((pinNo & 0x0F) * 2)); } void setOutputState(pinNo_t pinNo, state state) { } void setPullUpDonw(pinNo_t pinNo, pullUpDown resistance) { PIN_BASE->PUPDR &= ~(0x3 << ((pinNo & 0x0F) * 2)); PIN_BASE->PUPDR |= (pinPullUpDown[resistance] << ((pinNo & 0x0F) * 2)); } void setSpeed(pinNo_t pinNo, speed speed) { PIN_BASE->OSPEEDR &= (0x3 << ((pinNo & 0x0F) * 2)); PIN_BASE->OSPEEDR |= (speedList[speed] << ((pinNo & 0x0F) * 2)); } void config(pinNo_t pinNo, mode mode, state state, pullUpDown resistance, speed speed) { } uint8_t get(pinNo_t pinNo) { } void toggle(pinNo_t pinNo) { } void set(pinNo_t pinNo, uint8_t state) { if(state) { PIN_BASE->BSRR |= (GPIO_BSRR_BS_0 << ((pinNo & 0xF))); return; } PIN_BASE->BSRR |= (GPIO_BSRR_BR_0 << ((pinNo & 0xF))); } //Enable the pin port's clock void init(pinNo_t pinNo) { RCC->AHBENR |= pinPort[((pinNo & 0xF0)>>4)]; } void deInit(pinNo_t pinNo) { } void hardwareInfo(pinNo_t pinNo) { } void throwError() { }