diff options
author | Daniel Friesel <daniel.friesel@uos.de> | 2020-04-30 12:30:53 +0200 |
---|---|---|
committer | Daniel Friesel <daniel.friesel@uos.de> | 2020-04-30 12:30:53 +0200 |
commit | 6680caddf2a16ef662a158defbb2320d57a5e5ba (patch) | |
tree | cf08505a5422025fb0cd85edc38725e832ba8888 | |
parent | f8eb76eea9ec9cd8f799ab9b44251c7f3b945206 (diff) |
MSP430 gpio.setup: Avoid unintentional short circuits
-rw-r--r-- | include/arch/msp430fr5969lp/driver/gpio.h | 21 | ||||
-rw-r--r-- | include/arch/msp430fr5994lp/driver/gpio.h | 33 |
2 files changed, 40 insertions, 14 deletions
diff --git a/include/arch/msp430fr5969lp/driver/gpio.h b/include/arch/msp430fr5969lp/driver/gpio.h index 84ce820..e137462 100644 --- a/include/arch/msp430fr5969lp/driver/gpio.h +++ b/include/arch/msp430fr5969lp/driver/gpio.h @@ -19,17 +19,28 @@ class GPIO { PIN_INVALID }; + /* + * Set all non-standard GPIOs to input with pull-down. + * This avoids excessive current draw due to floating inputs. + * Note that we do not set GPIOs to output low, as that might + * short-circuit other peripherals. + */ inline void setup() { + PIDIR = BIT0; // green led + P2DIR = 0; + P3DIR = 0; + P4DIR = BIT6; // red LED + PJDIR = 0; P1OUT = 0; P2OUT = 0; P3OUT = 0; P4OUT = 0; PJOUT = 0; - P1DIR = BIT0 | 0xff; // green LED - P2DIR = 0xff ^ (BIT0 | BIT1); // UART - P3DIR = 0xff; - P4DIR = BIT6 | 0xff; // red LED - PJDIR = BIT6 | BIT7; // HFXT (not populated) + P1REN = 0xff & ~BIT0; // green LED + P2REN = 0xff & ~(BIT0 | BIT1); // UART + P3REN = 0xff; + P4REN = 0xff & ~BIT6; // red LED + PJREN = BIT6 | BIT7; // HFXT (not populated) } inline void led_on(unsigned char id) { if (id == 0) { diff --git a/include/arch/msp430fr5994lp/driver/gpio.h b/include/arch/msp430fr5994lp/driver/gpio.h index aa32e7e..d42dace 100644 --- a/include/arch/msp430fr5994lp/driver/gpio.h +++ b/include/arch/msp430fr5994lp/driver/gpio.h @@ -23,7 +23,22 @@ class GPIO { PIN_INVALID }; + /* + * Set all non-standard GPIOs to input with pull-down. + * This avoids excessive current draw due to floating inputs. + * Note that we do not set GPIOs to output low, as that might + * short-circuit other peripherals. + */ inline void setup() { + P1DIR = BIT0 | BIT1; // red LED, green LED + P2DIR = 0; + P3DIR = 0; + P4DIR = 0; + P5DIR = 0; + P6DIR = 0; + P7DIR = 0; + P8DIR = 0; + PJDIR = 0; P1OUT = 0; P2OUT = 0; P3OUT = 0; @@ -33,15 +48,15 @@ class GPIO { P7OUT = 0; P8OUT = 0; PJOUT = 0; - P1DIR = BIT0 | BIT1 | 0xff; // red LED, green LED - P2DIR = 0xff ^ (BIT0 | BIT1); // UART - P3DIR = 0xff; - P4DIR = 0xff; - P5DIR = 0xff; - P6DIR = 0xff; - P7DIR = 0xff; - P8DIR = 0x0f; - PJDIR = BIT6 | BIT7; // HFXT (not populated) + P1REN = 0xff & ~(BIT0 | BIT1); // red LED, green LED + P2REN = 0xff & ~(BIT0 | BIT1); // UART + P3REN = 0xff; + P4REN = 0xff; + P5REN = 0xff; + P6REN = 0xff; + P7REN = 0xff; + P8REN = 0xff; + PJREN = BIT6 | BIT7; // HFXT (not populated) } inline void led_on(unsigned char id) { if (id == 0) { |