Skip to content

Commit 8d0c06d

Browse files
committed
Fix Firmata library for STM32
Fix #9 All variants tested thanks: http://www.firmata.org/wiki/Main_Page#Firmata_Test_Program Signed-off-by: Frederic Pillon <[email protected]>
1 parent 3af1840 commit 8d0c06d

File tree

12 files changed

+93
-25
lines changed

12 files changed

+93
-25
lines changed

Diff for: cores/arduino/pins_arduino.h

+21-6
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,39 @@
2828
// API compatibility
2929
#include "variant.h"
3030

31+
#define NOT_AN_INTERRUPT NC // -1
32+
3133
#define NUM_DIGITAL_PINS DEND
3234
#define NUM_ANALOG_INPUTS (AEND-A0)
3335

3436
// Convert a digital pin number Dxx to a PinName Pxy
3537
// Note: Analog pin is also a digital pin.
36-
#define digitalPinToPinName(p) ((p < NUM_DIGITAL_PINS) ? digitalPin[p] : (STM_VALID_PINNAME(p))? (PinName)p : NC)
38+
#define digitalPinToPinName(p) ((p < NUM_DIGITAL_PINS) ? digitalPin[p] : (STM_VALID_PINNAME(p))? (PinName)p : NC)
3739
// Convert a PinName Pxy to a digital pin number
3840
uint32_t pinNametoDigitalPin(PinName p);
3941

4042
// Convert an analog pin number to a digital pin number
4143
// Used by analogRead api to have A0 == 0
4244
#define analogInputToDigitalPin(p) ((p < NUM_ANALOG_INPUTS) ? (p+A0) : p)
4345
// Convert an analog pin number Axx to a PinName Pxy
44-
#define analogInputToPinName(p) (digitalPinToPinName(analogInputToDigitalPin(p)))
46+
#define analogInputToPinName(p) (digitalPinToPinName(analogInputToDigitalPin(p)))
4547
// All pins could manage EXTI
46-
#define digitalPinToInterrupt(p) (p)
48+
#define digitalPinToInterrupt(p) ((p>=D0) && (p < NUM_DIGITAL_PINS) ? p : NOT_AN_INTERRUPT)
49+
50+
#define digitalPinHasI2C(p) (pin_in_pinmap(digitalPinToPinName(p), PinMap_I2C_SDA) ||\
51+
pin_in_pinmap(digitalPinToPinName(p), PinMap_I2C_SCL))
52+
#define digitalPinHasPWM(p) (pin_in_pinmap(digitalPinToPinName(p), PinMap_PWM))
53+
#define digitalPinHasSerial(p) (pin_in_pinmap(digitalPinToPinName(p), PinMap_UART_RX) ||\
54+
pin_in_pinmap(digitalPinToPinName(p), PinMap_UART_TX))
55+
#define digitalPinHasSPI(p) (pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_MOSI) ||\
56+
pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_MISO) ||\
57+
pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_SCLK) ||\
58+
pin_in_pinmap(digitalPinToPinName(p), PinMap_SPI_SSEL))
59+
60+
61+
#define digitalPinToPort(p) ( get_GPIO_Port(digitalPinToPinName(p)) )
62+
#define digitalPinToBitMask(p) ( STM_GPIO_PIN(digitalPinToPinName(p)) )
63+
4764

48-
#define digitalPinToPort(p) ( get_GPIO_Port(digitalPinToPinName(p)) )
49-
#define digitalPinToBitMask(p) ( STM_GPIO_PIN(digitalPinToPinName(p)) )
5065

51-
#endif /*_PINS_ARDUINO_H_*/
66+
#endif /*_PINS_ARDUINO_H_*/

Diff for: libraries/Firmata/Boards.h

+21
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,27 @@ writePort(port, value, bitmask): Write an 8 bit port.
764764
#define PIN_TO_SERVO(p) (p)
765765
#define DEFAULT_PWM_RESOLUTION 10
766766

767+
// STM32 based boards
768+
#elif defined(ARDUINO_ARCH_STM32)
769+
#define TOTAL_ANALOG_PINS NUM_ANALOG_INPUTS
770+
#define TOTAL_PINS NUM_DIGITAL_PINS
771+
#define TOTAL_PORTS MAX_NB_PORT
772+
#define VERSION_BLINK_PIN LED_BUILTIN
773+
// PIN_SERIALY_RX/TX defined in the variant.h
774+
#define IS_PIN_DIGITAL(p) ((p != PIN_SERIAL_RX) && (p != PIN_SERIAL_TX) &&\
775+
(p >= 0) && (p < TOTAL_PINS))
776+
#define IS_PIN_ANALOG(p) ((p) >= A0 && (p) < AEND)
777+
#define IS_PIN_PWM(p) digitalPinHasPWM(p)
778+
#define IS_PIN_SERVO(p) IS_PIN_DIGITAL(p)
779+
#define IS_PIN_I2C(p) digitalPinHasI2C(p)
780+
#define IS_PIN_SPI(p) digitalPinHasSPI(p)
781+
#define IS_PIN_INTERRUPT(p) (digitalPinToInterrupt(p) > NOT_AN_INTERRUPT)
782+
#define IS_PIN_SERIAL(p) digitalPinHasSerial(p)
783+
#define PIN_TO_DIGITAL(p) (p)
784+
#define PIN_TO_ANALOG(p) (p-A0)
785+
#define PIN_TO_PWM(p) (p)
786+
#define PIN_TO_SERVO(p) (p)
787+
#define DEFAULT_PWM_RESOLUTION PWM_RESOLUTION
767788

768789
// anything else
769790
#else

Diff for: libraries/Firmata/library.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ sentence=Enables the communication with computer apps using a standard serial pr
66
paragraph=The Firmata library implements the Firmata protocol for communicating with software on the host computer. This allows you to write custom firmware without having to create your own protocol and objects for the programming environment that you are using.
77
category=Device Control
88
url=https://github.com/firmata/arduino
9-
architectures=*
9+
architectures=stm32

Diff for: variants/DISCO_F407VG/variant.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,9 @@ enum {
109109
#define UART_EMUL_RX PE9
110110
#define UART_EMUL_TX PE11
111111

112-
//Enable Firmata
113-
#define STM32 1
112+
// Serial Pin Firmata
113+
#define PIN_SERIAL_RX 42
114+
#define PIN_SERIAL_TX 3
114115

115116
#ifdef __cplusplus
116117
} // extern "C"

Diff for: variants/DISCO_F746NG/variant.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ const PinName digitalPin[] = {
4646
PF8, //D19/A3
4747
PF7, //D20/A4
4848
PF6, //D21/A5
49-
PI11 //D22 User btn
49+
PI11, //D22 User btn
50+
PB7, //D23 ST-Link Rx
51+
PA9 //D24 ST-Link Tx
5052
};
5153

5254
#ifdef __cplusplus

Diff for: variants/DISCO_F746NG/variant.h

+8-3
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ extern const PinName digitalPin[];
3939
enum {
4040
D0, D1, D2, D3, D4, D5, D6, D7, D8, D9,
4141
D10, D11, D12, D13, D14, D15, D16, D17, D18, D19,
42-
D20, D21, D22,
42+
D20, D21, D22, D23, D24,
4343
DEND
4444
};
4545

@@ -103,8 +103,13 @@ enum {
103103
//#define UART_EMUL_RX PYxx
104104
//#define UART_EMUL_TX PYxx
105105

106-
//Enable Firmata
107-
#define STM32 1
106+
// Serial Pin Firmata
107+
#define PIN_SERIAL_RX 23
108+
#define PIN_SERIAL_TX 24
109+
#define PIN_SERIAL1_RX 0
110+
#define PIN_SERIAL1_TX 1
111+
#define PIN_SERIAL2_RX 21
112+
#define PIN_SERIAL2_TX 20
108113

109114
#ifdef __cplusplus
110115
} // extern "C"

Diff for: variants/NUCLEO_F030R8/variant.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,11 @@ enum {
102102

103103
#define DEBUG_UART ((USART_TypeDef *) USART2)
104104

105-
//Enable Firmata
106-
#define STM32 1
105+
// Serial Pin Firmata
106+
#define PIN_SERIAL_RX 0
107+
#define PIN_SERIAL_TX 1
108+
#define PIN_SERIAL1_RX 2
109+
#define PIN_SERIAL1_TX 8
107110

108111
#ifdef __cplusplus
109112
} // extern "C"

Diff for: variants/NUCLEO_F091RC/variant.h

+7-2
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,13 @@ enum {
107107
#define UART_EMUL_RX PB14
108108
#define UART_EMUL_TX PB13
109109

110-
//Enable Firmata
111-
#define STM32 1
110+
// Serial Pin Firmata
111+
#define PIN_SERIAL_RX 0
112+
#define PIN_SERIAL_TX 1
113+
#define PIN_SERIAL1_RX 2
114+
#define PIN_SERIAL1_TX 8
115+
#define PIN_SERIAL2_RX 47
116+
#define PIN_SERIAL2_TX 46
112117

113118
#ifdef __cplusplus
114119
} // extern "C"

Diff for: variants/NUCLEO_F303RE/variant.h

+7-2
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,13 @@ enum {
107107
#define UART_EMUL_RX PC1
108108
#define UART_EMUL_TX PC3
109109

110-
//Enable Firmata
111-
#define STM32 1
110+
// Serial Pin Firmata
111+
#define PIN_SERIAL_RX 0
112+
#define PIN_SERIAL_TX 1
113+
#define PIN_SERIAL1_RX 2
114+
#define PIN_SERIAL1_TX 8
115+
#define PIN_SERIAL2_RX 47
116+
#define PIN_SERIAL2_TX 46
112117

113118
#ifdef __cplusplus
114119
} // extern "C"

Diff for: variants/NUCLEO_F429ZI/variant.h

+7-2
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,13 @@ enum {
113113
#define UART_EMUL_RX PF15
114114
#define UART_EMUL_TX PE13
115115

116-
//Enable Firmata
117-
#define STM32 1
116+
// Serial Pin Firmata
117+
#define PIN_SERIAL_RX 76
118+
#define PIN_SERIAL_TX 77
119+
#define PIN_SERIAL1_RX 0
120+
#define PIN_SERIAL1_TX 1
121+
#define PIN_SERIAL2_RX 52
122+
#define PIN_SERIAL2_TX 53
118123

119124

120125

Diff for: variants/NUCLEO_L053R8/variant.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,11 @@ enum {
103103

104104
#define DEBUG_UART ((USART_TypeDef *) USART2)
105105

106-
//Enable Firmata
107-
#define STM32 1
106+
// Serial Pin Firmata
107+
#define PIN_SERIAL_RX 0
108+
#define PIN_SERIAL_TX 1
109+
#define PIN_SERIAL1_RX 2
110+
#define PIN_SERIAL1_TX 8
108111

109112
#ifdef __cplusplus
110113
} // extern "C"

Diff for: variants/NUCLEO_L476RG/variant.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,11 @@ enum {
107107
#define UART_EMUL_RX PB13
108108
#define UART_EMUL_TX PB14
109109

110-
//Enable Firmata
111-
#define STM32 1
110+
// Serial Pin Firmata
111+
#define PIN_SERIAL_RX 0
112+
#define PIN_SERIAL_TX 1
113+
#define PIN_SERIAL1_RX 2
114+
#define PIN_SERIAL1_TX 8
112115

113116
#ifdef __cplusplus
114117
} // extern "C"

0 commit comments

Comments
 (0)