diff options
Diffstat (limited to 'hal')
-rw-r--r-- | hal/pin.h | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/hal/pin.h b/hal/pin.h new file mode 100644 index 0000000..e45c178 --- /dev/null +++ b/hal/pin.h @@ -0,0 +1,78 @@ +#ifndef PIN_H +#define PIN_H + +#include "gpio.h" + +class Pin { + private: + GPIO_t& g; + int n; + + public: + Pin(GPIO_t& gpio, int pin) : g(gpio), n(pin) {} + + enum Mode { + Input, + Output, + AF, + Analog, + }; + + enum Type { + PushPull, + OpenDrain, + }; + + void set_mode(Mode m) { + g.MODER = (g.MODER & ~(3 << (n * 2))) | m << (n * 2); + } + + void set_type(Type t) { + if(t) { + g.OTYPER |= 1 << n; + } else { + g.OTYPER &= ~(1 << n); + } + } + + void set_af(int af) { + if(n > 8) { + g.AFRL = (g.AFRL & ~(0xf << (n * 4))) | af << (n * 4); + } else { + g.AFRH = (g.AFRL & ~(0xf << (n * 4 - 32))) | af << (n * 4 - 32); + } + } + + void on() { + g.BSRR = 1 << n; + } + + void off() { + g.BSRR = 1 << 16 << n; + } + + void toggle() { + if(g.ODR & (1 << n)) { + off(); + } else { + on(); + } + } +}; +static Pin PB0(GPIOD, 0); +static Pin PB1(GPIOD, 1); +static Pin PB2(GPIOD, 2); +static Pin PB3(GPIOD, 3); +static Pin PB4(GPIOD, 4); +static Pin PB5(GPIOD, 5); +static Pin PB6(GPIOD, 6); +static Pin PB7(GPIOD, 7); +static Pin PB8(GPIOD, 8); +static Pin PB9(GPIOD, 9); + +static Pin PD12(GPIOD, 12); +static Pin PD13(GPIOD, 13); +static Pin PD14(GPIOD, 14); +static Pin PD15(GPIOD, 15); + +#endif |