@@ -58,8 +58,13 @@ void pinMode( uint32_t ulPin, uint32_t ulMode )
58
58
break ;
59
59
60
60
case OUTPUT :
61
+ // enable input, to support reading back values
62
+ PORT -> Group [g_APinDescription [ulPin ].ulPort ].PINCFG [g_APinDescription [ulPin ].ulPin ].bit .INEN = 1 ;
63
+
64
+ // disable pullups
65
+ PORT -> Group [g_APinDescription [ulPin ].ulPort ].PINCFG [g_APinDescription [ulPin ].ulPin ].bit .PULLEN = 0 ;
66
+
61
67
// Set pin to output mode
62
- PORT -> Group [g_APinDescription [ulPin ].ulPort ].PINCFG [g_APinDescription [ulPin ].ulPin ].reg &=~(uint8_t )(PORT_PINCFG_INEN ) ;
63
68
PORT -> Group [g_APinDescription [ulPin ].ulPort ].DIRSET .reg = (uint32_t )(1 <<g_APinDescription [ulPin ].ulPin ) ;
64
69
break ;
65
70
@@ -77,17 +82,23 @@ void digitalWrite( uint32_t ulPin, uint32_t ulVal )
77
82
return ;
78
83
}
79
84
80
- // Enable pull-up resistor
81
- PORT -> Group [g_APinDescription [ulPin ].ulPort ].PINCFG [g_APinDescription [ulPin ].ulPin ].reg = (uint8_t )(PORT_PINCFG_PULLEN ) ;
85
+ EPortType port = g_APinDescription [ulPin ].ulPort ;
86
+ uint32_t pin = g_APinDescription [ulPin ].ulPin ;
87
+ uint32_t pinMask = (1ul << pin );
88
+
89
+ if ( (PORT -> Group [port ].DIRSET .reg & pinMask ) == 0 ) {
90
+ // the pin is not an output, disable pull-up if val is LOW, otherwise enable pull-up
91
+ PORT -> Group [port ].PINCFG [pin ].bit .PULLEN = ((ulVal == LOW ) ? 0 : 1 ) ;
92
+ }
82
93
83
94
switch ( ulVal )
84
95
{
85
96
case LOW :
86
- PORT -> Group [g_APinDescription [ ulPin ]. ulPort ]. OUTCLR .reg = ( 1ul << g_APinDescription [ ulPin ]. ulPin ) ;
97
+ PORT -> Group [port ]. OUTCLR .reg = pinMask ;
87
98
break ;
88
99
89
100
default :
90
- PORT -> Group [g_APinDescription [ ulPin ]. ulPort ]. OUTSET .reg = ( 1ul << g_APinDescription [ ulPin ]. ulPin ) ;
101
+ PORT -> Group [port ]. OUTSET .reg = pinMask ;
91
102
break ;
92
103
}
93
104
0 commit comments