From edb6a4ddf4b6b4412c2ecb79ba64c367a4a95a33 Mon Sep 17 00:00:00 2001 From: Fabian Nack Date: Fri, 15 Aug 2014 20:35:25 +0200 Subject: [PATCH] cpu - stm32f4: added support for more channels/devices in periph impls --- cpu/stm32f4/periph/gpio.c | 193 ++++++++++++++++++++++++++++++++++++++ cpu/stm32f4/periph/uart.c | 63 +++++++++++++ 2 files changed, 256 insertions(+) diff --git a/cpu/stm32f4/periph/gpio.c b/cpu/stm32f4/periph/gpio.c index 96cebcb63e..b797db2eeb 100644 --- a/cpu/stm32f4/periph/gpio.c +++ b/cpu/stm32f4/periph/gpio.c @@ -14,6 +14,7 @@ * @brief Low-level GPIO driver implementation * * @author Hauke Petersen + * @author Fabian Nack * * @} */ @@ -133,6 +134,34 @@ int gpio_init_out(gpio_t dev, gpio_pp_t pullup) port = GPIO_11_PORT; pin = GPIO_11_PIN; break; +#endif +#if GPIO_12_EN + case GPIO_12: + GPIO_12_CLKEN(); + port = GPIO_12_PORT; + pin = GPIO_12_PIN; + break; +#endif +#if GPIO_13_EN + case GPIO_13: + GPIO_13_CLKEN(); + port = GPIO_13_PORT; + pin = GPIO_13_PIN; + break; +#endif +#if GPIO_14_EN + case GPIO_14: + GPIO_14_CLKEN(); + port = GPIO_14_PORT; + pin = GPIO_14_PIN; + break; +#endif +#if GPIO_15_EN + case GPIO_15: + GPIO_15_CLKEN(); + port = GPIO_15_PORT; + pin = GPIO_15_PIN; + break; #endif } @@ -236,6 +265,34 @@ int gpio_init_in(gpio_t dev, gpio_pp_t pullup) port = GPIO_11_PORT; pin = GPIO_11_PIN; break; +#endif +#if GPIO_12_EN + case GPIO_12: + GPIO_12_CLKEN(); + port = GPIO_12_PORT; + pin = GPIO_12_PIN; + break; +#endif +#if GPIO_13_EN + case GPIO_13: + GPIO_13_CLKEN(); + port = GPIO_13_PORT; + pin = GPIO_13_PIN; + break; +#endif +#if GPIO_14_EN + case GPIO_14: + GPIO_14_CLKEN(); + port = GPIO_14_PORT; + pin = GPIO_14_PIN; + break; +#endif +#if GPIO_15_EN + case GPIO_15: + GPIO_15_CLKEN(); + port = GPIO_15_PORT; + pin = GPIO_15_PIN; + break; #endif } @@ -355,6 +412,38 @@ int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, gpio_cb_t cb NVIC_SetPriority(GPIO_11_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_11_IRQ); break; +#endif +#if GPIO_12_EN + case GPIO_12: + pin = GPIO_12_PIN; + GPIO_12_EXTI_CFG(); + NVIC_SetPriority(GPIO_12_IRQ, GPIO_IRQ_PRIO); + NVIC_EnableIRQ(GPIO_12_IRQ); + break; +#endif +#if GPIO_13_EN + case GPIO_13: + pin = GPIO_13_PIN; + GPIO_13_EXTI_CFG(); + NVIC_SetPriority(GPIO_13_IRQ, GPIO_IRQ_PRIO); + NVIC_EnableIRQ(GPIO_13_IRQ); + break; +#endif +#if GPIO_14_EN + case GPIO_14: + pin = GPIO_14_PIN; + GPIO_14_EXTI_CFG(); + NVIC_SetPriority(GPIO_14_IRQ, GPIO_IRQ_PRIO); + NVIC_EnableIRQ(GPIO_14_IRQ); + break; +#endif +#if GPIO_15_EN + case GPIO_15: + pin = GPIO_15_PIN; + GPIO_15_EXTI_CFG(); + NVIC_SetPriority(GPIO_15_IRQ, GPIO_IRQ_PRIO); + NVIC_EnableIRQ(GPIO_15_IRQ); + break; #endif } @@ -448,6 +537,26 @@ void gpio_irq_enable(gpio_t dev) case GPIO_11: EXTI->IMR |= (1 << GPIO_11_PIN); break; +#endif +#if GPIO_12_EN + case GPIO_12: + EXTI->IMR |= (1 << GPIO_12_PIN); + break; +#endif +#if GPIO_13_EN + case GPIO_13: + EXTI->IMR |= (1 << GPIO_13_PIN); + break; +#endif +#if GPIO_14_EN + case GPIO_14: + EXTI->IMR |= (1 << GPIO_14_PIN); + break; +#endif +#if GPIO_15_EN + case GPIO_15: + EXTI->IMR |= (1 << GPIO_15_PIN); + break; #endif } } @@ -514,6 +623,26 @@ void gpio_irq_disable(gpio_t dev) case GPIO_11: EXTI->IMR &= ~(1 << GPIO_11_PIN); break; +#endif +#if GPIO_12_EN + case GPIO_12: + EXTI->IMR &= ~(1 << GPIO_12_PIN); + break; +#endif +#if GPIO_13_EN + case GPIO_13: + EXTI->IMR &= ~(1 << GPIO_13_PIN); + break; +#endif +#if GPIO_14_EN + case GPIO_14: + EXTI->IMR &= ~(1 << GPIO_14_PIN); + break; +#endif +#if GPIO_15_EN + case GPIO_15: + EXTI->IMR &= ~(1 << GPIO_15_PIN); + break; #endif } } @@ -595,6 +724,30 @@ int gpio_read(gpio_t dev) port = GPIO_11_PORT; pin = GPIO_11_PIN; break; +#endif +#if GPIO_12_EN + case GPIO_12: + port = GPIO_12_PORT; + pin = GPIO_12_PIN; + break; +#endif +#if GPIO_13_EN + case GPIO_13: + port = GPIO_13_PORT; + pin = GPIO_13_PIN; + break; +#endif +#if GPIO_14_EN + case GPIO_14: + port = GPIO_14_PORT; + pin = GPIO_14_PIN; + break; +#endif +#if GPIO_15_EN + case GPIO_15: + port = GPIO_15_PORT; + pin = GPIO_15_PIN; + break; #endif } @@ -667,6 +820,26 @@ void gpio_set(gpio_t dev) case GPIO_11: GPIO_11_PORT->ODR |= (1 << GPIO_11_PIN); break; +#endif +#if GPIO_12_EN + case GPIO_12: + GPIO_12_PORT->ODR |= (1 << GPIO_12_PIN); + break; +#endif +#if GPIO_13_EN + case GPIO_13: + GPIO_13_PORT->ODR |= (1 << GPIO_13_PIN); + break; +#endif +#if GPIO_14_EN + case GPIO_14: + GPIO_14_PORT->ODR |= (1 << GPIO_14_PIN); + break; +#endif +#if GPIO_15_EN + case GPIO_15: + GPIO_15_PORT->ODR |= (1 << GPIO_15_PIN); + break; #endif } } @@ -733,6 +906,26 @@ void gpio_clear(gpio_t dev) case GPIO_11: GPIO_11_PORT->ODR &= ~(1 << GPIO_11_PIN); break; +#endif +#if GPIO_12_EN + case GPIO_12: + GPIO_12_PORT->ODR &= ~(1 << GPIO_12_PIN); + break; +#endif +#if GPIO_13_EN + case GPIO_13: + GPIO_13_PORT->ODR &= ~(1 << GPIO_13_PIN); + break; +#endif +#if GPIO_14_EN + case GPIO_14: + GPIO_14_PORT->ODR &= ~(1 << GPIO_14_PIN); + break; +#endif +#if GPIO_15_EN + case GPIO_15: + GPIO_15_PORT->ODR &= ~(1 << GPIO_15_PIN); + break; #endif } } diff --git a/cpu/stm32f4/periph/uart.c b/cpu/stm32f4/periph/uart.c index f0995b9c24..93bddb01f7 100644 --- a/cpu/stm32f4/periph/uart.c +++ b/cpu/stm32f4/periph/uart.c @@ -14,6 +14,7 @@ * @brief Low-level UART driver implementation * * @author Hauke Petersen + * @author Fabian Nack * * @} */ @@ -77,6 +78,13 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, uart_tx_cb_t t NVIC_EnableIRQ(UART_1_IRQ_CHAN); UART_1_DEV->CR1 |= USART_CR1_RXNEIE; break; +#endif +#if UART_2_EN + case UART_2: + NVIC_SetPriority(UART_2_IRQ_CHAN, UART_IRQ_PRIO); + NVIC_EnableIRQ(UART_2_IRQ_CHAN); + UART_2_DEV->CR1 |= USART_CR1_RXNEIE; + break; #endif } @@ -119,9 +127,25 @@ int uart_init_blocking(uart_t uart, uint32_t baudrate) UART_1_CLKEN(); UART_1_PORT_CLKEN(); break; +#endif +#if UART_2_EN + case UART_2: + dev = UART_2_DEV; + port = UART_2_PORT; + clk = UART_2_CLK; + tx_pin = UART_2_TX_PIN; + rx_pin = UART_2_RX_PIN; + af = UART_2_AF; + UART_2_CLKEN(); + UART_2_PORT_CLKEN(); + break; #endif } + /* configure pp mode with no pull for RX and TX pins */ + port->OTYPER &= ~(1 << rx_pin | 1 << tx_pin); + port->PUPDR &= ~(3 << (rx_pin * 2) | 3 << (tx_pin * 2)); + /* configure RX and TX pins, set pin to use alternative function mode */ port->MODER &= ~(3 << (rx_pin * 2) | 3 << (tx_pin * 2)); port->MODER |= 2 << (rx_pin * 2) | 2 << (tx_pin * 2); @@ -169,6 +193,11 @@ void uart_tx_begin(uart_t uart) case UART_1: UART_1_DEV->CR1 |= USART_CR1_TXEIE; break; +#endif +#if UART_2_EN + case UART_2: + UART_2_DEV->CR1 |= USART_CR1_TXEIE; + break; #endif } } @@ -187,6 +216,11 @@ int uart_write(uart_t uart, char data) case UART_1: dev = UART_1_DEV; break; +#endif +#if UART_2_EN + case UART_2: + dev = UART_2_DEV; + break; #endif } @@ -211,6 +245,11 @@ int uart_read_blocking(uart_t uart, char *data) case UART_1: dev = UART_1_DEV; break; +#endif +#if UART_2_EN + case UART_2: + dev = UART_2_DEV; + break; #endif } @@ -234,6 +273,11 @@ int uart_write_blocking(uart_t uart, char data) case UART_1: dev = UART_1_DEV; break; +#endif +#if UART_2_EN + case UART_2: + dev = UART_2_DEV; + break; #endif } @@ -255,6 +299,11 @@ void uart_poweron(uart_t uart) case UART_1: UART_1_CLKEN(); break; +#endif +#if UART_2_EN + case UART_2: + UART_2_CLKEN(); + break; #endif } } @@ -271,6 +320,11 @@ void uart_poweroff(uart_t uart) case UART_1: UART_1_CLKDIS(); break; +#endif +#if UART_2_EN + case UART_2: + UART_2_CLKDIS(); + break; #endif } } @@ -293,6 +347,15 @@ __attribute__((naked)) void UART_1_ISR(void) } #endif +#if UART_2_EN +__attribute__((naked)) void UART_2_ISR(void) +{ + ISR_ENTER(); + irq_handler(UART_2, UART_2_DEV); + ISR_EXIT(); +} +#endif + static inline void irq_handler(uint8_t uartnum, USART_TypeDef *dev) { if (dev->SR & USART_SR_RXNE) {