diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c index e123c7f85..001c77b09 100644 --- a/cores/arduino/wiring_digital.c +++ b/cores/arduino/wiring_digital.c @@ -58,8 +58,13 @@ void pinMode( uint32_t ulPin, uint32_t ulMode ) break ; case OUTPUT: + // enable input, to support reading back values + PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].bit.INEN = 1 ; + + // disable pullups + PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].bit.PULLEN = 0 ; + // Set pin to output mode - PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg&=~(uint8_t)(PORT_PINCFG_INEN) ; PORT->Group[g_APinDescription[ulPin].ulPort].DIRSET.reg = (uint32_t)(1<Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg=(uint8_t)(PORT_PINCFG_PULLEN) ; + EPortType port = g_APinDescription[ulPin].ulPort; + uint32_t pin = g_APinDescription[ulPin].ulPin; + uint32_t pinMask = (1ul << pin); + + if ( (PORT->Group[port].DIRSET.reg & pinMask) == 0 ) { + // the pin is not an output, disable pull-up if val is LOW, otherwise enable pull-up + PORT->Group[port].PINCFG[pin].bit.PULLEN = ((ulVal == LOW) ? 0 : 1) ; + } switch ( ulVal ) { case LOW: - PORT->Group[g_APinDescription[ulPin].ulPort].OUTCLR.reg = (1ul << g_APinDescription[ulPin].ulPin) ; + PORT->Group[port].OUTCLR.reg = pinMask; break ; default: - PORT->Group[g_APinDescription[ulPin].ulPort].OUTSET.reg = (1ul << g_APinDescription[ulPin].ulPin) ; + PORT->Group[port].OUTSET.reg = pinMask; break ; }