From 693307d51d568986faa732cdfecb82939e7a31c2 Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Tue, 9 Dec 2014 02:55:36 +0000 Subject: [PATCH] STM32F30x - Add support for UART3 - untested. --- src/main/drivers/nvic.h | 2 + src/main/drivers/serial_uart_stm32f30x.c | 102 +++++++++++++++++++++++ src/main/io/serial.c | 8 +- 3 files changed, 110 insertions(+), 2 deletions(-) diff --git a/src/main/drivers/nvic.h b/src/main/drivers/nvic.h index 71e4f17815..2d8b10ac50 100644 --- a/src/main/drivers/nvic.h +++ b/src/main/drivers/nvic.h @@ -14,6 +14,8 @@ #define NVIC_PRIO_SERIALUART2_TXDMA NVIC_BUILD_PRIORITY(1, 0) #define NVIC_PRIO_SERIALUART2_RXDMA NVIC_BUILD_PRIORITY(1, 1) #define NVIC_PRIO_SERIALUART2 NVIC_BUILD_PRIORITY(1, 2) +#define NVIC_PRIO_SERIALUART3_TXDMA NVIC_BUILD_PRIORITY(1, 0) +#define NVIC_PRIO_SERIALUART3_RXDMA NVIC_BUILD_PRIORITY(1, 1) #define NVIC_PRIO_SERIALUART3 NVIC_BUILD_PRIORITY(1, 2) #define NVIC_PRIO_I2C_ER NVIC_BUILD_PRIORITY(0, 0) #define NVIC_PRIO_I2C_EV NVIC_BUILD_PRIORITY(0, 0) diff --git a/src/main/drivers/serial_uart_stm32f30x.c b/src/main/drivers/serial_uart_stm32f30x.c index 8e4378f3c9..fb85e6326e 100644 --- a/src/main/drivers/serial_uart_stm32f30x.c +++ b/src/main/drivers/serial_uart_stm32f30x.c @@ -53,8 +53,15 @@ #define UART2_TX_PINSOURCE GPIO_PinSource5 #define UART2_RX_PINSOURCE GPIO_PinSource6 +#define UART3_TX_PIN GPIO_Pin_10 // PB10 (AF7) +#define UART3_RX_PIN GPIO_Pin_11 // PB11 (AF7) +#define UART3_GPIO GPIOB +#define UART3_TX_PINSOURCE GPIO_PinSource5 +#define UART3_RX_PINSOURCE GPIO_PinSource6 + static uartPort_t uartPort1; static uartPort_t uartPort2; +static uartPort_t uartPort3; void uartStartTxDMA(uartPort_t *s); @@ -210,6 +217,85 @@ uartPort_t *serialUSART2(uint32_t baudRate, portMode_t mode) return s; } +uartPort_t *serialUSART3(uint32_t baudRate, portMode_t mode) +{ + uartPort_t *s; + static volatile uint8_t rx3Buffer[UART3_RX_BUFFER_SIZE]; + static volatile uint8_t tx3Buffer[UART3_TX_BUFFER_SIZE]; + NVIC_InitTypeDef NVIC_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + + s = &uartPort3; + s->port.vTable = uartVTable; + + s->port.baudRate = baudRate; + + s->port.rxBufferSize = UART3_RX_BUFFER_SIZE; + s->port.txBufferSize = UART3_TX_BUFFER_SIZE; + s->port.rxBuffer = rx3Buffer; + s->port.txBuffer = tx3Buffer; + + s->USARTx = USART3; + +#ifdef USE_USART3_RX_DMA + s->rxDMAChannel = DMA1_Channel3; + s->rxDMAPeripheralBaseAddr = (uint32_t)&s->USARTx->RDR; +#endif +#ifdef USE_USART3_TX_DMA + s->txDMAChannel = DMA1_Channel2; + s->txDMAPeripheralBaseAddr = (uint32_t)&s->USARTx->TDR; +#endif + + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); + +#if defined(USE_USART3_TX_DMA) || defined(USE_USART3_RX_DMA) + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); +#endif + + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + + if (mode & MODE_TX) { + GPIO_InitStructure.GPIO_Pin = UART3_TX_PIN; + GPIO_PinAFConfig(UART3_GPIO, UART3_TX_PINSOURCE, GPIO_AF_7); + GPIO_Init(UART3_GPIO, &GPIO_InitStructure); + } + + if (mode & MODE_RX) { + GPIO_InitStructure.GPIO_Pin = UART3_RX_PIN; + GPIO_PinAFConfig(UART3_GPIO, UART3_RX_PINSOURCE, GPIO_AF_7); + GPIO_Init(UART3_GPIO, &GPIO_InitStructure); + } + + if (mode & MODE_BIDIR) { + GPIO_InitStructure.GPIO_Pin = UART3_TX_PIN; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_PinAFConfig(UART3_GPIO, UART3_TX_PINSOURCE, GPIO_AF_7); + GPIO_Init(UART3_GPIO, &GPIO_InitStructure); + } + +#ifdef USE_USART3_TX_DMA + // DMA TX Interrupt + NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_PRIORITY_BASE(NVIC_PRIO_SERIALUART3_TXDMA); + NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVIC_PRIORITY_SUB(NVIC_PRIO_SERIALUART3_TXDMA); + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); +#endif + +#ifndef USE_USART3_RX_DMA + NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_PRIORITY_BASE(NVIC_PRIO_SERIALUART3_RXDMA); + NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVIC_PRIORITY_SUB(NVIC_PRIO_SERIALUART3_RXDMA); + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); +#endif + + return s; +} + static void handleUsartTxDma(uartPort_t *s) { DMA_Cmd(s->txDMAChannel, DISABLE); @@ -238,6 +324,15 @@ void DMA1_Channel7_IRQHandler(void) handleUsartTxDma(s); } +// USART3 Tx DMA Handler +void DMA1_Channel2_IRQHandler(void) +{ + uartPort_t *s = &uartPort3; + DMA_ClearITPendingBit(DMA1_IT_TC2); + DMA_Cmd(DMA1_Channel2, DISABLE); + handleUsartTxDma(s); +} + void usartIrqHandler(uartPort_t *s) { uint32_t ISR = s->USARTx->ISR; @@ -280,3 +375,10 @@ void USART2_IRQHandler(void) usartIrqHandler(s); } +void USART3_IRQHandler(void) +{ + uartPort_t *s = &uartPort3; + + usartIrqHandler(s); +} + diff --git a/src/main/io/serial.c b/src/main/io/serial.c index c37cd432be..4f569b8aaa 100644 --- a/src/main/io/serial.c +++ b/src/main/io/serial.c @@ -75,8 +75,10 @@ static serialPortFunction_t serialPortFunctions[SERIAL_PORT_COUNT] = { {SERIAL_PORT_USART2, NULL, SCENARIO_UNUSED, FUNCTION_NONE}, #if (SERIAL_PORT_COUNT > 3) {SERIAL_PORT_USART3, NULL, SCENARIO_UNUSED, FUNCTION_NONE}, +#if (SERIAL_PORT_COUNT > 4) {SERIAL_PORT_USART4, NULL, SCENARIO_UNUSED, FUNCTION_NONE} #endif +#endif }; static const serialPortConstraint_t serialPortConstraints[SERIAL_PORT_COUNT] = { @@ -84,8 +86,10 @@ static const serialPortConstraint_t serialPortConstraints[SERIAL_PORT_COUNT] = { {SERIAL_PORT_USART1, 9600, 115200, SPF_NONE | SPF_SUPPORTS_SBUS_MODE | SPF_SUPPORTS_BIDIR_MODE}, {SERIAL_PORT_USART2, 9600, 115200, SPF_SUPPORTS_CALLBACK | SPF_SUPPORTS_SBUS_MODE | SPF_SUPPORTS_BIDIR_MODE}, #if (SERIAL_PORT_COUNT > 3) - {SERIAL_PORT_USART3, 9600, 19200, SPF_SUPPORTS_CALLBACK}, - {SERIAL_PORT_USART4, 9600, 19200, SPF_SUPPORTS_CALLBACK} + {SERIAL_PORT_USART3, 9600, 115200, SPF_SUPPORTS_CALLBACK | SPF_SUPPORTS_SBUS_MODE | SPF_SUPPORTS_BIDIR_MODE}, +#if (SERIAL_PORT_COUNT > 4) + {SERIAL_PORT_USART4, 9600, 115200, SPF_SUPPORTS_CALLBACK} +#endif #endif };