Skip to content

Commit 9affb8f

Browse files
committed
fixing pullup mode and adding pulldown
Signed-off-by: Thibaut VIARD <[email protected]>
1 parent cebfc3c commit 9affb8f

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

cores/arduino/wiring_digital.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
int pinPeripheral( uint32_t ulPin, EPioType ulPeripheral )
2727
{
28+
// Handle the case the pin isn't usable as PIO
2829
if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN )
2930
{
3031
return -1 ;
@@ -121,11 +122,13 @@ int pinPeripheral( uint32_t ulPin, EPioType ulPeripheral )
121122

122123
void pinMode( uint32_t ulPin, uint32_t ulMode )
123124
{
125+
// Handle the case the pin isn't usable as PIO
124126
if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN )
125127
{
126128
return ;
127129
}
128130

131+
// Set pin mode according to chapter '22.6.3 I/O Pin Configuration'
129132
switch ( ulMode )
130133
{
131134
case INPUT:
@@ -138,6 +141,18 @@ void pinMode( uint32_t ulPin, uint32_t ulMode )
138141
// Set pin to input mode with pull-up resistor enabled
139142
PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg=(uint8_t)(PORT_PINCFG_INEN|PORT_PINCFG_PULLEN) ;
140143
PORT->Group[g_APinDescription[ulPin].ulPort].DIRCLR.reg = (uint32_t)(1<<g_APinDescription[ulPin].ulPin) ;
144+
145+
// Enable pull level (cf '22.6.3.2 Input Configuration' and '22.8.7 Data Output Value Set')
146+
PORT->Group[g_APinDescription[ulPin].ulPort].OUTSET.reg = (uint32_t)(1<<g_APinDescription[ulPin].ulPin) ;
147+
break ;
148+
149+
case INPUT_PULLDOWN:
150+
// Set pin to input mode with pull-down resistor enabled
151+
PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg=(uint8_t)(PORT_PINCFG_INEN|PORT_PINCFG_PULLEN) ;
152+
PORT->Group[g_APinDescription[ulPin].ulPort].DIRCLR.reg = (uint32_t)(1<<g_APinDescription[ulPin].ulPin) ;
153+
154+
// Enable pull level (cf '22.6.3.2 Input Configuration' and '22.8.6 Data Output Value Clear')
155+
PORT->Group[g_APinDescription[ulPin].ulPort].OUTCLR.reg = (uint32_t)(1<<g_APinDescription[ulPin].ulPin) ;
141156
break ;
142157

143158
case OUTPUT:
@@ -154,7 +169,7 @@ void pinMode( uint32_t ulPin, uint32_t ulMode )
154169

155170
void digitalWrite( uint32_t ulPin, uint32_t ulVal )
156171
{
157-
/* Handle the case the pin isn't usable as PIO */
172+
// Handle the case the pin isn't usable as PIO
158173
if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN )
159174
{
160175
return ;
@@ -182,7 +197,7 @@ void digitalWrite( uint32_t ulPin, uint32_t ulVal )
182197

183198
int digitalRead( uint32_t ulPin )
184199
{
185-
/* Handle the case the pin isn't usable as PIO */
200+
// Handle the case the pin isn't usable as PIO
186201
if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN )
187202
{
188203
return LOW ;

cores/arduino/wiring_digital.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#define INPUT (0x0ul)
2727
#define OUTPUT (0x1ul)
2828
#define INPUT_PULLUP (0x2ul)
29+
#define INPUT_PULLDOWN (0x4ul)
2930

3031
#define LOW (0x0ul)
3132
#define HIGH (0x1ul)
@@ -44,7 +45,7 @@ extern int pinPeripheral( uint32_t ulPin, EPioType ulPeripheral ) ;
4445
* \brief Configures the specified pin to behave either as an input or an output. See the description of digital pins for details.
4546
*
4647
* \param ulPin The number of the pin whose mode you wish to set
47-
* \param ulMode Either INPUT or OUTPUT
48+
* \param ulMode Can be INPUT, OUTPUT, INPUT_PULLUP or INPUT_PULLDOWN
4849
*/
4950
extern void pinMode( uint32_t dwPin, uint32_t dwMode ) ;
5051

0 commit comments

Comments
 (0)