diff --git a/bsl/csl/interfaces/pin.h b/bsl/csl/interfaces/pin.h index 0aa8109..d1761d3 100644 --- a/bsl/csl/interfaces/pin.h +++ b/bsl/csl/interfaces/pin.h @@ -13,34 +13,35 @@ extern "C" { #include "../stm32f042/Drivers/CMSIS/Device/ST/STM32F0xx/Include/stm32f042x6.h" typedef enum { - pinA0 = GPIOA_BASE | 0, - pinA1 = GPIOA_BASE | 1, - pinA2 = GPIOA_BASE | 2, - pinA3 = GPIOA_BASE | 3, - pinA4 = GPIOA_BASE | 4, - pinA5 = GPIOA_BASE | 5, - pinA6 = GPIOA_BASE | 6, - pinA7 = GPIOA_BASE | 7, - pinA8 = GPIOA_BASE | 8, - pinA9 = GPIOA_BASE | 9, - pinA10 = GPIOA_BASE | 10, - pinA11 = GPIOA_BASE | 11, - pinA12 = GPIOA_BASE | 12, - pinA13 = GPIOA_BASE | 13, - pinA14 = GPIOA_BASE | 14, - pinA15 = GPIOA_BASE | 15, - - pinB0 = GPIOB_BASE | 0, - pinB1 = GPIOB_BASE | 1, - pinB3 = GPIOB_BASE | 3, - pinB4 = GPIOB_BASE | 4, - pinB5 = GPIOB_BASE | 5, - pinB6 = GPIOB_BASE | 6, - pinB7 = GPIOB_BASE | 7, - pinB8 = GPIOB_BASE | 8, - - pinF0 = GPIOF_BASE | 0, - pinF1 = GPIOF_BASE | 1 + // NAME = BASE ADDR | PORT | PIN NO + pinA0 = GPIOA_BASE | 0x00 | 0, + pinA1 = GPIOA_BASE | 0x00 | 1, + pinA2 = GPIOA_BASE | 0x00 | 2, + pinA3 = GPIOA_BASE | 0x00 | 3, + pinA4 = GPIOA_BASE | 0x00 | 4, + pinA5 = GPIOA_BASE | 0x00 | 5, + pinA6 = GPIOA_BASE | 0x00 | 6, + pinA7 = GPIOA_BASE | 0x00 | 7, + pinA8 = GPIOA_BASE | 0x00 | 8, + pinA9 = GPIOA_BASE | 0x00 | 9, + pinA10 = GPIOA_BASE | 0x00 | 10, + pinA11 = GPIOA_BASE | 0x00 | 11, + pinA12 = GPIOA_BASE | 0x00 | 12, + pinA13 = GPIOA_BASE | 0x00 | 13, + pinA14 = GPIOA_BASE | 0x00 | 14, + pinA15 = GPIOA_BASE | 0x00 | 15, + + pinB0 = GPIOB_BASE | 0x10 | 0, + pinB1 = GPIOB_BASE | 0x10 | 1, + pinB3 = GPIOB_BASE | 0x10 | 3, + pinB4 = GPIOB_BASE | 0x10 | 4, + pinB5 = GPIOB_BASE | 0x10 | 5, + pinB6 = GPIOB_BASE | 0x10 | 6, + pinB7 = GPIOB_BASE | 0x10 | 7, + pinB8 = GPIOB_BASE | 0x10 | 8, + + pinF0 = GPIOF_BASE | 0x20 | 0, + pinF1 = GPIOF_BASE | 0x20 | 1 }pinNo_t; #endif diff --git a/bsl/csl/stm32f042/Src/pin.c b/bsl/csl/stm32f042/Src/pin.c index f6e9d7b..33a2d21 100644 --- a/bsl/csl/stm32f042/Src/pin.c +++ b/bsl/csl/stm32f042/Src/pin.c @@ -13,7 +13,9 @@ #define PUPDR_PULL_UP 0x1UL #define PUPDR_PULL_DOWN 0x2UL -const uint32_t moderMode[4] = { +#define PIN_BASE ((GPIO_TypeDef *)(pinNo&~0xFF)) + +const uint32_t moderMode[5] = { MODER_ANALOG, MODER_IN, MODER_OUT, @@ -21,23 +23,36 @@ const uint32_t moderMode[4] = { 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 +}; + void setMode(pinNo_t pinNo, mode mode) { init(pinNo); //Clear entry. - ((GPIO_TypeDef *)(pinNo&~0xFF))->MODER &=~ (MODER_ANALOG << ((pinNo & 0xFF) * 2)); + PIN_BASE->MODER &=~ (0x3 << ((pinNo & 0x0F) * 2)); //Set to corresponding mode. - ((GPIO_TypeDef *)(pinNo&~0xFF))->MODER |= (moderMode[mode] << ((pinNo & 0xFF) * 2)); + 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) @@ -63,18 +78,17 @@ void toggle(pinNo_t pinNo) void set(pinNo_t pinNo, uint8_t state) { - if(state == 1) - { - GPIOB->BSRR |= GPIO_BSRR_BS_3; + if(state) { + PIN_BASE->BSRR |= (GPIO_BSRR_BS_0 << ((pinNo & 0xF))); return; } - GPIOB->BSRR |= GPIO_BSRR_BR_3; + PIN_BASE->BSRR |= (GPIO_BSRR_BR_0 << ((pinNo & 0xF))); } //Enable the pin port's clock void init(pinNo_t pinNo) { - RCC->AHBENR |= RCC_AHBENR_GPIOBEN; + RCC->AHBENR |= pinPort[((pinNo & 0xF0)>>4)]; } void deInit(pinNo_t pinNo)