1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

cpu - stm32f4: added support for more channels/devices in periph impls

This commit is contained in:
Fabian Nack 2014-08-15 20:35:25 +02:00
parent 47657ac7d9
commit edb6a4ddf4
2 changed files with 256 additions and 0 deletions

View File

@ -14,6 +14,7 @@
* @brief Low-level GPIO driver implementation * @brief Low-level GPIO driver implementation
* *
* @author Hauke Petersen <mail@haukepetersen.de> * @author Hauke Petersen <mail@haukepetersen.de>
* @author Fabian Nack <nack@inf.fu-berlin.de>
* *
* @} * @}
*/ */
@ -133,6 +134,34 @@ int gpio_init_out(gpio_t dev, gpio_pp_t pullup)
port = GPIO_11_PORT; port = GPIO_11_PORT;
pin = GPIO_11_PIN; pin = GPIO_11_PIN;
break; 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 #endif
} }
@ -236,6 +265,34 @@ int gpio_init_in(gpio_t dev, gpio_pp_t pullup)
port = GPIO_11_PORT; port = GPIO_11_PORT;
pin = GPIO_11_PIN; pin = GPIO_11_PIN;
break; 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 #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_SetPriority(GPIO_11_IRQ, GPIO_IRQ_PRIO);
NVIC_EnableIRQ(GPIO_11_IRQ); NVIC_EnableIRQ(GPIO_11_IRQ);
break; 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 #endif
} }
@ -448,6 +537,26 @@ void gpio_irq_enable(gpio_t dev)
case GPIO_11: case GPIO_11:
EXTI->IMR |= (1 << GPIO_11_PIN); EXTI->IMR |= (1 << GPIO_11_PIN);
break; 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 #endif
} }
} }
@ -514,6 +623,26 @@ void gpio_irq_disable(gpio_t dev)
case GPIO_11: case GPIO_11:
EXTI->IMR &= ~(1 << GPIO_11_PIN); EXTI->IMR &= ~(1 << GPIO_11_PIN);
break; 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 #endif
} }
} }
@ -595,6 +724,30 @@ int gpio_read(gpio_t dev)
port = GPIO_11_PORT; port = GPIO_11_PORT;
pin = GPIO_11_PIN; pin = GPIO_11_PIN;
break; 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 #endif
} }
@ -667,6 +820,26 @@ void gpio_set(gpio_t dev)
case GPIO_11: case GPIO_11:
GPIO_11_PORT->ODR |= (1 << GPIO_11_PIN); GPIO_11_PORT->ODR |= (1 << GPIO_11_PIN);
break; 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 #endif
} }
} }
@ -733,6 +906,26 @@ void gpio_clear(gpio_t dev)
case GPIO_11: case GPIO_11:
GPIO_11_PORT->ODR &= ~(1 << GPIO_11_PIN); GPIO_11_PORT->ODR &= ~(1 << GPIO_11_PIN);
break; 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 #endif
} }
} }

View File

@ -14,6 +14,7 @@
* @brief Low-level UART driver implementation * @brief Low-level UART driver implementation
* *
* @author Hauke Petersen <hauke.petersen@fu-berlin.de> * @author Hauke Petersen <hauke.petersen@fu-berlin.de>
* @author Fabian Nack <nack@inf.fu-berlin.de>
* *
* @} * @}
*/ */
@ -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); NVIC_EnableIRQ(UART_1_IRQ_CHAN);
UART_1_DEV->CR1 |= USART_CR1_RXNEIE; UART_1_DEV->CR1 |= USART_CR1_RXNEIE;
break; 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 #endif
} }
@ -119,9 +127,25 @@ int uart_init_blocking(uart_t uart, uint32_t baudrate)
UART_1_CLKEN(); UART_1_CLKEN();
UART_1_PORT_CLKEN(); UART_1_PORT_CLKEN();
break; 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 #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 */ /* configure RX and TX pins, set pin to use alternative function mode */
port->MODER &= ~(3 << (rx_pin * 2) | 3 << (tx_pin * 2)); port->MODER &= ~(3 << (rx_pin * 2) | 3 << (tx_pin * 2));
port->MODER |= 2 << (rx_pin * 2) | 2 << (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: case UART_1:
UART_1_DEV->CR1 |= USART_CR1_TXEIE; UART_1_DEV->CR1 |= USART_CR1_TXEIE;
break; break;
#endif
#if UART_2_EN
case UART_2:
UART_2_DEV->CR1 |= USART_CR1_TXEIE;
break;
#endif #endif
} }
} }
@ -187,6 +216,11 @@ int uart_write(uart_t uart, char data)
case UART_1: case UART_1:
dev = UART_1_DEV; dev = UART_1_DEV;
break; break;
#endif
#if UART_2_EN
case UART_2:
dev = UART_2_DEV;
break;
#endif #endif
} }
@ -211,6 +245,11 @@ int uart_read_blocking(uart_t uart, char *data)
case UART_1: case UART_1:
dev = UART_1_DEV; dev = UART_1_DEV;
break; break;
#endif
#if UART_2_EN
case UART_2:
dev = UART_2_DEV;
break;
#endif #endif
} }
@ -234,6 +273,11 @@ int uart_write_blocking(uart_t uart, char data)
case UART_1: case UART_1:
dev = UART_1_DEV; dev = UART_1_DEV;
break; break;
#endif
#if UART_2_EN
case UART_2:
dev = UART_2_DEV;
break;
#endif #endif
} }
@ -255,6 +299,11 @@ void uart_poweron(uart_t uart)
case UART_1: case UART_1:
UART_1_CLKEN(); UART_1_CLKEN();
break; break;
#endif
#if UART_2_EN
case UART_2:
UART_2_CLKEN();
break;
#endif #endif
} }
} }
@ -271,6 +320,11 @@ void uart_poweroff(uart_t uart)
case UART_1: case UART_1:
UART_1_CLKDIS(); UART_1_CLKDIS();
break; break;
#endif
#if UART_2_EN
case UART_2:
UART_2_CLKDIS();
break;
#endif #endif
} }
} }
@ -293,6 +347,15 @@ __attribute__((naked)) void UART_1_ISR(void)
} }
#endif #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) static inline void irq_handler(uint8_t uartnum, USART_TypeDef *dev)
{ {
if (dev->SR & USART_SR_RXNE) { if (dev->SR & USART_SR_RXNE) {