aboutsummaryrefslogtreecommitdiffstats
path: root/libmaple
diff options
context:
space:
mode:
Diffstat (limited to 'libmaple')
-rw-r--r--libmaple/include/libmaple/i2c.h15
-rw-r--r--libmaple/include/libmaple/nvic.h8
-rw-r--r--libmaple/include/libmaple/stm32.h2
-rw-r--r--libmaple/include/libmaple/systick.h1
-rw-r--r--libmaple/include/libmaple/usb_cdcacm.h2
-rw-r--r--libmaple/stm32f1/include/series/i2c.h13
-rw-r--r--libmaple/stm32f1/include/series/spi.h14
-rw-r--r--libmaple/stm32f2-f4/adc.c (renamed from libmaple/stm32f2/adc.c)0
-rw-r--r--libmaple/stm32f2-f4/dma.c (renamed from libmaple/stm32f2/dma.c)0
-rw-r--r--libmaple/stm32f2-f4/exti.c (renamed from libmaple/stm32f2/exti.c)0
-rw-r--r--libmaple/stm32f2-f4/fsmc.c (renamed from libmaple/stm32f2/fsmc.c)6
-rw-r--r--libmaple/stm32f2-f4/gpio.c (renamed from libmaple/stm32f2/gpio.c)0
-rw-r--r--libmaple/stm32f2-f4/i2c.c99
-rw-r--r--libmaple/stm32f2-f4/include/series/adc.h (renamed from libmaple/stm32f2/include/series/adc.h)0
-rw-r--r--libmaple/stm32f2-f4/include/series/dac.h (renamed from libmaple/stm32f2/include/series/dac.h)0
-rw-r--r--libmaple/stm32f2-f4/include/series/dma.h (renamed from libmaple/stm32f2/include/series/dma.h)0
-rw-r--r--libmaple/stm32f2-f4/include/series/exti.h (renamed from libmaple/stm32f2/include/series/exti.h)0
-rw-r--r--libmaple/stm32f2-f4/include/series/flash.h (renamed from libmaple/stm32f2/include/series/flash.h)4
-rw-r--r--libmaple/stm32f2-f4/include/series/gpio.h (renamed from libmaple/stm32f2/include/series/gpio.h)0
-rw-r--r--libmaple/stm32f2-f4/include/series/i2c.h80
-rw-r--r--libmaple/stm32f2-f4/include/series/nvic.h (renamed from libmaple/stm32f2/include/series/nvic.h)0
-rw-r--r--libmaple/stm32f2-f4/include/series/pwr.h (renamed from libmaple/stm32f2/include/series/pwr.h)0
-rw-r--r--libmaple/stm32f2-f4/include/series/rcc.h (renamed from libmaple/stm32f2/include/series/rcc.h)6
-rw-r--r--libmaple/stm32f2-f4/include/series/spi.h (renamed from libmaple/stm32f2/include/series/spi.h)0
-rw-r--r--libmaple/stm32f2-f4/include/series/stm32.h (renamed from libmaple/stm32f2/include/series/stm32.h)72
-rw-r--r--libmaple/stm32f2-f4/include/series/timer.h (renamed from libmaple/stm32f2/include/series/timer.h)0
-rw-r--r--libmaple/stm32f2-f4/include/series/usart.h (renamed from libmaple/stm32f2/include/series/usart.h)0
-rw-r--r--libmaple/stm32f2-f4/isrs.S (renamed from libmaple/stm32f2/isrs.S)7
-rw-r--r--libmaple/stm32f2-f4/rcc.c (renamed from libmaple/stm32f2/rcc.c)0
-rw-r--r--libmaple/stm32f2-f4/rules.mk (renamed from libmaple/stm32f2/rules.mk)0
-rw-r--r--libmaple/stm32f2-f4/spi.c (renamed from libmaple/stm32f2/spi.c)0
-rw-r--r--libmaple/stm32f2-f4/syscfg.c (renamed from libmaple/stm32f2/syscfg.c)0
-rw-r--r--libmaple/stm32f2-f4/timer.c (renamed from libmaple/stm32f2/timer.c)23
-rw-r--r--libmaple/stm32f2-f4/usart.c (renamed from libmaple/stm32f2/usart.c)6
-rw-r--r--libmaple/stm32f2-f4/vector_table.S (renamed from libmaple/stm32f2/vector_table.S)3
35 files changed, 309 insertions, 52 deletions
diff --git a/libmaple/include/libmaple/i2c.h b/libmaple/include/libmaple/i2c.h
index ff1c313..b198bfa 100644
--- a/libmaple/include/libmaple/i2c.h
+++ b/libmaple/include/libmaple/i2c.h
@@ -47,6 +47,8 @@ extern "C" {
/*
* Series header must provide:
*
+ * - struct i2c_reg_map
+ *
* - uint32 _i2c_bus_clk(i2c_dev*): Clock frequency of dev's bus, in
* MHz. (This is for internal use only).
*
@@ -72,19 +74,6 @@ extern "C" {
#include <libmaple/nvic.h>
#include <libmaple/gpio.h>
-/** I2C register map type */
-typedef struct i2c_reg_map {
- __io uint32 CR1; /**< Control register 1 */
- __io uint32 CR2; /**< Control register 2 */
- __io uint32 OAR1; /**< Own address register 1 */
- __io uint32 OAR2; /**< Own address register 2 */
- __io uint32 DR; /**< Data register */
- __io uint32 SR1; /**< Status register 1 */
- __io uint32 SR2; /**< Status register 2 */
- __io uint32 CCR; /**< Clock control register */
- __io uint32 TRISE; /**< TRISE (rise time) register */
-} i2c_reg_map;
-
/**
* @brief I2C message type
*/
diff --git a/libmaple/include/libmaple/nvic.h b/libmaple/include/libmaple/nvic.h
index ffe385d..3e29f9e 100644
--- a/libmaple/include/libmaple/nvic.h
+++ b/libmaple/include/libmaple/nvic.h
@@ -107,16 +107,12 @@ void nvic_sys_reset();
/**
* Enables interrupts and configurable fault handlers (clear PRIMASK).
*/
-static __always_inline void nvic_globalirq_enable() {
- asm volatile("cpsie i");
-}
+#define nvic_globalirq_enable() do { asm volatile("cpsie i"); } while (0)
/**
* Disable interrupts and configurable fault handlers (set PRIMASK).
*/
-static __always_inline void nvic_globalirq_disable() {
- asm volatile("cpsid i");
-}
+#define nvic_globalirq_disable() do { asm volatile("cpsid i"); } while (0)
/**
* @brief Enable interrupt irq_num
diff --git a/libmaple/include/libmaple/stm32.h b/libmaple/include/libmaple/stm32.h
index 3845cab..5fef820 100644
--- a/libmaple/include/libmaple/stm32.h
+++ b/libmaple/include/libmaple/stm32.h
@@ -69,6 +69,8 @@ extern "C" {
*/
#include <series/stm32.h>
+/* FIXME: need an STM32_USART_MASK to parallel STM32_TIMER_MASK */
+
/* Ensure the series header isn't broken. */
#if (!defined(STM32_PCLK1) || \
!defined(STM32_PCLK2) || \
diff --git a/libmaple/include/libmaple/systick.h b/libmaple/include/libmaple/systick.h
index 551f800..bd8b18f 100644
--- a/libmaple/include/libmaple/systick.h
+++ b/libmaple/include/libmaple/systick.h
@@ -87,6 +87,7 @@ static inline uint32 systick_uptime(void) {
void systick_init(uint32 reload_val);
void systick_disable();
void systick_enable();
+void systick_attach_callback(void (*)(void));
/**
* @brief Returns the current value of the SysTick counter.
diff --git a/libmaple/include/libmaple/usb_cdcacm.h b/libmaple/include/libmaple/usb_cdcacm.h
index 5fe832c..b925883 100644
--- a/libmaple/include/libmaple/usb_cdcacm.h
+++ b/libmaple/include/libmaple/usb_cdcacm.h
@@ -168,7 +168,7 @@ int usb_cdcacm_get_n_data_bits(void); /* bDataBits */
void usb_cdcacm_set_hooks(unsigned hook_flags, void (*hook)(unsigned, void*));
-static __always_inline void usb_cdcacm_remove_hooks(unsigned hook_flags) {
+static inline void usb_cdcacm_remove_hooks(unsigned hook_flags) {
usb_cdcacm_set_hooks(hook_flags, 0);
}
diff --git a/libmaple/stm32f1/include/series/i2c.h b/libmaple/stm32f1/include/series/i2c.h
index f407955..ae05377 100644
--- a/libmaple/stm32f1/include/series/i2c.h
+++ b/libmaple/stm32f1/include/series/i2c.h
@@ -41,7 +41,18 @@
* Register maps
*/
-struct i2c_reg_map;
+/** I2C register map type */
+typedef struct i2c_reg_map {
+ __io uint32 CR1; /**< Control register 1 */
+ __io uint32 CR2; /**< Control register 2 */
+ __io uint32 OAR1; /**< Own address register 1 */
+ __io uint32 OAR2; /**< Own address register 2 */
+ __io uint32 DR; /**< Data register */
+ __io uint32 SR1; /**< Status register 1 */
+ __io uint32 SR2; /**< Status register 2 */
+ __io uint32 CCR; /**< Clock control register */
+ __io uint32 TRISE; /**< TRISE (rise time) register */
+} i2c_reg_map;
/** STM32F1 I2C1 register map base pointer */
#define I2C1_BASE ((struct i2c_reg_map*)0x40005400)
diff --git a/libmaple/stm32f1/include/series/spi.h b/libmaple/stm32f1/include/series/spi.h
index d288a0c..b65111b 100644
--- a/libmaple/stm32f1/include/series/spi.h
+++ b/libmaple/stm32f1/include/series/spi.h
@@ -75,13 +75,13 @@ extern void spi_config_gpios(struct spi_dev*, uint8,
* @brief Deprecated. Use spi_config_gpios() instead.
* @see spi_config_gpios()
*/
-static __always_inline void spi_gpio_cfg(uint8 as_master,
- struct gpio_dev *nss_dev,
- uint8 nss_bit,
- struct gpio_dev *comm_dev,
- uint8 sck_bit,
- uint8 miso_bit,
- uint8 mosi_bit) {
+static inline void spi_gpio_cfg(uint8 as_master,
+ struct gpio_dev *nss_dev,
+ uint8 nss_bit,
+ struct gpio_dev *comm_dev,
+ uint8 sck_bit,
+ uint8 miso_bit,
+ uint8 mosi_bit) {
/* We switched style globally to foo_config_gpios() and always
* taking a foo_dev* argument (that last bit is the important
* part) after this function was written.
diff --git a/libmaple/stm32f2/adc.c b/libmaple/stm32f2-f4/adc.c
index a400d7b..a400d7b 100644
--- a/libmaple/stm32f2/adc.c
+++ b/libmaple/stm32f2-f4/adc.c
diff --git a/libmaple/stm32f2/dma.c b/libmaple/stm32f2-f4/dma.c
index 26e87b9..26e87b9 100644
--- a/libmaple/stm32f2/dma.c
+++ b/libmaple/stm32f2-f4/dma.c
diff --git a/libmaple/stm32f2/exti.c b/libmaple/stm32f2-f4/exti.c
index 208415f..208415f 100644
--- a/libmaple/stm32f2/exti.c
+++ b/libmaple/stm32f2-f4/exti.c
diff --git a/libmaple/stm32f2/fsmc.c b/libmaple/stm32f2-f4/fsmc.c
index ec41720..4ee23fa 100644
--- a/libmaple/stm32f2/fsmc.c
+++ b/libmaple/stm32f2-f4/fsmc.c
@@ -30,6 +30,10 @@
* @brief STM32F2 FSMC support.
*/
+#include <libmaple/stm32.h>
+
+#if STM32_HAVE_FSMC /* Don't try building the rest for MCUs without FSMC */
+
#include <libmaple/fsmc.h>
#include <libmaple/gpio.h>
@@ -88,3 +92,5 @@ void fsmc_sram_init_gpios(void) {
CONFIG_GPIO(GPIOE, 0);
CONFIG_GPIO(GPIOE, 1);
}
+
+#endif /* STM32_HAVE_FSMC */
diff --git a/libmaple/stm32f2/gpio.c b/libmaple/stm32f2-f4/gpio.c
index a26edaa..a26edaa 100644
--- a/libmaple/stm32f2/gpio.c
+++ b/libmaple/stm32f2-f4/gpio.c
diff --git a/libmaple/stm32f2-f4/i2c.c b/libmaple/stm32f2-f4/i2c.c
new file mode 100644
index 0000000..42fd427
--- /dev/null
+++ b/libmaple/stm32f2-f4/i2c.c
@@ -0,0 +1,99 @@
+/******************************************************************************
+ * The MIT License
+ *
+ * Copyright (c) 2012 LeafLabs, LLC.
+ * Copyright (c) 2014 Google, Inc.
+ *
+ * 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.
+ *****************************************************************************/
+
+#include "i2c_private.h"
+#include <libmaple/i2c.h>
+
+/*
+ * Devices
+ */
+
+static i2c_dev i2c1 = I2C_DEV_NEW(1, &gpiob, 7, &gpiob, 6);
+static i2c_dev i2c2 = I2C_DEV_NEW(1, &gpioh, 5, &gpioh, 4);
+static i2c_dev i2c3 = I2C_DEV_NEW(1, &gpioh, 8, &gpioh, 7);
+
+/** I2C1 device */
+i2c_dev* const I2C1 = &i2c1;
+/** I2C2 device */
+i2c_dev* const I2C2 = &i2c2;
+/** I2C3 device */
+i2c_dev* const I2C3 = &i2c3;
+
+/*
+ * libmaple routines
+ */
+
+#define I2C_MODEF_FLAGS (GPIO_MODEF_TYPE_OD | GPIO_MODEF_SPEED_HIGH | \
+ GPIO_MODEF_PUPD_PU)
+
+void i2c_config_gpios(const i2c_dev *dev) {
+ /* Untested... */
+ gpio_set_modef(sda_port(dev), dev->sda_pin, GPIO_MODE_AF, I2C_MODEF_FLAGS);
+ gpio_set_modef(scl_port(dev), dev->scl_pin, GPIO_MODE_AF, I2C_MODEF_FLAGS);
+ gpio_set_af(sda_port(dev), dev->sda_pin, GPIO_AF_I2C);
+ gpio_set_af(scl_port(dev), dev->scl_pin, GPIO_AF_I2C);
+}
+
+void i2c_master_release_bus(const i2c_dev *dev) {
+ /* Untested... */
+ unsigned flags = (GPIO_MODEF_TYPE_OD | GPIO_MODEF_SPEED_HIGH |
+ GPIO_MODEF_PUPD_PU);
+ gpio_write_bit(scl_port(dev), dev->scl_pin, 1);
+ gpio_write_bit(sda_port(dev), dev->sda_pin, 1);
+ gpio_set_modef(scl_port(dev), dev->scl_pin, GPIO_MODE_OUTPUT,
+ I2C_MODEF_FLAGS);
+ gpio_set_modef(sda_port(dev), dev->sda_pin, GPIO_MODE_OUTPUT,
+ I2C_MODEF_FLAGS);
+}
+
+/*
+ * IRQ Handlers
+ */
+
+void __irq_i2c1_ev(void) {
+ _i2c_irq_handler(I2C1);
+}
+
+void __irq_i2c2_ev(void) {
+ _i2c_irq_handler(I2C2);
+}
+
+void __irq_i2c3_ev(void) {
+ _i2c_irq_handler(I2C3);
+}
+
+void __irq_i2c1_er(void) {
+ _i2c_irq_error_handler(I2C1);
+}
+
+void __irq_i2c2_er(void) {
+ _i2c_irq_error_handler(I2C2);
+}
+
+void __irq_i2c3_er(void) {
+ _i2c_irq_error_handler(I2C3);
+}
diff --git a/libmaple/stm32f2/include/series/adc.h b/libmaple/stm32f2-f4/include/series/adc.h
index 175fe11..175fe11 100644
--- a/libmaple/stm32f2/include/series/adc.h
+++ b/libmaple/stm32f2-f4/include/series/adc.h
diff --git a/libmaple/stm32f2/include/series/dac.h b/libmaple/stm32f2-f4/include/series/dac.h
index 0a578ca..0a578ca 100644
--- a/libmaple/stm32f2/include/series/dac.h
+++ b/libmaple/stm32f2-f4/include/series/dac.h
diff --git a/libmaple/stm32f2/include/series/dma.h b/libmaple/stm32f2-f4/include/series/dma.h
index 43bd1a2..43bd1a2 100644
--- a/libmaple/stm32f2/include/series/dma.h
+++ b/libmaple/stm32f2-f4/include/series/dma.h
diff --git a/libmaple/stm32f2/include/series/exti.h b/libmaple/stm32f2-f4/include/series/exti.h
index 4643fcf..4643fcf 100644
--- a/libmaple/stm32f2/include/series/exti.h
+++ b/libmaple/stm32f2-f4/include/series/exti.h
diff --git a/libmaple/stm32f2/include/series/flash.h b/libmaple/stm32f2-f4/include/series/flash.h
index a3c3933..1da55cd 100644
--- a/libmaple/stm32f2/include/series/flash.h
+++ b/libmaple/stm32f2-f4/include/series/flash.h
@@ -186,7 +186,11 @@ typedef struct flash_reg_map {
*/
/* Note that this value depends on a 2.7V--3.6V supply voltage */
+#if STM32_MCU_SERIES == STM32_SERIES_F4
+#define FLASH_SAFE_WAIT_STATES FLASH_WAIT_STATE_2
+#else
#define FLASH_SAFE_WAIT_STATES FLASH_WAIT_STATE_3
+#endif
/* Flash memory features available via ACR. */
enum {
diff --git a/libmaple/stm32f2/include/series/gpio.h b/libmaple/stm32f2-f4/include/series/gpio.h
index 4d0d98c..4d0d98c 100644
--- a/libmaple/stm32f2/include/series/gpio.h
+++ b/libmaple/stm32f2-f4/include/series/gpio.h
diff --git a/libmaple/stm32f2-f4/include/series/i2c.h b/libmaple/stm32f2-f4/include/series/i2c.h
new file mode 100644
index 0000000..b231256
--- /dev/null
+++ b/libmaple/stm32f2-f4/include/series/i2c.h
@@ -0,0 +1,80 @@
+/******************************************************************************
+ * The MIT License
+ *
+ * Copyright (c) 2010 Perry Hung (from <libmaple/i2c.h>).
+ * Copyright (c) 2012 LeafLabs, LLC.
+ * Copyright (c) 2014 Google, Inc.
+ *
+ * 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.
+ *****************************************************************************/
+
+#ifndef _LIBMAPLE_STM32F2_I2C_H_
+#define _LIBMAPLE_STM32F2_I2C_H_
+
+#include <libmaple/i2c_common.h>
+#include <libmaple/stm32.h>
+
+/*
+ * Register maps
+ */
+
+/** I2C register map type */
+typedef struct i2c_reg_map {
+ __io uint32 CR1; /**< Control register 1 */
+ __io uint32 CR2; /**< Control register 2 */
+ __io uint32 OAR1; /**< Own address register 1 */
+ __io uint32 OAR2; /**< Own address register 2 */
+ __io uint32 DR; /**< Data register */
+ __io uint32 SR1; /**< Status register 1 */
+ __io uint32 SR2; /**< Status register 2 */
+ __io uint32 CCR; /**< Clock control register */
+ __io uint32 TRISE; /**< TRISE (rise time) register */
+ __io uint32 FLTR; /**< Noise filter register */
+} i2c_reg_map;
+
+/** I2C1 register map base pointer */
+#define I2C1_BASE ((struct i2c_reg_map*)0x40005400)
+/** I2C2 register map base pointer */
+#define I2C2_BASE ((struct i2c_reg_map*)0x40005800)
+/** I2C3 register map base pointer */
+#define I2C3_BASE ((struct i2c_reg_map*)0x40005C00)
+
+/*
+ * Devices
+ */
+
+extern i2c_dev* const I2C1;
+extern i2c_dev* const I2C2;
+extern i2c_dev* const I2C3;
+
+/*
+ * For internal use
+ */
+
+static inline uint32 _i2c_bus_clk(i2c_dev *dev) {
+ /* All the I2C peripherals are on APB1 */
+ return STM32_PCLK1 / (1000 * 1000);
+}
+
+#undef _I2C_HAVE_IRQ_FIXUP
+#undef _I2C_HAVE_DEPRECATED_I2C_REMAP
+
+#endif /* _LIBMAPLE_STM32F1_I2C_H_ */
diff --git a/libmaple/stm32f2/include/series/nvic.h b/libmaple/stm32f2-f4/include/series/nvic.h
index dc03806..dc03806 100644
--- a/libmaple/stm32f2/include/series/nvic.h
+++ b/libmaple/stm32f2-f4/include/series/nvic.h
diff --git a/libmaple/stm32f2/include/series/pwr.h b/libmaple/stm32f2-f4/include/series/pwr.h
index 96353a4..96353a4 100644
--- a/libmaple/stm32f2/include/series/pwr.h
+++ b/libmaple/stm32f2-f4/include/series/pwr.h
diff --git a/libmaple/stm32f2/include/series/rcc.h b/libmaple/stm32f2-f4/include/series/rcc.h
index 441a5a8..7cb7df1 100644
--- a/libmaple/stm32f2/include/series/rcc.h
+++ b/libmaple/stm32f2-f4/include/series/rcc.h
@@ -128,7 +128,11 @@ typedef struct rcc_reg_map {
#define RCC_PLLCFGR_PLLSRC_HSE (0x1 << RCC_PLLCFGR_PLLSRC_BIT)
#define RCC_PLLCFGR_PLLP (0x3 << 16)
#define RCC_PLLCFGR_PLLN (0x1FF << 6)
-#define RCC_PLLCFGR_PLLM 0x1F
+#if STM32_MCU_SERIES == STM32_SERIES_F4
+# define RCC_PLLCFGR_PLLM 0x3F
+#else
+# define RCC_PLLCFGR_PLLM 0x1F
+#endif
/* Clock configuration register */
diff --git a/libmaple/stm32f2/include/series/spi.h b/libmaple/stm32f2-f4/include/series/spi.h
index 7b9f94a..7b9f94a 100644
--- a/libmaple/stm32f2/include/series/spi.h
+++ b/libmaple/stm32f2-f4/include/series/spi.h
diff --git a/libmaple/stm32f2/include/series/stm32.h b/libmaple/stm32f2-f4/include/series/stm32.h
index 180ab30..c2ad2f2 100644
--- a/libmaple/stm32f2/include/series/stm32.h
+++ b/libmaple/stm32f2-f4/include/series/stm32.h
@@ -37,37 +37,69 @@ extern "C" {
#endif
/*
- * Chip configuration
+ * MCU-specific values
*/
+#if defined(MCU_STM32F207IC) || defined(MCU_STM32F207IG)
+# define STM32_MCU_SERIES STM32_SERIES_F2
+# define STM32_NR_GPIO_PORTS 9
+# define STM32_TIMER_MASK 0x7FFE /* TIMER1-TIMER14. */
+# define STM32_SRAM_END ((void*)0x20020000)
+#elif defined(MCU_STM32F401VC)
+# define STM32_MCU_SERIES STM32_SERIES_F4
+# define STM32_NR_GPIO_PORTS 5
+# define STM32_TIMER_MASK 0x3E
+/* TODO: This value for STM32_SRAM_END is very generous */
+# define STM32_SRAM_END ((void*)0x20020000)
+#elif defined(MCU_STM32F401CC)
+# define STM32_MCU_SERIES STM32_SERIES_F4
+# define STM32_NR_GPIO_PORTS 3
+# define STM32_TIMER_MASK 0x3E
+# define STM32_SRAM_END ((void*)0x20010000)
+#else
+#warning "Unsupported or unspecified STM32F2 MCU."
+#endif
+
+/*
+ * Series-specific values
+ */
+
+#if STM32_MCU_SERIES == STM32_SERIES_F2
+# define STM32_NR_INTERRUPTS 81
+# define STM32_HAVE_FSMC 1
+# define STM32_HAVE_USB 1
+# define STM32_HAVE_DAC 1
+
+# ifndef STM32_PCLK1
+# define STM32_PCLK1 30000000U
+# endif
+
+# ifndef STM32_PCLK2
+# define STM32_PCLK2 60000000U
+# endif
+
+# ifndef STM32_DELAY_US_MULT
+# define STM32_DELAY_US_MULT 20 /* FIXME: dummy value. */
+# endif
+#elif STM32_MCU_SERIES == STM32_SERIES_F4
+# define STM32_NR_INTERRUPTS 84
+# define STM32_HAVE_FSMC 0
+# define STM32_HAVE_USB 0
+# define STM32_HAVE_DAC 0
+
#ifndef STM32_PCLK1
-#define STM32_PCLK1 30000000U
+#define STM32_PCLK1 42000000U
#endif
#ifndef STM32_PCLK2
-#define STM32_PCLK2 60000000U
+#define STM32_PCLK2 84000000U
#endif
#ifndef STM32_DELAY_US_MULT
-#define STM32_DELAY_US_MULT 20 /* FIXME: dummy value. */
+#define STM32_DELAY_US_MULT 28 /* CYCLES_PER_MICROSECOND/3 */
#endif
-
-/*
- * Series- and MCU-specific values
- */
-
-#define STM32_MCU_SERIES STM32_SERIES_F2
-#define STM32_NR_INTERRUPTS 81
-#define STM32_HAVE_FSMC 1
-#define STM32_HAVE_USB 1
-#define STM32_HAVE_DAC 1
-
-#if defined(MCU_STM32F207IC) || defined(MCU_STM32F207IG)
-# define STM32_NR_GPIO_PORTS 9
-# define STM32_TIMER_MASK 0x7FFE /* TIMER1-TIMER14. */
-# define STM32_SRAM_END ((void*)0x20020000)
#else
-#warning "Unsupported or unspecified STM32F2 MCU."
+# error "Invalid STM32 series for this header"
#endif
#ifdef __cplusplus
diff --git a/libmaple/stm32f2/include/series/timer.h b/libmaple/stm32f2-f4/include/series/timer.h
index a7ac276..a7ac276 100644
--- a/libmaple/stm32f2/include/series/timer.h
+++ b/libmaple/stm32f2-f4/include/series/timer.h
diff --git a/libmaple/stm32f2/include/series/usart.h b/libmaple/stm32f2-f4/include/series/usart.h
index 8936efa..8936efa 100644
--- a/libmaple/stm32f2/include/series/usart.h
+++ b/libmaple/stm32f2-f4/include/series/usart.h
diff --git a/libmaple/stm32f2/isrs.S b/libmaple/stm32f2-f4/isrs.S
index 5baaf8b..cda627a 100644
--- a/libmaple/stm32f2/isrs.S
+++ b/libmaple/stm32f2-f4/isrs.S
@@ -320,3 +320,10 @@ __default_handler:
.weak __irq_hash_rng
.globl __irq_hash_rng
.set __irq_hash_rng, __default_handler
+/* STM32F4 Specific */
+ .weak __irq_fpu
+ .globl __irq_fpu
+ .set __irq_fpu, __default_handler
+ .weak __irq_spi4
+ .globl __irq_spi4
+ .set __irq_spi4, __default_handler
diff --git a/libmaple/stm32f2/rcc.c b/libmaple/stm32f2-f4/rcc.c
index 7fc7eb0..7fc7eb0 100644
--- a/libmaple/stm32f2/rcc.c
+++ b/libmaple/stm32f2-f4/rcc.c
diff --git a/libmaple/stm32f2/rules.mk b/libmaple/stm32f2-f4/rules.mk
index 4c62cc2..4c62cc2 100644
--- a/libmaple/stm32f2/rules.mk
+++ b/libmaple/stm32f2-f4/rules.mk
diff --git a/libmaple/stm32f2/spi.c b/libmaple/stm32f2-f4/spi.c
index cfd9995..cfd9995 100644
--- a/libmaple/stm32f2/spi.c
+++ b/libmaple/stm32f2-f4/spi.c
diff --git a/libmaple/stm32f2/syscfg.c b/libmaple/stm32f2-f4/syscfg.c
index 19e932e..19e932e 100644
--- a/libmaple/stm32f2/syscfg.c
+++ b/libmaple/stm32f2-f4/syscfg.c
diff --git a/libmaple/stm32f2/timer.c b/libmaple/stm32f2-f4/timer.c
index a85bea0..4ef466a 100644
--- a/libmaple/stm32f2/timer.c
+++ b/libmaple/stm32f2-f4/timer.c
@@ -31,6 +31,7 @@
*/
#include <libmaple/timer.h>
+#include <libmaple/stm32.h>
#include "timer_private.h"
/*
@@ -85,17 +86,23 @@ gpio_af timer_get_af(timer_dev *dev) {
void __irq_tim1_brk_tim9(void) {
dispatch_adv_brk(TIMER1);
+#if STM32_HAVE_TIMER(9)
dispatch_tim_9_12(TIMER9);
+#endif
}
void __irq_tim1_up_tim10(void) {
dispatch_adv_up(TIMER1);
+#if STM32_HAVE_TIMER(10)
dispatch_tim_10_11_13_14(TIMER10);
+#endif
}
void __irq_tim1_trg_com_tim11(void) {
dispatch_adv_trg_com(TIMER1);
+#if STM32_HAVE_TIMER(11)
dispatch_tim_10_11_13_14(TIMER11);
+#endif
}
void __irq_tim1_cc(void) {
@@ -125,24 +132,40 @@ void __irq_tim6(void) {
}
void __irq_tim7(void) {
+#if STM32_HAVE_TIMER(7)
dispatch_basic(TIMER7);
+#endif
}
void __irq_tim8_brk_tim12(void) {
+#if STM32_HAVE_TIMER(8)
dispatch_adv_brk(TIMER8);
+#endif
+#if STM32_HAVE_TIMER(12)
dispatch_tim_9_12(TIMER12);
+#endif
}
void __irq_tim8_up_tim13(void) {
+#if STM32_HAVE_TIMER(8)
dispatch_adv_up(TIMER8);
+#endif
+#if STM32_HAVE_TIMER(13)
dispatch_tim_10_11_13_14(TIMER13);
+#endif
}
void __irq_tim8_trg_com_tim14(void) {
+#if STM32_HAVE_TIMER(8)
dispatch_adv_trg_com(TIMER8);
+#endif
+#if STM32_HAVE_TIMER(14)
dispatch_tim_10_11_13_14(TIMER14);
+#endif
}
void __irq_tim8_cc(void) {
+#if STM32_HAVE_TIMER(8)
dispatch_adv_cc(TIMER8);
+#endif
}
diff --git a/libmaple/stm32f2/usart.c b/libmaple/stm32f2-f4/usart.c
index 1472d13..fce122f 100644
--- a/libmaple/stm32f2/usart.c
+++ b/libmaple/stm32f2-f4/usart.c
@@ -42,7 +42,7 @@ static ring_buffer usart1_rb;
static usart_dev usart1 = {
.regs = USART1_BASE,
.rb = &usart1_rb,
- .max_baud = 4500000UL, /* TODO: are these correct? */
+ .max_baud = 4500000UL, /* TODO: are these correct? 5250000UL for STM32F4? */
.clk_id = RCC_USART1,
.irq_num = NVIC_USART1,
};
@@ -53,7 +53,7 @@ static ring_buffer usart2_rb;
static usart_dev usart2 = {
.regs = USART2_BASE,
.rb = &usart2_rb,
- .max_baud = 2250000UL, /* TODO: are these correct? */
+ .max_baud = 2250000UL, /* TODO: are these correct? 2620000UL for STM32F4? */
.clk_id = RCC_USART2,
.irq_num = NVIC_USART2,
};
@@ -97,7 +97,7 @@ static ring_buffer usart6_rb;
static usart_dev usart6 = {
.regs = USART6_BASE,
.rb = &usart6_rb,
- .max_baud = 4500000UL, /* TODO: are these correct? */
+ .max_baud = 4500000UL, /* TODO: are these correct? 5250000UL for STM32F4? */
.clk_id = RCC_USART6,
.irq_num = NVIC_USART6,
};
diff --git a/libmaple/stm32f2/vector_table.S b/libmaple/stm32f2-f4/vector_table.S
index 147e516..752503b 100644
--- a/libmaple/stm32f2/vector_table.S
+++ b/libmaple/stm32f2-f4/vector_table.S
@@ -131,5 +131,8 @@ __stm32_vector_table:
.long __irq_dcmi
.long __irq_cryp
.long __irq_hash_rng
+/* STM32F4-specific */
+ .long __irq_fpu
+ .long __irq_spi4
.size __stm32_vector_table, . - __stm32_vector_table