#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 OTYPER_PUSH_PULL 0x0UL #define OTYPER_OPEN_DRAIN 0x1UL #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] = { OSPEEDR_LOW, OSPEEDR_LOW, OSPEEDR_MEDIUM, OSPEEDR_HIGH }; const uint32_t outputStgeList[3] = { OTYPER_OPEN_DRAIN, OTYPER_PUSH_PULL, OTYPER_OPEN_DRAIN }; void pinSetMode(pinNo_t pinNo, mode_t mode) { //Clear entry. PIN_BASE->MODER &=~ (0x3 << ((pinNo & 0x0F) * 2)); //Set to corresponding mode. PIN_BASE->MODER |= (moderMode[mode] << ((pinNo & 0x0F) * 2)); } void pinSetOutputStage(pinNo_t pinNo, stage_t stage) { PIN_BASE->OSPEEDR &= 1 << (pinNo & 0x0F); PIN_BASE->OSPEEDR |= (outputStgeList[stage] << (pinNo & 0x0F)); } void pinSetPullUpDonw(pinNo_t pinNo, pullUpDown_t resistance) { PIN_BASE->PUPDR &= ~(0x3 << ((pinNo & 0x0F) * 2)); PIN_BASE->PUPDR |= (pinPullUpDown[resistance] << ((pinNo & 0x0F) * 2)); } void pinSetSpeed(pinNo_t pinNo, speed_t speed) { PIN_BASE->OSPEEDR &= (0x3 << ((pinNo & 0x0F) * 2)); PIN_BASE->OSPEEDR |= (speedList[speed] << ((pinNo & 0x0F) * 2)); } void pinConfig(pinNo_t pinNo, mode_t mode, stage_t stage, pullUpDown_t resistance, speed_t speed) { pinInit(pinNo); //Very important to init first so that the corresponding bus gets his clock pinSetMode(pinNo, mode); pinSetOutputStage(pinNo, stage); pinSetPullUpDonw(pinNo, resistance); pinSetSpeed(pinNo,speed); } uint8_t pinRead(pinNo_t pinNo) { return ((PIN_BASE->IDR & (1<<(pinNo & 0x0F))) >> (pinNo & 0x0F)); } void pinToggle(pinNo_t pinNo) { if(pinRead(pinNo)) { PIN_BASE->BSRR |= (GPIO_BSRR_BR_0 << ((pinNo & 0xF))); return; } PIN_BASE->BSRR |= (GPIO_BSRR_BS_0 << ((pinNo & 0xF))); } void pinWrite(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 //in this family of MCU ell the cloks are on the same bus that is why we dion't need to //modfify the AHBENR. //DS Page : 121 void pinInit(pinNo_t pinNo) { RCC->AHBENR |= pinPort[((pinNo & 0xF0)>>4)]; } //in this family of MCU ell the cloks are on the same bus that is why we dion't need to //modfify the AHBENR. //DS Page : 121 void pinDeInit(pinNo_t pinNo) { RCC->AHBENR &=~(pinPort[((pinNo & 0xF0)>>4)]); } void pinHardwareInfo(pinNo_t pinNo) { //TODO : define where to print anh woh to print } void pinThrowError() { //TODO : Define what for an error di we whant to implement }