17
17
*/
18
18
#ifndef _PINS_ARDUINO_H_
19
19
#define _PINS_ARDUINO_H_
20
+ // Include board variant
21
+ #include "variant.h"
20
22
21
- #include "PeripheralPins.h"
23
+ // Avoid pins number misalignment
24
+ _Static_assert (NUM_DIGITAL_PINS == PEND , "NUM_DIGITAL_PINS and PEND differ!" );
22
25
23
- // Arduino digital pin alias
26
+ // Arduino digital pins alias
24
27
// GPIO port (A to K) * 16 pins: 176
25
28
enum {
26
29
D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 ,
@@ -44,4 +47,229 @@ enum {
44
47
DMAX
45
48
};
46
49
50
+ // Arduino analog pins
51
+ // Analog pins must be contiguous to be able to loop on each value
52
+ #define MAX_ANALOG_INPUTS 20
53
+ _Static_assert (NUM_ANALOG_INPUTS <= MAX_ANALOG_INPUTS , "Core NUM_ANALOG_INPUTS limited to MAX_ANALOG_INPUTS" );
54
+
55
+ // Defined for backward compatibility with Firmata which unfortunately use it
56
+ #define AEND (NUM_ANALOG_FIRST+NUM_ANALOG_INPUTS)
57
+
58
+ #if NUM_ANALOG_INPUTS > 0
59
+ #define PIN_A0 NUM_ANALOG_FIRST
60
+ static const uint8_t A0 = PIN_A0 ;
61
+ #endif
62
+ #if NUM_ANALOG_INPUTS > 1
63
+ #define PIN_A1 (PIN_A0 + 1)
64
+ static const uint8_t A1 = PIN_A1 ;
65
+ #endif
66
+ #if NUM_ANALOG_INPUTS > 2
67
+ #define PIN_A2 (PIN_A1 + 1)
68
+ static const uint8_t A2 = PIN_A2 ;
69
+ #endif
70
+ #if NUM_ANALOG_INPUTS > 3
71
+ #define PIN_A3 (PIN_A2 + 1)
72
+ static const uint8_t A3 = PIN_A3 ;
73
+ #endif
74
+ #if NUM_ANALOG_INPUTS > 4
75
+ #define PIN_A4 (PIN_A3 + 1)
76
+ static const uint8_t A4 = PIN_A4 ;
77
+ #endif
78
+ #if NUM_ANALOG_INPUTS > 5
79
+ #define PIN_A5 (PIN_A4 + 1)
80
+ static const uint8_t A5 = PIN_A5 ;
81
+ #endif
82
+ #if NUM_ANALOG_INPUTS > 6
83
+ #define PIN_A6 (PIN_A5 + 1)
84
+ static const uint8_t A6 = PIN_A6 ;
85
+ #endif
86
+ #if NUM_ANALOG_INPUTS > 7
87
+ #define PIN_A7 (PIN_A6 + 1)
88
+ static const uint8_t A7 = PIN_A7 ;
89
+ #endif
90
+ #if NUM_ANALOG_INPUTS > 8
91
+ #define PIN_A8 (PIN_A7 + 1)
92
+ static const uint8_t A8 = PIN_A8 ;
93
+ #endif
94
+ #if NUM_ANALOG_INPUTS > 9
95
+ #define PIN_A9 (PIN_A8 + 1)
96
+ static const uint8_t A9 = PIN_A9 ;
97
+ #endif
98
+ #if NUM_ANALOG_INPUTS > 10
99
+ #define PIN_A10 (PIN_A9 + 1)
100
+ static const uint8_t A10 = PIN_A10 ;
101
+ #endif
102
+ #if NUM_ANALOG_INPUTS > 11
103
+ #define PIN_A11 (PIN_A10 + 1)
104
+ static const uint8_t A11 = PIN_A11 ;
105
+ #endif
106
+ #if NUM_ANALOG_INPUTS > 12
107
+ #define PIN_A12 (PIN_A11 + 1)
108
+ static const uint8_t A12 = PIN_A12 ;
109
+ #endif
110
+ #if NUM_ANALOG_INPUTS > 13
111
+ #define PIN_A13 (PIN_A12 + 1)
112
+ static const uint8_t A13 = PIN_A13 ;
113
+ #endif
114
+ #if NUM_ANALOG_INPUTS > 14
115
+ #define PIN_A14 (PIN_A13 + 1)
116
+ static const uint8_t A14 = PIN_A14 ;
117
+ #endif
118
+ #if NUM_ANALOG_INPUTS > 15
119
+ #define PIN_A15 (PIN_A14 + 1)
120
+ static const uint8_t A15 = PIN_A15 ;
121
+ #endif
122
+ #if NUM_ANALOG_INPUTS > 16
123
+ #define PIN_A16 (PIN_A15 + 1)
124
+ static const uint8_t A16 = PIN_A16 ;
125
+ #endif
126
+ #if NUM_ANALOG_INPUTS > 17
127
+ #define PIN_A17 (PIN_A16 + 1)
128
+ static const uint8_t A17 = PIN_A17 ;
129
+ #endif
130
+ #if NUM_ANALOG_INPUTS > 18
131
+ #define PIN_A18 (PIN_A17 + 1)
132
+ static const uint8_t A18 = PIN_A18 ;
133
+ #endif
134
+ #if NUM_ANALOG_INPUTS > 19
135
+ #define PIN_A19 (PIN_A18 + 1)
136
+ static const uint8_t A19 = PIN_A19 ;
137
+ #endif
138
+
139
+ // Default for Arduino connector compatibility
140
+ // SPI Definitions
141
+ #ifndef PIN_SPI_SS
142
+ #define PIN_SPI_SS 10
143
+ #endif
144
+ #ifndef PIN_SPI_SS1
145
+ #define PIN_SPI_SS1 4
146
+ #endif
147
+ #ifndef PIN_SPI_SS2
148
+ #define PIN_SPI_SS2 7
149
+ #endif
150
+ #ifndef PIN_SPI_SS3
151
+ #define PIN_SPI_SS3 8
152
+ #endif
153
+ #ifndef PIN_SPI_MOSI
154
+ #define PIN_SPI_MOSI 11
155
+ #endif
156
+ #ifndef PIN_SPI_MISO
157
+ #define PIN_SPI_MISO 12
158
+ #endif
159
+ #ifndef PIN_SPI_SCK
160
+ #define PIN_SPI_SCK 13
161
+ #endif
162
+
163
+ static const uint8_t SS = PIN_SPI_SS ;
164
+ static const uint8_t SS1 = PIN_SPI_SS1 ;
165
+ static const uint8_t SS2 = PIN_SPI_SS2 ;
166
+ static const uint8_t SS3 = PIN_SPI_SS3 ;
167
+ static const uint8_t MOSI = PIN_SPI_MOSI ;
168
+ static const uint8_t MISO = PIN_SPI_MISO ;
169
+ static const uint8_t SCK = PIN_SPI_SCK ;
170
+
171
+ // I2C Definitions
172
+ #ifndef PIN_WIRE_SDA
173
+ #define PIN_WIRE_SDA 14
174
+ #endif
175
+ #ifndef PIN_WIRE_SCL
176
+ #define PIN_WIRE_SCL 15
177
+ #endif
178
+
179
+ static const uint8_t SDA = PIN_WIRE_SDA ;
180
+ static const uint8_t SCL = PIN_WIRE_SCL ;
181
+
182
+ #ifdef __cplusplus
183
+ extern "C" {
184
+ #endif
185
+
186
+ #define NOT_AN_INTERRUPT NC // -1
187
+
188
+ // Convert a digital pin number Dxx to a PinName PX_n
189
+ // Note: Analog pin is also a digital pin.
190
+ #define digitalPinToPinName (p ) (((uint32_t)p < NUM_DIGITAL_PINS) ? digitalPin[p] : NC)
191
+ // Convert a PinName PX_n to a digital pin number
192
+ uint32_t pinNametoDigitalPin (PinName p );
193
+
194
+ // Convert an analog pin number to a digital pin number
195
+ // Used by analogRead api to have A0 == 0
196
+ #define analogInputToDigitalPin (p ) (((uint32_t)p < NUM_ANALOG_INPUTS) ? (p+A0) : p)
197
+ // Convert an analog pin number Axx to a PinName PX_n
198
+ #define analogInputToPinName (p ) (digitalPinToPinName(analogInputToDigitalPin(p)))
199
+ // All pins could manage EXTI
200
+ #define digitalPinToInterrupt (p ) (digitalPinIsValid(p) ? p : NOT_AN_INTERRUPT)
201
+
202
+ #define digitalPinHasI2C (p ) (pin_in_pinmap(digitalPinToPinName(p), PinMap_I2C_SDA) ||\
203
+ pin_in_pinmap(digitalPinToPinName(p), PinMap_I2C_SCL))
204
+ #define digitalPinHasPWM (p ) (pin_in_pinmap(digitalPinToPinName(p), PinMap_PWM))
205
+ #define digitalPinHasSerial (p ) (pin_in_pinmap(digitalPinToPinName(p), PinMap_UART_RX) ||\
206
+ pin_in_pinmap(digitalPinToPinName(p), PinMap_UART_TX))
207
+ #define digitalPinHasSPI (p ) (pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_MOSI) ||\
208
+ pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_MISO) ||\
209
+ pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_SCLK) ||\
210
+ pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_SSEL))
211
+
212
+
213
+ #define digitalPinToPort (p ) (get_GPIO_Port(STM_PORT(digitalPinToPinName(p))))
214
+ #define digitalPinToBitMask (p ) (STM_GPIO_PIN(digitalPinToPinName(p)))
215
+
216
+ #define analogInPinToBit (p ) (STM_PIN(digitalPinToPinName(p)))
217
+ #define portOutputRegister (P ) (&(P->ODR))
218
+ #define portInputRegister (P ) (&(P->IDR))
219
+
220
+ #define portSetRegister (P ) (&(P->BSRR))
221
+ #if defined(STM32F2xx ) || defined(STM32F4xx ) || defined(STM32F7xx )
222
+ // For those series reset are in the high part so << 16U needed
223
+ #define portClearRegister (P ) (&(P->BSRR))
224
+ #else
225
+ #define portClearRegister (P ) (&(P->BRR))
226
+ #endif
227
+
228
+
229
+ #if defined(STM32F1xx )
230
+ // Config registers split in 2 registers:
231
+ // CRL: pin 0..7
232
+ // CRH: pin 8..15
233
+ // Return only CRL
234
+ #define portModeRegister (P ) (&(P->CRL))
235
+ #else
236
+ #define portModeRegister (P ) (&(P->MODER))
237
+ #endif
238
+ #define portConfigRegister (P ) (portModeRegister(P))
239
+
240
+
241
+ #define digitalPinIsValid (p ) (digitalPinToPinName(p) != NC)
242
+
243
+ // As some pin could be duplicated in digitalPin[]
244
+ // return first occurence of linked PinName (PYx)
245
+ #define digitalPinFirstOccurence (p ) (pinNametoDigitalPin(digitalPinToPinName(p)))
246
+
247
+ // Specific for Firmata. As some pins could be duplicated,
248
+ // ensure 'p' is not one of the serial pins
249
+ #if defined(PIN_SERIAL_RX ) && defined(PIN_SERIAL_TX )
250
+ #define pinIsSerial (p ) ((digitalPinFirstOccurence(p) == PIN_SERIAL_RX) ||\
251
+ (digitalPinFirstOccurence(p) == PIN_SERIAL_TX))
252
+ #endif
253
+
254
+ #ifdef __cplusplus
255
+ }
256
+ #endif
257
+
258
+ // Default Definitions, could be redefined in variant.h
259
+ #ifndef ADC_RESOLUTION
260
+ #define ADC_RESOLUTION 12
261
+ #endif
262
+ #ifndef DACC_RESOLUTION
263
+ #define DACC_RESOLUTION 12
264
+ #endif
265
+ #ifndef PWM_RESOLUTION
266
+ #define PWM_RESOLUTION 8
267
+ #endif
268
+ #ifndef PWM_FREQUENCY
269
+ #define PWM_FREQUENCY 1000
270
+ #endif
271
+ #ifndef PWM_MAX_DUTY_CYCLE
272
+ #define PWM_MAX_DUTY_CYCLE 255
273
+ #endif
274
+
47
275
#endif /*_PINS_ARDUINO_H_*/
0 commit comments