diff options
Diffstat (limited to 'libmaple')
-rw-r--r-- | libmaple/include/libmaple/i2c.h | 15 | ||||
-rw-r--r-- | libmaple/include/libmaple/nvic.h | 8 | ||||
-rw-r--r-- | libmaple/include/libmaple/stm32.h | 2 | ||||
-rw-r--r-- | libmaple/include/libmaple/systick.h | 1 | ||||
-rw-r--r-- | libmaple/include/libmaple/usb_cdcacm.h | 2 | ||||
-rw-r--r-- | libmaple/stm32f1/include/series/i2c.h | 13 | ||||
-rw-r--r-- | libmaple/stm32f1/include/series/spi.h | 14 | ||||
-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.c | 99 | ||||
-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.h | 80 | ||||
-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 |