summaryrefslogtreecommitdiffstatshomepage
path: root/stmhal
diff options
context:
space:
mode:
Diffstat (limited to 'stmhal')
-rw-r--r--stmhal/gccollect.c4
-rw-r--r--stmhal/mpconfigport.h3
-rw-r--r--stmhal/mphal.h7
-rw-r--r--stmhal/pin.c13
-rw-r--r--stmhal/pin.h80
-rw-r--r--stmhal/pin_defs_stmhal.h96
-rw-r--r--stmhal/pin_named_pins.c3
-rw-r--r--stmhal/pybstdio.c4
-rw-r--r--stmhal/pyexec.c4
-rw-r--r--stmhal/readline.c4
10 files changed, 133 insertions, 85 deletions
diff --git a/stmhal/gccollect.c b/stmhal/gccollect.c
index 721aa062d1..c71ed13a5e 100644
--- a/stmhal/gccollect.c
+++ b/stmhal/gccollect.c
@@ -25,8 +25,7 @@
*/
#include <stdio.h>
-
-#include <stm32f4xx_hal.h>
+#include <stdint.h>
#include "mpconfig.h"
#include "misc.h"
@@ -34,6 +33,7 @@
#include "obj.h"
#include "gc.h"
#include "gccollect.h"
+#include MICROPY_HAL_H
machine_uint_t gc_helper_get_regs_and_sp(machine_uint_t *regs);
diff --git a/stmhal/mpconfigport.h b/stmhal/mpconfigport.h
index f5110d8f0a..28e654c8a6 100644
--- a/stmhal/mpconfigport.h
+++ b/stmhal/mpconfigport.h
@@ -105,3 +105,6 @@ typedef const void *machine_const_ptr_t; // must be of pointer size
// We need to provide a declaration/definition of alloca()
#include <alloca.h>
+
+#define MICROPY_HAL_H "mphal.h"
+#define MICROPY_PIN_DEFS_PORT_H "pin_defs_stmhal.h"
diff --git a/stmhal/mphal.h b/stmhal/mphal.h
new file mode 100644
index 0000000000..4e9a8b2bb8
--- /dev/null
+++ b/stmhal/mphal.h
@@ -0,0 +1,7 @@
+// We use the ST Cube HAL library for most hardware peripherals
+#include <stm32f4xx_hal.h>
+
+// Basic GPIO functions
+#define GPIO_read_pin(gpio, pin) (((gpio)->IDR >> (pin)) & 1)
+#define GPIO_set_pin(gpio, pin_mask) (((gpio)->BSRRL) = (pin_mask))
+#define GPIO_clear_pin(gpio, pin_mask) (((gpio)->BSRRH) = (pin_mask))
diff --git a/stmhal/pin.c b/stmhal/pin.c
index 449b5074f4..a9ebfa9766 100644
--- a/stmhal/pin.c
+++ b/stmhal/pin.c
@@ -28,14 +28,13 @@
#include <stdint.h>
#include <string.h>
-#include "stm32f4xx_hal.h"
-
#include "mpconfig.h"
#include "nlr.h"
#include "misc.h"
#include "qstr.h"
#include "obj.h"
#include "runtime.h"
+#include MICROPY_HAL_H
#include "pin.h"
/// \moduleref pyb
@@ -310,13 +309,13 @@ STATIC mp_obj_t pin_value(uint n_args, mp_obj_t *args) {
pin_obj_t *self = args[0];
if (n_args == 1) {
// get pin
- return MP_OBJ_NEW_SMALL_INT((self->gpio->IDR >> self->pin) & 1);
+ return MP_OBJ_NEW_SMALL_INT(GPIO_read_pin(self->gpio, self->pin));
} else {
// set pin
if (mp_obj_is_true(args[1])) {
- self->gpio->BSRRL = self->pin_mask;
+ GPIO_set_pin(self->gpio, self->pin_mask);
} else {
- self->gpio->BSRRH = self->pin_mask;
+ GPIO_clear_pin(self->gpio, self->pin_mask);
}
return mp_const_none;
}
@@ -327,7 +326,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pin_value_obj, 1, 2, pin_value);
/// Set the pin to a low logic level.
STATIC mp_obj_t pin_low(mp_obj_t self_in) {
pin_obj_t *self = self_in;
- self->gpio->BSRRH = self->pin_mask;
+ GPIO_clear_pin(self->gpio, self->pin_mask);;
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(pin_low_obj, pin_low);
@@ -336,7 +335,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(pin_low_obj, pin_low);
/// Set the pin to a high logic level.
STATIC mp_obj_t pin_high(mp_obj_t self_in) {
pin_obj_t *self = self_in;
- self->gpio->BSRRL = self->pin_mask;
+ GPIO_set_pin(self->gpio, self->pin_mask);;
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(pin_high_obj, pin_high);
diff --git a/stmhal/pin.h b/stmhal/pin.h
index d60bd22fd7..8513db109b 100644
--- a/stmhal/pin.h
+++ b/stmhal/pin.h
@@ -24,63 +24,10 @@
* THE SOFTWARE.
*/
-enum {
- PORT_A,
- PORT_B,
- PORT_C,
- PORT_D,
- PORT_E,
- PORT_F,
- PORT_G,
- PORT_H,
- PORT_I,
- PORT_J,
-};
+// This file requires pin_defs_xxx.h (which has port specific enums and
+// defines, so we include it here. It should never be included directly
-enum {
- AF_FN_TIM,
- AF_FN_I2C,
- AF_FN_USART,
- AF_FN_UART = AF_FN_USART,
- AF_FN_SPI
-};
-
-enum {
- AF_PIN_TYPE_TIM_CH1 = 0,
- AF_PIN_TYPE_TIM_CH2,
- AF_PIN_TYPE_TIM_CH3,
- AF_PIN_TYPE_TIM_CH4,
- AF_PIN_TYPE_TIM_CH1N,
- AF_PIN_TYPE_TIM_CH2N,
- AF_PIN_TYPE_TIM_CH3N,
- AF_PIN_TYPE_TIM_CH1_ETR,
- AF_PIN_TYPE_TIM_ETR,
- AF_PIN_TYPE_TIM_BKIN,
-
- AF_PIN_TYPE_I2C_SDA = 0,
- AF_PIN_TYPE_I2C_SCL,
-
- AF_PIN_TYPE_USART_TX = 0,
- AF_PIN_TYPE_USART_RX,
- AF_PIN_TYPE_USART_CTS,
- AF_PIN_TYPE_USART_RTS,
- AF_PIN_TYPE_USART_CK,
- AF_PIN_TYPE_UART_TX = AF_PIN_TYPE_USART_TX,
- AF_PIN_TYPE_UART_RX = AF_PIN_TYPE_USART_RX,
- AF_PIN_TYPE_UART_CTS = AF_PIN_TYPE_USART_CTS,
- AF_PIN_TYPE_UART_RTS = AF_PIN_TYPE_USART_RTS,
-
- AF_PIN_TYPE_SPI_MOSI = 0,
- AF_PIN_TYPE_SPI_MISO,
- AF_PIN_TYPE_SPI_SCK,
- AF_PIN_TYPE_SPI_NSS,
-};
-
-enum {
- PIN_ADC1 = (1 << 0),
- PIN_ADC2 = (1 << 1),
- PIN_ADC3 = (1 << 2),
-};
+#include MICROPY_PIN_DEFS_PORT_H
typedef struct {
mp_obj_base_t base;
@@ -91,24 +38,21 @@ typedef struct {
union {
void *reg;
- TIM_TypeDef *TIM;
- I2C_TypeDef *I2C;
- USART_TypeDef *USART;
- USART_TypeDef *UART;
- SPI_TypeDef *SPI;
+
+ PIN_DEFS_PORT_AF_UNION
};
} pin_af_obj_t;
typedef struct {
mp_obj_base_t base;
const char *name;
- uint16_t port : 4;
- uint16_t pin : 4;
- uint16_t num_af : 4;
- uint16_t adc_channel : 4;
- uint16_t adc_num : 3; // 1 bit per ADC
- uint16_t pin_mask;
- GPIO_TypeDef *gpio;
+ uint32_t port : 4;
+ uint32_t pin : 5; // Some ARM processors use 32 bits/PORT
+ uint32_t num_af : 4;
+ uint32_t adc_channel : 5; // Some ARM processors use 32 bits/PORT
+ uint32_t adc_num : 3; // 1 bit per ADC
+ uint32_t pin_mask;
+ pin_gpio_t *gpio;
const pin_af_obj_t *af;
} pin_obj_t;
diff --git a/stmhal/pin_defs_stmhal.h b/stmhal/pin_defs_stmhal.h
new file mode 100644
index 0000000000..2b6d9da0e7
--- /dev/null
+++ b/stmhal/pin_defs_stmhal.h
@@ -0,0 +1,96 @@
+/*
+ * This file is part of the Micro Python project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2013, 2014 Damien P. George
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+// This file contains pin definitions that are specific to the stmhal port.
+// This file should only ever be #included by pin.h and not directly.
+
+enum {
+ PORT_A,
+ PORT_B,
+ PORT_C,
+ PORT_D,
+ PORT_E,
+ PORT_F,
+ PORT_G,
+ PORT_H,
+ PORT_I,
+ PORT_J,
+};
+
+enum {
+ AF_FN_TIM,
+ AF_FN_I2C,
+ AF_FN_USART,
+ AF_FN_UART = AF_FN_USART,
+ AF_FN_SPI
+};
+
+enum {
+ AF_PIN_TYPE_TIM_CH1 = 0,
+ AF_PIN_TYPE_TIM_CH2,
+ AF_PIN_TYPE_TIM_CH3,
+ AF_PIN_TYPE_TIM_CH4,
+ AF_PIN_TYPE_TIM_CH1N,
+ AF_PIN_TYPE_TIM_CH2N,
+ AF_PIN_TYPE_TIM_CH3N,
+ AF_PIN_TYPE_TIM_CH1_ETR,
+ AF_PIN_TYPE_TIM_ETR,
+ AF_PIN_TYPE_TIM_BKIN,
+
+ AF_PIN_TYPE_I2C_SDA = 0,
+ AF_PIN_TYPE_I2C_SCL,
+
+ AF_PIN_TYPE_USART_TX = 0,
+ AF_PIN_TYPE_USART_RX,
+ AF_PIN_TYPE_USART_CTS,
+ AF_PIN_TYPE_USART_RTS,
+ AF_PIN_TYPE_USART_CK,
+ AF_PIN_TYPE_UART_TX = AF_PIN_TYPE_USART_TX,
+ AF_PIN_TYPE_UART_RX = AF_PIN_TYPE_USART_RX,
+ AF_PIN_TYPE_UART_CTS = AF_PIN_TYPE_USART_CTS,
+ AF_PIN_TYPE_UART_RTS = AF_PIN_TYPE_USART_RTS,
+
+ AF_PIN_TYPE_SPI_MOSI = 0,
+ AF_PIN_TYPE_SPI_MISO,
+ AF_PIN_TYPE_SPI_SCK,
+ AF_PIN_TYPE_SPI_NSS,
+};
+
+enum {
+ PIN_ADC1 = (1 << 0),
+ PIN_ADC2 = (1 << 1),
+ PIN_ADC3 = (1 << 2),
+};
+
+#define PIN_DEFS_PORT_AF_UNION \
+ TIM_TypeDef *TIM; \
+ I2C_TypeDef *I2C; \
+ USART_TypeDef *USART; \
+ USART_TypeDef *UART; \
+ SPI_TypeDef *SPI;
+
+typedef GPIO_TypeDef pin_gpio_t;
+
diff --git a/stmhal/pin_named_pins.c b/stmhal/pin_named_pins.c
index d59ba8d11d..dbf03d1a0f 100644
--- a/stmhal/pin_named_pins.c
+++ b/stmhal/pin_named_pins.c
@@ -28,13 +28,12 @@
#include <stdint.h>
#include <string.h>
-#include "stm32f4xx_hal.h"
-
#include "mpconfig.h"
#include "misc.h"
#include "qstr.h"
#include "obj.h"
#include "runtime.h"
+#include MICROPY_HAL_H
#include "pin.h"
STATIC void pin_named_pins_obj_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
diff --git a/stmhal/pybstdio.c b/stmhal/pybstdio.c
index 13057a8a06..5447a62202 100644
--- a/stmhal/pybstdio.c
+++ b/stmhal/pybstdio.c
@@ -25,8 +25,7 @@
*/
#include <stdio.h>
-
-#include <stm32f4xx_hal.h>
+#include <stdint.h>
#include "mpconfig.h"
#include "misc.h"
@@ -34,6 +33,7 @@
#include "misc.h"
#include "obj.h"
#include "stream.h"
+#include MICROPY_HAL_H
#include "pybstdio.h"
#include "usb.h"
#include "uart.h"
diff --git a/stmhal/pyexec.c b/stmhal/pyexec.c
index baf6ddfb34..93f4d62a96 100644
--- a/stmhal/pyexec.c
+++ b/stmhal/pyexec.c
@@ -26,8 +26,7 @@
#include <stdlib.h>
#include <stdio.h>
-
-#include <stm32f4xx_hal.h>
+#include <stdint.h>
#include "mpconfig.h"
#include "nlr.h"
@@ -43,6 +42,7 @@
#include "repl.h"
#include "gc.h"
#include "gccollect.h"
+#include MICROPY_HAL_H
#include "systick.h"
#include "pybstdio.h"
#include "readline.h"
diff --git a/stmhal/readline.c b/stmhal/readline.c
index 0e7ed2d644..0703dcf4ea 100644
--- a/stmhal/readline.c
+++ b/stmhal/readline.c
@@ -25,15 +25,15 @@
*/
#include <stdio.h>
+#include <stdint.h>
#include <string.h>
-#include <stm32f4xx_hal.h>
-
#include "mpconfig.h"
#include "misc.h"
#include "qstr.h"
#include "misc.h"
#include "obj.h"
+#include MICROPY_HAL_H
#include "pybstdio.h"
#include "readline.h"
#include "usb.h"