@@ -69,29 +69,47 @@ void pinMode( uint32_t ulPin, uint32_t ulMode )
69
69
}
70
70
}
71
71
72
- void digitalWrite ( uint32_t ulPin , uint32_t ulVal )
72
+ void digitalWrite (uint32_t ulPin , uint32_t ulVal )
73
73
{
74
- // Handle the case the pin isn't usable as PIO
75
- if ( g_APinDescription [ulPin ].ulPinType == PIO_NOT_A_PIN )
74
+ uint32_t ulGPIOPin = g_APinDescription [ulPin ].ulPin ;
75
+ PortGroup * port = & (PORT -> Group [g_APinDescription [ulPin ].ulPort ]);
76
+
77
+ // Handle the case the pin is invalid
78
+ if (ulPin >= PINS_COUNT )
76
79
{
77
80
return ;
78
81
}
79
82
80
- // Enable pull-up resistor
81
- PORT -> Group [g_APinDescription [ulPin ].ulPort ].PINCFG [g_APinDescription [ulPin ].ulPin ].reg = (uint8_t )(PORT_PINCFG_PULLEN ) ;
82
-
83
- switch ( ulVal )
83
+ // Test if pin is set to INPUT mode, then activate pull-up according to ulVal
84
+ if (port -> DIR .reg & (1ul <<ulGPIOPin ) != 0 )
84
85
{
85
- case LOW :
86
- PORT -> Group [g_APinDescription [ulPin ].ulPort ].OUTCLR .reg = (1ul << g_APinDescription [ulPin ].ulPin ) ;
87
- break ;
88
-
89
- case HIGH :
90
- PORT -> Group [g_APinDescription [ulPin ].ulPort ].OUTSET .reg = (1ul << g_APinDescription [ulPin ].ulPin ) ;
91
- break ;
92
-
93
- default :
94
- break ;
86
+ switch (ulVal )
87
+ {
88
+ case LOW :
89
+ // Disable pull-up resistor
90
+ port -> PINCFG [ulGPIOPin ].bit .PULLEN = 0 ;
91
+ break ;
92
+
93
+ case HIGH :
94
+ default :
95
+ // Enable pull-up resistor
96
+ port -> PINCFG [ulGPIOPin ].bit .PULLEN = 1 ;
97
+ break ;
98
+ }
99
+ }
100
+ else // pin is set to OUTPUT mode, we output the requested voltage level
101
+ {
102
+ switch (ulVal )
103
+ {
104
+ case LOW :
105
+ port -> OUTCLR .reg = (1ul <<ulGPIOPin );
106
+ break ;
107
+
108
+ case HIGH :
109
+ default :
110
+ port -> OUTSET .reg = (1ul <<ulGPIOPin );
111
+ break ;
112
+ }
95
113
}
96
114
97
115
return ;
0 commit comments