107 lines
2.2 KiB
C
107 lines
2.2 KiB
C
![]() |
/*
|
||
|
* gpio.c
|
||
|
*
|
||
|
* Created on: 29.08.2016
|
||
|
* Author: wn
|
||
|
*/
|
||
|
|
||
|
|
||
|
#include <msp430g2553.h>
|
||
|
#include <stdint.h>
|
||
|
|
||
|
#define GPIO_C
|
||
|
#include "gpio.h"
|
||
|
#undef GPIO_C
|
||
|
|
||
|
|
||
|
|
||
|
extern tPinCfg pinCfg[];
|
||
|
|
||
|
|
||
|
void gpioInitPins() {
|
||
|
P1OUT = 0;
|
||
|
P1DIR = 0;
|
||
|
P1REN = 0;
|
||
|
P2OUT = 0;
|
||
|
P2DIR = 0;
|
||
|
P2REN = 0;
|
||
|
|
||
|
for (tPin p = PINS_FIRST; p < PINS_END; p += 1) {
|
||
|
tPinCfg pin = pinCfg[p];
|
||
|
if (pin.portId == PORT1) {
|
||
|
if (pin.direction == PIN_OUT) {
|
||
|
P1DIR |= pin.bit;
|
||
|
P1SEL &= ~pin.bit;
|
||
|
P1SEL2 &= ~pin.bit;
|
||
|
gpioSetPin(p, pin.defaultOut);
|
||
|
} else if (pin.direction == PIN_IN) {
|
||
|
P1DIR &= ~pin.bit;
|
||
|
P1SEL &= ~pin.bit;
|
||
|
P1SEL2 &= ~pin.bit;
|
||
|
P1REN &= ~pin.bit;
|
||
|
} else if (pin.direction == PIN_IN_PULLUP) {
|
||
|
P1DIR &= ~pin.bit;
|
||
|
P1SEL &= ~pin.bit;
|
||
|
P1SEL2 &= ~pin.bit;
|
||
|
P1REN |= pin.bit;
|
||
|
P1OUT |= pin.bit;
|
||
|
}
|
||
|
} else if (pin.portId == PORT2) {
|
||
|
if (pin.direction == PIN_OUT) {
|
||
|
P2DIR |= pin.bit;
|
||
|
P2SEL &= ~pin.bit;
|
||
|
P2SEL2 &= ~pin.bit;
|
||
|
gpioSetPin(p, pin.defaultOut);
|
||
|
} else if (pin.direction == PIN_IN) {
|
||
|
P2DIR &= ~pin.bit;
|
||
|
P2SEL &= ~pin.bit;
|
||
|
P2SEL2 &= ~pin.bit;
|
||
|
P2REN &= ~pin.bit;
|
||
|
} else if (pin.direction == PIN_IN_PULLUP) {
|
||
|
P2DIR &= ~pin.bit;
|
||
|
P2SEL &= ~pin.bit;
|
||
|
P2SEL2 &= ~pin.bit;
|
||
|
P2REN |= pin.bit;
|
||
|
P2OUT |= pin.bit;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void gpioSetPin(tPin p, tPinState v) {
|
||
|
tPinCfg pin = pinCfg[p];
|
||
|
if (v == HIGH) {
|
||
|
if (pin.portId == PORT1) {
|
||
|
P1OUT |= pin.bit;
|
||
|
} else if (pin.portId == PORT2) {
|
||
|
P2OUT |= pin.bit;
|
||
|
}
|
||
|
} else {
|
||
|
if (pin.portId == PORT1) {
|
||
|
P1OUT &= ~pin.bit;
|
||
|
} else if (pin.portId == PORT2) {
|
||
|
P2OUT &= ~pin.bit;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void gpioTogglePin(tPin p) {
|
||
|
tPinCfg pin = pinCfg[p];
|
||
|
if (pin.portId == PORT1) {
|
||
|
P1OUT ^= pin.bit;
|
||
|
} else if (pin.portId == PORT2) {
|
||
|
P2OUT ^= pin.bit;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
tPinState gpioGetPin(tPin p) {
|
||
|
tPinCfg pin = pinCfg[p];
|
||
|
uint16_t pinValue = 0;
|
||
|
if (pin.portId == PORT1) {
|
||
|
pinValue = P1IN;
|
||
|
} else if (pin.portId == PORT2) {
|
||
|
pinValue = P2IN;
|
||
|
}
|
||
|
return (pinValue & pin.bit) ? HIGH : LOW;
|
||
|
}
|