Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: LPCXpresso1769_blinky
Fork of mbed-dev by
targets/hal/TARGET_STM/TARGET_STM32F4/serial_api.c@90:bd7e252b15f3, 2016-03-14 (annotated)
- Committer:
- mbed_official
- Date:
- Mon Mar 14 16:15:11 2016 +0000
- Revision:
- 90:bd7e252b15f3
- Parent:
- 69:41db872bbc3a
- Child:
- 94:17550cbf442f
Synchronized with git revision fec574a5ed6db26aca1b13992ff271bf527d4a0d
Full URL: https://github.com/mbedmicro/mbed/commit/fec574a5ed6db26aca1b13992ff271bf527d4a0d/
Increased allocated netbufs to handle DTLS handshakes
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bogdanm | 0:9b334a45a8ff | 1 | /* mbed Microcontroller Library |
bogdanm | 0:9b334a45a8ff | 2 | ******************************************************************************* |
bogdanm | 0:9b334a45a8ff | 3 | * Copyright (c) 2015, STMicroelectronics |
bogdanm | 0:9b334a45a8ff | 4 | * All rights reserved. |
bogdanm | 0:9b334a45a8ff | 5 | * |
bogdanm | 0:9b334a45a8ff | 6 | * Redistribution and use in source and binary forms, with or without |
bogdanm | 0:9b334a45a8ff | 7 | * modification, are permitted provided that the following conditions are met: |
bogdanm | 0:9b334a45a8ff | 8 | * |
bogdanm | 0:9b334a45a8ff | 9 | * 1. Redistributions of source code must retain the above copyright notice, |
bogdanm | 0:9b334a45a8ff | 10 | * this list of conditions and the following disclaimer. |
bogdanm | 0:9b334a45a8ff | 11 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
bogdanm | 0:9b334a45a8ff | 12 | * this list of conditions and the following disclaimer in the documentation |
bogdanm | 0:9b334a45a8ff | 13 | * and/or other materials provided with the distribution. |
bogdanm | 0:9b334a45a8ff | 14 | * 3. Neither the name of STMicroelectronics nor the names of its contributors |
bogdanm | 0:9b334a45a8ff | 15 | * may be used to endorse or promote products derived from this software |
bogdanm | 0:9b334a45a8ff | 16 | * without specific prior written permission. |
bogdanm | 0:9b334a45a8ff | 17 | * |
bogdanm | 0:9b334a45a8ff | 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
bogdanm | 0:9b334a45a8ff | 19 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
bogdanm | 0:9b334a45a8ff | 20 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
bogdanm | 0:9b334a45a8ff | 21 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
bogdanm | 0:9b334a45a8ff | 22 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
bogdanm | 0:9b334a45a8ff | 23 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
bogdanm | 0:9b334a45a8ff | 24 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
bogdanm | 0:9b334a45a8ff | 25 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
bogdanm | 0:9b334a45a8ff | 26 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
bogdanm | 0:9b334a45a8ff | 27 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
bogdanm | 0:9b334a45a8ff | 28 | ******************************************************************************* |
bogdanm | 0:9b334a45a8ff | 29 | */ |
mbed_official | 69:41db872bbc3a | 30 | #ifdef YOTTA_CFG_MBED_OS |
mbed_official | 69:41db872bbc3a | 31 | #include "target_config.h" |
mbed_official | 69:41db872bbc3a | 32 | #include "uvisor-lib/uvisor-lib.h" |
mbed_official | 69:41db872bbc3a | 33 | #include "mbed-drivers/mbed_assert.h" |
mbed_official | 69:41db872bbc3a | 34 | #else |
bogdanm | 0:9b334a45a8ff | 35 | #include "mbed_assert.h" |
mbed_official | 69:41db872bbc3a | 36 | #endif |
bogdanm | 0:9b334a45a8ff | 37 | #include "serial_api.h" |
bogdanm | 0:9b334a45a8ff | 38 | |
bogdanm | 0:9b334a45a8ff | 39 | #if DEVICE_SERIAL |
bogdanm | 0:9b334a45a8ff | 40 | |
bogdanm | 0:9b334a45a8ff | 41 | #include "cmsis.h" |
bogdanm | 0:9b334a45a8ff | 42 | #include "pinmap.h" |
bogdanm | 0:9b334a45a8ff | 43 | #include <string.h> |
bogdanm | 0:9b334a45a8ff | 44 | #include "PeripheralPins.h" |
mbed_official | 69:41db872bbc3a | 45 | #ifdef YOTTA_CFG_MBED_OS |
mbed_official | 69:41db872bbc3a | 46 | #include "mbed-drivers/mbed_error.h" |
mbed_official | 69:41db872bbc3a | 47 | #else |
bogdanm | 0:9b334a45a8ff | 48 | #include "mbed_error.h" |
mbed_official | 69:41db872bbc3a | 49 | #endif |
mbed_official | 69:41db872bbc3a | 50 | |
mbed_official | 69:41db872bbc3a | 51 | #define DEBUG_STDIO 0 |
mbed_official | 69:41db872bbc3a | 52 | |
mbed_official | 69:41db872bbc3a | 53 | #ifndef DEBUG_STDIO |
mbed_official | 69:41db872bbc3a | 54 | # define DEBUG_STDIO 0 |
mbed_official | 69:41db872bbc3a | 55 | #endif |
mbed_official | 69:41db872bbc3a | 56 | |
mbed_official | 69:41db872bbc3a | 57 | #if DEBUG_STDIO |
mbed_official | 69:41db872bbc3a | 58 | # include <stdio.h> |
mbed_official | 69:41db872bbc3a | 59 | # define DEBUG_PRINTF(...) do { printf(__VA_ARGS__); } while(0) |
mbed_official | 69:41db872bbc3a | 60 | #else |
mbed_official | 69:41db872bbc3a | 61 | # define DEBUG_PRINTF(...) {} |
mbed_official | 69:41db872bbc3a | 62 | #endif |
bogdanm | 0:9b334a45a8ff | 63 | |
bogdanm | 0:9b334a45a8ff | 64 | #define UART_NUM (8) |
mbed_official | 55:814265bf5462 | 65 | #define UART_STATE_RX_ACTIVE 0x20 |
mbed_official | 55:814265bf5462 | 66 | #define UART_STATE_TX_ACTIVE 0x10 |
bogdanm | 0:9b334a45a8ff | 67 | |
mbed_official | 69:41db872bbc3a | 68 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 69:41db872bbc3a | 69 | static const uint32_t DMA_UartRx_Channel[UART_NUM] = {DMA_CHANNEL_4, DMA_CHANNEL_4, DMA_CHANNEL_4, DMA_CHANNEL_4, \ |
mbed_official | 69:41db872bbc3a | 70 | DMA_CHANNEL_4, DMA_CHANNEL_5, DMA_CHANNEL_5, DMA_CHANNEL_5}; |
mbed_official | 69:41db872bbc3a | 71 | DMA_Stream_TypeDef *DMA_UartRx_Stream[UART_NUM] = { |
mbed_official | 69:41db872bbc3a | 72 | DMA2_Stream5, DMA1_Stream5, DMA1_Stream1, \ |
mbed_official | 69:41db872bbc3a | 73 | DMA1_Stream2, DMA1_Stream0, DMA2_Stream1, \ |
mbed_official | 69:41db872bbc3a | 74 | DMA1_Stream3, DMA1_Stream6 |
mbed_official | 69:41db872bbc3a | 75 | }; |
mbed_official | 69:41db872bbc3a | 76 | static const uint32_t DMA_UartTx_Channel[UART_NUM] = {DMA_CHANNEL_4, DMA_CHANNEL_4, DMA_CHANNEL_4, DMA_CHANNEL_4, \ |
mbed_official | 69:41db872bbc3a | 77 | DMA_CHANNEL_4, DMA_CHANNEL_5, DMA_CHANNEL_5, DMA_CHANNEL_5}; |
mbed_official | 69:41db872bbc3a | 78 | DMA_Stream_TypeDef *DMA_UartTx_Stream[UART_NUM] = { |
mbed_official | 69:41db872bbc3a | 79 | DMA2_Stream7, DMA1_Stream6, DMA1_Stream3, \ |
mbed_official | 69:41db872bbc3a | 80 | DMA1_Stream4, DMA1_Stream7, DMA2_Stream6,\ |
mbed_official | 69:41db872bbc3a | 81 | DMA1_Stream1, DMA1_Stream0 |
mbed_official | 69:41db872bbc3a | 82 | }; |
mbed_official | 69:41db872bbc3a | 83 | DMA_HandleTypeDef DmaHandle; |
mbed_official | 69:41db872bbc3a | 84 | #endif |
bogdanm | 0:9b334a45a8ff | 85 | |
mbed_official | 69:41db872bbc3a | 86 | uint32_t serial_irq_ids[UART_NUM] = {0, 0, 0, 0, 0, 0, 0, 0}; |
bogdanm | 0:9b334a45a8ff | 87 | static uart_irq_handler irq_handler; |
bogdanm | 0:9b334a45a8ff | 88 | |
mbed_official | 69:41db872bbc3a | 89 | static DMA_HandleTypeDef DmaTxHandle[UART_NUM]; |
mbed_official | 69:41db872bbc3a | 90 | static DMA_HandleTypeDef DmaRxHandle[UART_NUM]; |
mbed_official | 69:41db872bbc3a | 91 | static UART_HandleTypeDef UartHandle[UART_NUM]; |
bogdanm | 0:9b334a45a8ff | 92 | |
bogdanm | 0:9b334a45a8ff | 93 | int stdio_uart_inited = 0; |
bogdanm | 0:9b334a45a8ff | 94 | serial_t stdio_uart; |
bogdanm | 0:9b334a45a8ff | 95 | |
mbed_official | 55:814265bf5462 | 96 | #if DEVICE_SERIAL_ASYNCH |
mbed_official | 55:814265bf5462 | 97 | #define SERIAL_OBJ(X) (obj->serial.X) |
mbed_official | 55:814265bf5462 | 98 | #else |
mbed_official | 55:814265bf5462 | 99 | #define SERIAL_OBJ(X) (obj->X) |
mbed_official | 55:814265bf5462 | 100 | #endif |
mbed_official | 55:814265bf5462 | 101 | |
mbed_official | 69:41db872bbc3a | 102 | static void init_uart(serial_t *obj, UARTName instance) |
bogdanm | 0:9b334a45a8ff | 103 | { |
mbed_official | 55:814265bf5462 | 104 | |
mbed_official | 69:41db872bbc3a | 105 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
mbed_official | 69:41db872bbc3a | 106 | handle->Instance = (USART_TypeDef *)instance; |
bogdanm | 0:9b334a45a8ff | 107 | |
mbed_official | 69:41db872bbc3a | 108 | handle->Init.BaudRate = SERIAL_OBJ(baudrate); |
mbed_official | 69:41db872bbc3a | 109 | handle->Init.WordLength = SERIAL_OBJ(databits); |
mbed_official | 69:41db872bbc3a | 110 | handle->Init.StopBits = SERIAL_OBJ(stopbits); |
mbed_official | 69:41db872bbc3a | 111 | handle->Init.Parity = SERIAL_OBJ(parity); |
mbed_official | 60:6e6ed0527880 | 112 | #if DEVICE_SERIAL_FC |
mbed_official | 69:41db872bbc3a | 113 | handle->Init.HwFlowCtl = SERIAL_OBJ(hw_flow_ctl); |
mbed_official | 60:6e6ed0527880 | 114 | #else |
mbed_official | 69:41db872bbc3a | 115 | handle->Init.HwFlowCtl = UART_HWCONTROL_NONE; |
mbed_official | 60:6e6ed0527880 | 116 | #endif |
mbed_official | 69:41db872bbc3a | 117 | handle->Init.OverSampling = UART_OVERSAMPLING_16; |
mbed_official | 69:41db872bbc3a | 118 | handle->TxXferCount = 0; |
mbed_official | 69:41db872bbc3a | 119 | handle->RxXferCount = 0; |
bogdanm | 0:9b334a45a8ff | 120 | |
mbed_official | 55:814265bf5462 | 121 | if (SERIAL_OBJ(pin_rx) == NC) { |
mbed_official | 69:41db872bbc3a | 122 | handle->Init.Mode = UART_MODE_TX; |
mbed_official | 55:814265bf5462 | 123 | } else if (SERIAL_OBJ(pin_tx) == NC) { |
mbed_official | 69:41db872bbc3a | 124 | handle->Init.Mode = UART_MODE_RX; |
bogdanm | 0:9b334a45a8ff | 125 | } else { |
mbed_official | 69:41db872bbc3a | 126 | handle->Init.Mode = UART_MODE_TX_RX; |
bogdanm | 0:9b334a45a8ff | 127 | } |
mbed_official | 69:41db872bbc3a | 128 | |
mbed_official | 69:41db872bbc3a | 129 | #ifdef YOTTA_CFG_MBED_OS |
mbed_official | 69:41db872bbc3a | 130 | if (SERIAL_OBJ(pin_tx) == STDIO_UART_TX && SERIAL_OBJ(pin_rx) == STDIO_UART_RX) { |
mbed_official | 69:41db872bbc3a | 131 | handle->Init.BaudRate = YOTTA_CFG_MBED_OS_STDIO_DEFAULT_BAUD; |
mbed_official | 69:41db872bbc3a | 132 | } |
mbed_official | 69:41db872bbc3a | 133 | #endif |
mbed_official | 69:41db872bbc3a | 134 | |
mbed_official | 55:814265bf5462 | 135 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 136 | if (SERIAL_OBJ(pin_tx) != NC) { |
mbed_official | 55:814265bf5462 | 137 | // set DMA in the UartHandle |
mbed_official | 69:41db872bbc3a | 138 | DMA_HandleTypeDef *hdma_tx = &DmaTxHandle[SERIAL_OBJ(index)]; |
mbed_official | 55:814265bf5462 | 139 | /* Configure the DMA handler for Transmission process */ |
mbed_official | 69:41db872bbc3a | 140 | hdma_tx->Instance = (DMA_Stream_TypeDef *)DMA_UartTx_Stream[SERIAL_OBJ(index)]; |
mbed_official | 69:41db872bbc3a | 141 | hdma_tx->Init.Channel = DMA_UartTx_Channel[SERIAL_OBJ(index)]; |
mbed_official | 69:41db872bbc3a | 142 | hdma_tx->Init.Direction = DMA_MEMORY_TO_PERIPH; |
mbed_official | 69:41db872bbc3a | 143 | hdma_tx->Init.PeriphInc = DMA_PINC_DISABLE; |
mbed_official | 69:41db872bbc3a | 144 | hdma_tx->Init.MemInc = DMA_MINC_ENABLE; |
mbed_official | 69:41db872bbc3a | 145 | hdma_tx->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; |
mbed_official | 69:41db872bbc3a | 146 | hdma_tx->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; |
mbed_official | 69:41db872bbc3a | 147 | hdma_tx->Init.Mode = DMA_NORMAL; |
mbed_official | 69:41db872bbc3a | 148 | hdma_tx->Init.Priority = DMA_PRIORITY_LOW; |
mbed_official | 69:41db872bbc3a | 149 | hdma_tx->Init.FIFOMode = DMA_FIFOMODE_DISABLE; |
mbed_official | 69:41db872bbc3a | 150 | hdma_tx->Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; |
mbed_official | 69:41db872bbc3a | 151 | hdma_tx->Init.MemBurst = DMA_MBURST_INC4; |
mbed_official | 69:41db872bbc3a | 152 | hdma_tx->Init.PeriphBurst = DMA_PBURST_INC4; |
mbed_official | 55:814265bf5462 | 153 | |
mbed_official | 69:41db872bbc3a | 154 | HAL_DMA_Init(hdma_tx); |
mbed_official | 55:814265bf5462 | 155 | |
mbed_official | 55:814265bf5462 | 156 | /* Associate the initialized DMA handle to the UART handle */ |
mbed_official | 69:41db872bbc3a | 157 | handle->hdmatx = hdma_tx; |
mbed_official | 69:41db872bbc3a | 158 | hdma_tx->Parent = handle; |
mbed_official | 55:814265bf5462 | 159 | } |
mbed_official | 55:814265bf5462 | 160 | |
mbed_official | 55:814265bf5462 | 161 | if (SERIAL_OBJ(pin_rx) != NC) { |
mbed_official | 55:814265bf5462 | 162 | /* Configure the DMA handler for reception process */ |
mbed_official | 69:41db872bbc3a | 163 | DMA_HandleTypeDef *hdma_rx = &DmaRxHandle[SERIAL_OBJ(index)]; |
mbed_official | 69:41db872bbc3a | 164 | hdma_rx->Instance = (DMA_Stream_TypeDef *)DMA_UartRx_Stream[SERIAL_OBJ(index)]; |
mbed_official | 69:41db872bbc3a | 165 | hdma_rx->Init.Channel = DMA_UartRx_Channel[SERIAL_OBJ(index)]; |
mbed_official | 69:41db872bbc3a | 166 | hdma_rx->Init.Direction = DMA_PERIPH_TO_MEMORY; |
mbed_official | 69:41db872bbc3a | 167 | hdma_rx->Init.PeriphInc = DMA_PINC_DISABLE; |
mbed_official | 69:41db872bbc3a | 168 | hdma_rx->Init.MemInc = DMA_MINC_ENABLE; |
mbed_official | 69:41db872bbc3a | 169 | hdma_rx->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; |
mbed_official | 69:41db872bbc3a | 170 | hdma_rx->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; |
mbed_official | 69:41db872bbc3a | 171 | hdma_rx->Init.Mode = DMA_NORMAL; |
mbed_official | 69:41db872bbc3a | 172 | hdma_rx->Init.Priority = DMA_PRIORITY_HIGH; |
mbed_official | 69:41db872bbc3a | 173 | hdma_rx->Init.FIFOMode = DMA_FIFOMODE_DISABLE; |
mbed_official | 69:41db872bbc3a | 174 | hdma_rx->Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; |
mbed_official | 69:41db872bbc3a | 175 | hdma_rx->Init.MemBurst = DMA_MBURST_INC4; |
mbed_official | 69:41db872bbc3a | 176 | hdma_rx->Init.PeriphBurst = DMA_PBURST_INC4; |
mbed_official | 55:814265bf5462 | 177 | |
mbed_official | 69:41db872bbc3a | 178 | HAL_DMA_Init(hdma_rx); |
mbed_official | 55:814265bf5462 | 179 | |
mbed_official | 55:814265bf5462 | 180 | /* Associate the initialized DMA handle to the UART handle */ |
mbed_official | 69:41db872bbc3a | 181 | handle->hdmarx = hdma_rx; |
mbed_official | 69:41db872bbc3a | 182 | hdma_rx->Parent = handle; |
mbed_official | 55:814265bf5462 | 183 | } |
mbed_official | 55:814265bf5462 | 184 | #endif |
bogdanm | 0:9b334a45a8ff | 185 | |
mbed_official | 69:41db872bbc3a | 186 | if (HAL_UART_Init(handle) != HAL_OK) { |
mbed_official | 55:814265bf5462 | 187 | error("Cannot initialize UART\n"); |
bogdanm | 0:9b334a45a8ff | 188 | } |
bogdanm | 0:9b334a45a8ff | 189 | } |
bogdanm | 0:9b334a45a8ff | 190 | |
bogdanm | 0:9b334a45a8ff | 191 | void serial_init(serial_t *obj, PinName tx, PinName rx) |
bogdanm | 0:9b334a45a8ff | 192 | { |
bogdanm | 0:9b334a45a8ff | 193 | // Determine the UART to use (UART_1, UART_2, ...) |
bogdanm | 0:9b334a45a8ff | 194 | UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); |
bogdanm | 0:9b334a45a8ff | 195 | UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); |
bogdanm | 0:9b334a45a8ff | 196 | |
bogdanm | 0:9b334a45a8ff | 197 | // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object |
mbed_official | 69:41db872bbc3a | 198 | UARTName instance = (UARTName)pinmap_merge(uart_tx, uart_rx); |
mbed_official | 55:814265bf5462 | 199 | |
mbed_official | 69:41db872bbc3a | 200 | MBED_ASSERT(instance != (UARTName)NC); |
bogdanm | 0:9b334a45a8ff | 201 | |
bogdanm | 0:9b334a45a8ff | 202 | // Enable USART clock |
mbed_official | 69:41db872bbc3a | 203 | switch (instance) { |
bogdanm | 0:9b334a45a8ff | 204 | case UART_1: |
bogdanm | 0:9b334a45a8ff | 205 | __HAL_RCC_USART1_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 206 | SERIAL_OBJ(index) = 0; |
mbed_official | 55:814265bf5462 | 207 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 208 | __HAL_RCC_DMA2_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 209 | #endif |
bogdanm | 0:9b334a45a8ff | 210 | break; |
bogdanm | 0:9b334a45a8ff | 211 | case UART_2: |
bogdanm | 0:9b334a45a8ff | 212 | __HAL_RCC_USART2_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 213 | SERIAL_OBJ(index) = 1; |
mbed_official | 55:814265bf5462 | 214 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 215 | __HAL_RCC_DMA1_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 216 | #endif |
bogdanm | 0:9b334a45a8ff | 217 | break; |
bogdanm | 0:9b334a45a8ff | 218 | #if defined(USART3_BASE) |
bogdanm | 0:9b334a45a8ff | 219 | case UART_3: |
bogdanm | 0:9b334a45a8ff | 220 | __HAL_RCC_USART3_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 221 | SERIAL_OBJ(index) = 2; |
mbed_official | 55:814265bf5462 | 222 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 223 | __HAL_RCC_DMA1_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 224 | #endif |
bogdanm | 0:9b334a45a8ff | 225 | break; |
bogdanm | 0:9b334a45a8ff | 226 | #endif |
bogdanm | 0:9b334a45a8ff | 227 | #if defined(UART4_BASE) |
bogdanm | 0:9b334a45a8ff | 228 | case UART_4: |
bogdanm | 0:9b334a45a8ff | 229 | __HAL_RCC_UART4_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 230 | SERIAL_OBJ(index) = 3; |
mbed_official | 55:814265bf5462 | 231 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 232 | __HAL_RCC_DMA1_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 233 | #endif |
bogdanm | 0:9b334a45a8ff | 234 | break; |
bogdanm | 0:9b334a45a8ff | 235 | #endif |
bogdanm | 0:9b334a45a8ff | 236 | #if defined(UART5_BASE) |
bogdanm | 0:9b334a45a8ff | 237 | case UART_5: |
bogdanm | 0:9b334a45a8ff | 238 | __HAL_RCC_UART5_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 239 | SERIAL_OBJ(index) = 4; |
mbed_official | 55:814265bf5462 | 240 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 241 | __HAL_RCC_DMA1_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 242 | #endif |
bogdanm | 0:9b334a45a8ff | 243 | break; |
bogdanm | 0:9b334a45a8ff | 244 | #endif |
bogdanm | 0:9b334a45a8ff | 245 | #if defined(USART6_BASE) |
bogdanm | 0:9b334a45a8ff | 246 | case UART_6: |
bogdanm | 0:9b334a45a8ff | 247 | __HAL_RCC_USART6_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 248 | SERIAL_OBJ(index) = 5; |
mbed_official | 55:814265bf5462 | 249 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 250 | __HAL_RCC_DMA2_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 251 | #endif |
bogdanm | 0:9b334a45a8ff | 252 | break; |
bogdanm | 0:9b334a45a8ff | 253 | #endif |
bogdanm | 0:9b334a45a8ff | 254 | #if defined(UART7_BASE) |
bogdanm | 0:9b334a45a8ff | 255 | case UART_7: |
bogdanm | 0:9b334a45a8ff | 256 | __HAL_RCC_UART7_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 257 | SERIAL_OBJ(index) = 6; |
mbed_official | 55:814265bf5462 | 258 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 259 | __HAL_RCC_DMA1_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 260 | #endif |
bogdanm | 0:9b334a45a8ff | 261 | break; |
bogdanm | 0:9b334a45a8ff | 262 | #endif |
bogdanm | 0:9b334a45a8ff | 263 | #if defined(UART8_BASE) |
bogdanm | 0:9b334a45a8ff | 264 | case UART_8: |
bogdanm | 0:9b334a45a8ff | 265 | __HAL_RCC_UART8_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 266 | SERIAL_OBJ(index) = 7; |
mbed_official | 55:814265bf5462 | 267 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 268 | __HAL_RCC_DMA1_CLK_ENABLE(); |
mbed_official | 55:814265bf5462 | 269 | #endif |
bogdanm | 0:9b334a45a8ff | 270 | break; |
bogdanm | 0:9b334a45a8ff | 271 | #endif |
bogdanm | 0:9b334a45a8ff | 272 | } |
bogdanm | 0:9b334a45a8ff | 273 | |
bogdanm | 0:9b334a45a8ff | 274 | // Configure the UART pins |
bogdanm | 0:9b334a45a8ff | 275 | pinmap_pinout(tx, PinMap_UART_TX); |
bogdanm | 0:9b334a45a8ff | 276 | pinmap_pinout(rx, PinMap_UART_RX); |
mbed_official | 55:814265bf5462 | 277 | |
bogdanm | 0:9b334a45a8ff | 278 | if (tx != NC) { |
bogdanm | 0:9b334a45a8ff | 279 | pin_mode(tx, PullUp); |
bogdanm | 0:9b334a45a8ff | 280 | } |
bogdanm | 0:9b334a45a8ff | 281 | if (rx != NC) { |
bogdanm | 0:9b334a45a8ff | 282 | pin_mode(rx, PullUp); |
bogdanm | 0:9b334a45a8ff | 283 | } |
bogdanm | 0:9b334a45a8ff | 284 | |
bogdanm | 0:9b334a45a8ff | 285 | // Configure UART |
mbed_official | 55:814265bf5462 | 286 | SERIAL_OBJ(baudrate) = 9600; |
mbed_official | 55:814265bf5462 | 287 | SERIAL_OBJ(databits) = UART_WORDLENGTH_8B; |
mbed_official | 55:814265bf5462 | 288 | SERIAL_OBJ(stopbits) = UART_STOPBITS_1; |
mbed_official | 55:814265bf5462 | 289 | SERIAL_OBJ(parity) = UART_PARITY_NONE; |
bogdanm | 0:9b334a45a8ff | 290 | |
mbed_official | 55:814265bf5462 | 291 | SERIAL_OBJ(pin_tx) = tx; |
mbed_official | 55:814265bf5462 | 292 | SERIAL_OBJ(pin_rx) = rx; |
bogdanm | 0:9b334a45a8ff | 293 | |
mbed_official | 69:41db872bbc3a | 294 | init_uart(obj, instance); |
bogdanm | 0:9b334a45a8ff | 295 | |
mbed_official | 69:41db872bbc3a | 296 | #ifndef YOTTA_CFG_MBED_OS |
bogdanm | 0:9b334a45a8ff | 297 | // For stdio management |
mbed_official | 69:41db872bbc3a | 298 | if ((int)(UartHandle[SERIAL_OBJ(index)].Instance) == STDIO_UART) { |
bogdanm | 0:9b334a45a8ff | 299 | stdio_uart_inited = 1; |
bogdanm | 0:9b334a45a8ff | 300 | memcpy(&stdio_uart, obj, sizeof(serial_t)); |
bogdanm | 0:9b334a45a8ff | 301 | } |
mbed_official | 69:41db872bbc3a | 302 | #endif |
mbed_official | 69:41db872bbc3a | 303 | |
mbed_official | 69:41db872bbc3a | 304 | DEBUG_PRINTF("UART%u: Init\n", obj->serial.module+1); |
bogdanm | 0:9b334a45a8ff | 305 | } |
bogdanm | 0:9b334a45a8ff | 306 | |
bogdanm | 0:9b334a45a8ff | 307 | void serial_free(serial_t *obj) |
bogdanm | 0:9b334a45a8ff | 308 | { |
bogdanm | 0:9b334a45a8ff | 309 | // Reset UART and disable clock |
mbed_official | 69:41db872bbc3a | 310 | switch (SERIAL_OBJ(index)) { |
mbed_official | 69:41db872bbc3a | 311 | case 0: |
bogdanm | 0:9b334a45a8ff | 312 | __USART1_FORCE_RESET(); |
bogdanm | 0:9b334a45a8ff | 313 | __USART1_RELEASE_RESET(); |
bogdanm | 0:9b334a45a8ff | 314 | __USART1_CLK_DISABLE(); |
bogdanm | 0:9b334a45a8ff | 315 | break; |
mbed_official | 69:41db872bbc3a | 316 | case 1: |
bogdanm | 0:9b334a45a8ff | 317 | __USART2_FORCE_RESET(); |
bogdanm | 0:9b334a45a8ff | 318 | __USART2_RELEASE_RESET(); |
bogdanm | 0:9b334a45a8ff | 319 | __USART2_CLK_DISABLE(); |
mbed_official | 69:41db872bbc3a | 320 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 69:41db872bbc3a | 321 | __HAL_RCC_DMA1_CLK_DISABLE(); |
mbed_official | 69:41db872bbc3a | 322 | #endif |
bogdanm | 0:9b334a45a8ff | 323 | break; |
bogdanm | 0:9b334a45a8ff | 324 | #if defined(USART3_BASE) |
mbed_official | 69:41db872bbc3a | 325 | case 2: |
bogdanm | 0:9b334a45a8ff | 326 | __USART3_FORCE_RESET(); |
bogdanm | 0:9b334a45a8ff | 327 | __USART3_RELEASE_RESET(); |
bogdanm | 0:9b334a45a8ff | 328 | __USART3_CLK_DISABLE(); |
bogdanm | 0:9b334a45a8ff | 329 | break; |
bogdanm | 0:9b334a45a8ff | 330 | #endif |
bogdanm | 0:9b334a45a8ff | 331 | #if defined(UART4_BASE) |
mbed_official | 69:41db872bbc3a | 332 | case 3: |
bogdanm | 0:9b334a45a8ff | 333 | __UART4_FORCE_RESET(); |
bogdanm | 0:9b334a45a8ff | 334 | __UART4_RELEASE_RESET(); |
bogdanm | 0:9b334a45a8ff | 335 | __UART4_CLK_DISABLE(); |
mbed_official | 55:814265bf5462 | 336 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 337 | __HAL_RCC_DMA1_CLK_DISABLE(); |
mbed_official | 55:814265bf5462 | 338 | #endif |
bogdanm | 0:9b334a45a8ff | 339 | break; |
bogdanm | 0:9b334a45a8ff | 340 | #endif |
bogdanm | 0:9b334a45a8ff | 341 | #if defined(UART5_BASE) |
mbed_official | 69:41db872bbc3a | 342 | case 4: |
bogdanm | 0:9b334a45a8ff | 343 | __UART5_FORCE_RESET(); |
bogdanm | 0:9b334a45a8ff | 344 | __UART5_RELEASE_RESET(); |
bogdanm | 0:9b334a45a8ff | 345 | __UART5_CLK_DISABLE(); |
bogdanm | 0:9b334a45a8ff | 346 | break; |
bogdanm | 0:9b334a45a8ff | 347 | #endif |
bogdanm | 0:9b334a45a8ff | 348 | #if defined(USART6_BASE) |
mbed_official | 69:41db872bbc3a | 349 | case 5: |
bogdanm | 0:9b334a45a8ff | 350 | __USART6_FORCE_RESET(); |
bogdanm | 0:9b334a45a8ff | 351 | __USART6_RELEASE_RESET(); |
bogdanm | 0:9b334a45a8ff | 352 | __USART6_CLK_DISABLE(); |
bogdanm | 0:9b334a45a8ff | 353 | break; |
bogdanm | 0:9b334a45a8ff | 354 | #endif |
bogdanm | 0:9b334a45a8ff | 355 | #if defined(UART7_BASE) |
mbed_official | 69:41db872bbc3a | 356 | case 6: |
bogdanm | 0:9b334a45a8ff | 357 | __UART7_FORCE_RESET(); |
bogdanm | 0:9b334a45a8ff | 358 | __UART7_RELEASE_RESET(); |
bogdanm | 0:9b334a45a8ff | 359 | __UART7_CLK_DISABLE(); |
bogdanm | 0:9b334a45a8ff | 360 | break; |
bogdanm | 0:9b334a45a8ff | 361 | #endif |
bogdanm | 0:9b334a45a8ff | 362 | #if defined(UART8_BASE) |
mbed_official | 69:41db872bbc3a | 363 | case 7: |
bogdanm | 0:9b334a45a8ff | 364 | __UART8_FORCE_RESET(); |
bogdanm | 0:9b334a45a8ff | 365 | __UART8_RELEASE_RESET(); |
bogdanm | 0:9b334a45a8ff | 366 | __UART8_CLK_DISABLE(); |
bogdanm | 0:9b334a45a8ff | 367 | break; |
bogdanm | 0:9b334a45a8ff | 368 | #endif |
bogdanm | 0:9b334a45a8ff | 369 | } |
mbed_official | 69:41db872bbc3a | 370 | |
bogdanm | 0:9b334a45a8ff | 371 | // Configure GPIOs |
mbed_official | 55:814265bf5462 | 372 | pin_function(SERIAL_OBJ(pin_tx), STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)); |
mbed_official | 55:814265bf5462 | 373 | pin_function(SERIAL_OBJ(pin_rx), STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)); |
bogdanm | 0:9b334a45a8ff | 374 | |
mbed_official | 55:814265bf5462 | 375 | serial_irq_ids[SERIAL_OBJ(index)] = 0; |
mbed_official | 69:41db872bbc3a | 376 | |
mbed_official | 69:41db872bbc3a | 377 | DEBUG_PRINTF("UART%u: Free\n", obj->serial.module+1); |
bogdanm | 0:9b334a45a8ff | 378 | } |
bogdanm | 0:9b334a45a8ff | 379 | |
bogdanm | 0:9b334a45a8ff | 380 | void serial_baud(serial_t *obj, int baudrate) |
bogdanm | 0:9b334a45a8ff | 381 | { |
mbed_official | 69:41db872bbc3a | 382 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
mbed_official | 69:41db872bbc3a | 383 | |
mbed_official | 55:814265bf5462 | 384 | SERIAL_OBJ(baudrate) = baudrate; |
mbed_official | 69:41db872bbc3a | 385 | handle->Init.BaudRate = baudrate; |
mbed_official | 69:41db872bbc3a | 386 | |
mbed_official | 69:41db872bbc3a | 387 | if (HAL_UART_Init(handle) != HAL_OK) { |
mbed_official | 69:41db872bbc3a | 388 | error("Cannot initialize UART\n"); |
mbed_official | 69:41db872bbc3a | 389 | } |
mbed_official | 69:41db872bbc3a | 390 | |
mbed_official | 69:41db872bbc3a | 391 | DEBUG_PRINTF("UART%u: Baudrate: %u\n", obj->serial.module+1, baudrate); |
bogdanm | 0:9b334a45a8ff | 392 | } |
bogdanm | 0:9b334a45a8ff | 393 | |
bogdanm | 0:9b334a45a8ff | 394 | void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) |
bogdanm | 0:9b334a45a8ff | 395 | { |
mbed_official | 69:41db872bbc3a | 396 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
mbed_official | 69:41db872bbc3a | 397 | |
bogdanm | 0:9b334a45a8ff | 398 | if (data_bits == 9) { |
mbed_official | 55:814265bf5462 | 399 | SERIAL_OBJ(databits) = UART_WORDLENGTH_9B; |
mbed_official | 69:41db872bbc3a | 400 | handle->Init.WordLength = UART_WORDLENGTH_9B; |
bogdanm | 0:9b334a45a8ff | 401 | } else { |
mbed_official | 55:814265bf5462 | 402 | SERIAL_OBJ(databits) = UART_WORDLENGTH_8B; |
mbed_official | 69:41db872bbc3a | 403 | handle->Init.WordLength = UART_WORDLENGTH_8B; |
bogdanm | 0:9b334a45a8ff | 404 | } |
bogdanm | 0:9b334a45a8ff | 405 | |
bogdanm | 0:9b334a45a8ff | 406 | switch (parity) { |
bogdanm | 0:9b334a45a8ff | 407 | case ParityOdd: |
mbed_official | 55:814265bf5462 | 408 | SERIAL_OBJ(parity) = UART_PARITY_ODD; |
mbed_official | 69:41db872bbc3a | 409 | handle->Init.Parity = UART_PARITY_ODD; |
bogdanm | 0:9b334a45a8ff | 410 | break; |
bogdanm | 0:9b334a45a8ff | 411 | case ParityEven: |
mbed_official | 55:814265bf5462 | 412 | SERIAL_OBJ(parity) = UART_PARITY_EVEN; |
mbed_official | 69:41db872bbc3a | 413 | handle->Init.Parity = UART_PARITY_EVEN; |
bogdanm | 0:9b334a45a8ff | 414 | break; |
bogdanm | 0:9b334a45a8ff | 415 | default: // ParityNone |
mbed_official | 69:41db872bbc3a | 416 | case ParityForced0: // unsupported! |
mbed_official | 69:41db872bbc3a | 417 | case ParityForced1: // unsupported! |
mbed_official | 55:814265bf5462 | 418 | SERIAL_OBJ(parity) = UART_PARITY_NONE; |
mbed_official | 69:41db872bbc3a | 419 | handle->Init.Parity = UART_PARITY_NONE; |
bogdanm | 0:9b334a45a8ff | 420 | break; |
bogdanm | 0:9b334a45a8ff | 421 | } |
bogdanm | 0:9b334a45a8ff | 422 | |
bogdanm | 0:9b334a45a8ff | 423 | if (stop_bits == 2) { |
mbed_official | 55:814265bf5462 | 424 | SERIAL_OBJ(stopbits) = UART_STOPBITS_2; |
mbed_official | 69:41db872bbc3a | 425 | handle->Init.StopBits = UART_STOPBITS_2; |
bogdanm | 0:9b334a45a8ff | 426 | } else { |
mbed_official | 55:814265bf5462 | 427 | SERIAL_OBJ(stopbits) = UART_STOPBITS_1; |
mbed_official | 69:41db872bbc3a | 428 | handle->Init.StopBits = UART_STOPBITS_1; |
bogdanm | 0:9b334a45a8ff | 429 | } |
bogdanm | 0:9b334a45a8ff | 430 | |
mbed_official | 69:41db872bbc3a | 431 | if (HAL_UART_Init(handle) != HAL_OK) { |
mbed_official | 69:41db872bbc3a | 432 | error("Cannot initialize UART\n"); |
mbed_official | 69:41db872bbc3a | 433 | } |
mbed_official | 69:41db872bbc3a | 434 | |
mbed_official | 69:41db872bbc3a | 435 | DEBUG_PRINTF("UART%u: Format: %u, %u, %u\n", obj->serial.module+1, data_bits, parity, stop_bits); |
bogdanm | 0:9b334a45a8ff | 436 | } |
bogdanm | 0:9b334a45a8ff | 437 | |
bogdanm | 0:9b334a45a8ff | 438 | /****************************************************************************** |
bogdanm | 0:9b334a45a8ff | 439 | * INTERRUPTS HANDLING |
bogdanm | 0:9b334a45a8ff | 440 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 441 | |
mbed_official | 69:41db872bbc3a | 442 | static void uart_irq(int id) |
bogdanm | 0:9b334a45a8ff | 443 | { |
mbed_official | 69:41db872bbc3a | 444 | UART_HandleTypeDef *handle = &UartHandle[id]; |
bogdanm | 0:9b334a45a8ff | 445 | if (serial_irq_ids[id] != 0) { |
mbed_official | 69:41db872bbc3a | 446 | if (__HAL_UART_GET_FLAG(handle, UART_FLAG_TC) != RESET) { |
bogdanm | 0:9b334a45a8ff | 447 | irq_handler(serial_irq_ids[id], TxIrq); |
mbed_official | 69:41db872bbc3a | 448 | __HAL_UART_CLEAR_FLAG(handle, UART_FLAG_TC); |
bogdanm | 0:9b334a45a8ff | 449 | } |
mbed_official | 69:41db872bbc3a | 450 | if (__HAL_UART_GET_FLAG(handle, UART_FLAG_RXNE) != RESET) { |
bogdanm | 0:9b334a45a8ff | 451 | irq_handler(serial_irq_ids[id], RxIrq); |
mbed_official | 69:41db872bbc3a | 452 | __HAL_UART_CLEAR_FLAG(handle, UART_FLAG_RXNE); |
bogdanm | 0:9b334a45a8ff | 453 | } |
mbed_official | 90:bd7e252b15f3 | 454 | if (__HAL_UART_GET_FLAG(handle, UART_FLAG_ORE) != RESET) { |
mbed_official | 90:bd7e252b15f3 | 455 | uint8_t c = handle->Instance->DR; |
mbed_official | 90:bd7e252b15f3 | 456 | } |
bogdanm | 0:9b334a45a8ff | 457 | } |
bogdanm | 0:9b334a45a8ff | 458 | } |
mbed_official | 69:41db872bbc3a | 459 | |
mbed_official | 55:814265bf5462 | 460 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 69:41db872bbc3a | 461 | static void dma_irq(DMAName name, int id, SerialIrq txrxirq) |
mbed_official | 55:814265bf5462 | 462 | { |
mbed_official | 69:41db872bbc3a | 463 | |
mbed_official | 69:41db872bbc3a | 464 | if (serial_irq_ids[id] != 0) { |
mbed_official | 69:41db872bbc3a | 465 | if (txrxirq == RxIrq) { |
mbed_official | 69:41db872bbc3a | 466 | if (__HAL_DMA_GET_TC_FLAG_INDEX(&DmaHandle) != RESET) { |
mbed_official | 69:41db872bbc3a | 467 | irq_handler(serial_irq_ids[id], RxIrq); |
mbed_official | 69:41db872bbc3a | 468 | __HAL_DMA_CLEAR_FLAG(&DmaHandle, DMA_FLAG_TCIF2_6); |
mbed_official | 69:41db872bbc3a | 469 | } |
mbed_official | 69:41db872bbc3a | 470 | } else { |
mbed_official | 69:41db872bbc3a | 471 | if (__HAL_DMA_GET_TC_FLAG_INDEX(&DmaHandle) != RESET) { |
mbed_official | 69:41db872bbc3a | 472 | irq_handler(serial_irq_ids[id], TxIrq); |
mbed_official | 69:41db872bbc3a | 473 | __HAL_DMA_CLEAR_FLAG(&DmaHandle, DMA_FLAG_TCIF0_4); |
mbed_official | 69:41db872bbc3a | 474 | } |
mbed_official | 69:41db872bbc3a | 475 | } |
mbed_official | 69:41db872bbc3a | 476 | } |
mbed_official | 55:814265bf5462 | 477 | DmaHandle.Instance = (DMA_Stream_TypeDef *)name; |
mbed_official | 55:814265bf5462 | 478 | if (serial_irq_ids[id] != 0) { |
mbed_official | 55:814265bf5462 | 479 | if (__HAL_DMA_GET_TC_FLAG_INDEX(&DmaHandle) != RESET) { |
mbed_official | 55:814265bf5462 | 480 | irq_handler(serial_irq_ids[id], TxIrq); |
mbed_official | 55:814265bf5462 | 481 | __HAL_DMA_CLEAR_FLAG(&DmaHandle, DMA_FLAG_TCIF0_4); |
mbed_official | 55:814265bf5462 | 482 | } |
mbed_official | 55:814265bf5462 | 483 | if (__HAL_DMA_GET_TC_FLAG_INDEX(&DmaHandle) != RESET) { |
mbed_official | 55:814265bf5462 | 484 | irq_handler(serial_irq_ids[id], RxIrq); |
mbed_official | 55:814265bf5462 | 485 | __HAL_DMA_CLEAR_FLAG(&DmaHandle, DMA_FLAG_TCIF2_6); |
mbed_official | 55:814265bf5462 | 486 | } |
mbed_official | 55:814265bf5462 | 487 | } |
mbed_official | 55:814265bf5462 | 488 | } |
mbed_official | 55:814265bf5462 | 489 | #endif |
bogdanm | 0:9b334a45a8ff | 490 | |
bogdanm | 0:9b334a45a8ff | 491 | static void uart1_irq(void) |
bogdanm | 0:9b334a45a8ff | 492 | { |
mbed_official | 69:41db872bbc3a | 493 | uart_irq(0); |
bogdanm | 0:9b334a45a8ff | 494 | } |
bogdanm | 0:9b334a45a8ff | 495 | |
bogdanm | 0:9b334a45a8ff | 496 | static void uart2_irq(void) |
bogdanm | 0:9b334a45a8ff | 497 | { |
mbed_official | 69:41db872bbc3a | 498 | uart_irq(1); |
bogdanm | 0:9b334a45a8ff | 499 | } |
bogdanm | 0:9b334a45a8ff | 500 | |
bogdanm | 0:9b334a45a8ff | 501 | #if defined(USART3_BASE) |
bogdanm | 0:9b334a45a8ff | 502 | static void uart3_irq(void) |
bogdanm | 0:9b334a45a8ff | 503 | { |
mbed_official | 69:41db872bbc3a | 504 | uart_irq(2); |
bogdanm | 0:9b334a45a8ff | 505 | } |
bogdanm | 0:9b334a45a8ff | 506 | #endif |
bogdanm | 0:9b334a45a8ff | 507 | |
bogdanm | 0:9b334a45a8ff | 508 | #if defined(UART4_BASE) |
bogdanm | 0:9b334a45a8ff | 509 | static void uart4_irq(void) |
bogdanm | 0:9b334a45a8ff | 510 | { |
mbed_official | 69:41db872bbc3a | 511 | uart_irq(3); |
bogdanm | 0:9b334a45a8ff | 512 | } |
mbed_official | 69:41db872bbc3a | 513 | #endif |
mbed_official | 69:41db872bbc3a | 514 | |
mbed_official | 55:814265bf5462 | 515 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 516 | |
mbed_official | 69:41db872bbc3a | 517 | #if defined(UART5_BASE) |
mbed_official | 69:41db872bbc3a | 518 | static void dma1_stream0_irq(void) |
mbed_official | 69:41db872bbc3a | 519 | { |
mbed_official | 69:41db872bbc3a | 520 | dma_irq(DMA_1, 4, RxIrq); // uart5_rx |
mbed_official | 69:41db872bbc3a | 521 | } |
mbed_official | 69:41db872bbc3a | 522 | #endif |
mbed_official | 69:41db872bbc3a | 523 | |
mbed_official | 69:41db872bbc3a | 524 | #if defined(USART3_BASE) |
mbed_official | 69:41db872bbc3a | 525 | static void dma1_stream1_irq(void) |
mbed_official | 69:41db872bbc3a | 526 | { |
mbed_official | 69:41db872bbc3a | 527 | dma_irq(DMA_1, 2, RxIrq); // uart3_rx |
mbed_official | 69:41db872bbc3a | 528 | } |
mbed_official | 69:41db872bbc3a | 529 | #endif |
mbed_official | 69:41db872bbc3a | 530 | |
mbed_official | 69:41db872bbc3a | 531 | #if defined(UART4_BASE) |
mbed_official | 55:814265bf5462 | 532 | static void dma1_stream2_irq(void) |
mbed_official | 55:814265bf5462 | 533 | { |
mbed_official | 69:41db872bbc3a | 534 | dma_irq(DMA_1, 3, RxIrq); // uart4_rx |
mbed_official | 69:41db872bbc3a | 535 | } |
mbed_official | 69:41db872bbc3a | 536 | #endif |
mbed_official | 69:41db872bbc3a | 537 | |
mbed_official | 69:41db872bbc3a | 538 | #if defined(USART3_BASE) |
mbed_official | 69:41db872bbc3a | 539 | static void dma1_stream3_irq(void) |
mbed_official | 69:41db872bbc3a | 540 | { |
mbed_official | 69:41db872bbc3a | 541 | dma_irq(DMA_1, 2, TxIrq); // uart3_tx |
mbed_official | 69:41db872bbc3a | 542 | } |
mbed_official | 69:41db872bbc3a | 543 | #endif |
mbed_official | 69:41db872bbc3a | 544 | |
mbed_official | 69:41db872bbc3a | 545 | #if defined(UART4_BASE) |
mbed_official | 69:41db872bbc3a | 546 | static void dma1_stream4_irq(void) |
mbed_official | 69:41db872bbc3a | 547 | { |
mbed_official | 69:41db872bbc3a | 548 | dma_irq(DMA_1, 3, TxIrq); // uart4_tx |
mbed_official | 69:41db872bbc3a | 549 | } |
mbed_official | 69:41db872bbc3a | 550 | #endif |
mbed_official | 69:41db872bbc3a | 551 | |
mbed_official | 69:41db872bbc3a | 552 | static void dma1_stream5_irq(void) |
mbed_official | 69:41db872bbc3a | 553 | { |
mbed_official | 69:41db872bbc3a | 554 | dma_irq(DMA_1, 1, RxIrq); // uart2_rx |
mbed_official | 69:41db872bbc3a | 555 | } |
mbed_official | 69:41db872bbc3a | 556 | |
mbed_official | 69:41db872bbc3a | 557 | static void dma1_stream6_irq(void) |
mbed_official | 69:41db872bbc3a | 558 | { |
mbed_official | 69:41db872bbc3a | 559 | dma_irq(DMA_1, 1, TxIrq); // uart2_tx |
mbed_official | 55:814265bf5462 | 560 | } |
mbed_official | 55:814265bf5462 | 561 | |
mbed_official | 69:41db872bbc3a | 562 | #if defined(UART5_BASE) |
mbed_official | 69:41db872bbc3a | 563 | static void dma1_stream7_irq(void) |
mbed_official | 69:41db872bbc3a | 564 | { |
mbed_official | 69:41db872bbc3a | 565 | dma_irq(DMA_1, 4, TxIrq); // uart5_tx |
mbed_official | 69:41db872bbc3a | 566 | } |
mbed_official | 69:41db872bbc3a | 567 | #endif |
mbed_official | 55:814265bf5462 | 568 | |
mbed_official | 69:41db872bbc3a | 569 | #if defined(USART6_BASE) |
mbed_official | 69:41db872bbc3a | 570 | static void dma2_stream1_irq(void) |
mbed_official | 55:814265bf5462 | 571 | { |
mbed_official | 69:41db872bbc3a | 572 | dma_irq(DMA_2, 5, RxIrq); // uart6_rx |
mbed_official | 55:814265bf5462 | 573 | } |
mbed_official | 55:814265bf5462 | 574 | #endif |
mbed_official | 69:41db872bbc3a | 575 | |
mbed_official | 69:41db872bbc3a | 576 | static void dma2_stream5_irq(void) |
mbed_official | 69:41db872bbc3a | 577 | { |
mbed_official | 69:41db872bbc3a | 578 | dma_irq(DMA_2, 0, RxIrq); // uart1_rx |
mbed_official | 69:41db872bbc3a | 579 | } |
mbed_official | 69:41db872bbc3a | 580 | |
mbed_official | 69:41db872bbc3a | 581 | static void dma2_stream6_irq(void) |
mbed_official | 69:41db872bbc3a | 582 | { |
mbed_official | 69:41db872bbc3a | 583 | dma_irq(DMA_2, 5, TxIrq); // uart6_tx |
mbed_official | 69:41db872bbc3a | 584 | } |
mbed_official | 69:41db872bbc3a | 585 | |
mbed_official | 69:41db872bbc3a | 586 | static void dma2_stream7_irq(void) |
mbed_official | 69:41db872bbc3a | 587 | { |
mbed_official | 69:41db872bbc3a | 588 | dma_irq(DMA_2, 0, TxIrq); // uart1_tx |
mbed_official | 69:41db872bbc3a | 589 | } |
mbed_official | 69:41db872bbc3a | 590 | |
mbed_official | 69:41db872bbc3a | 591 | #endif // DEVICE_SERIAL_ASYNCH_DMA |
bogdanm | 0:9b334a45a8ff | 592 | |
bogdanm | 0:9b334a45a8ff | 593 | #if defined(UART5_BASE) |
bogdanm | 0:9b334a45a8ff | 594 | static void uart5_irq(void) |
bogdanm | 0:9b334a45a8ff | 595 | { |
mbed_official | 69:41db872bbc3a | 596 | uart_irq(4); |
bogdanm | 0:9b334a45a8ff | 597 | } |
bogdanm | 0:9b334a45a8ff | 598 | #endif |
bogdanm | 0:9b334a45a8ff | 599 | |
bogdanm | 0:9b334a45a8ff | 600 | #if defined(USART6_BASE) |
bogdanm | 0:9b334a45a8ff | 601 | static void uart6_irq(void) |
bogdanm | 0:9b334a45a8ff | 602 | { |
mbed_official | 69:41db872bbc3a | 603 | uart_irq(5); |
bogdanm | 0:9b334a45a8ff | 604 | } |
bogdanm | 0:9b334a45a8ff | 605 | #endif |
bogdanm | 0:9b334a45a8ff | 606 | |
bogdanm | 0:9b334a45a8ff | 607 | #if defined(UART7_BASE) |
bogdanm | 0:9b334a45a8ff | 608 | static void uart7_irq(void) |
bogdanm | 0:9b334a45a8ff | 609 | { |
mbed_official | 69:41db872bbc3a | 610 | uart_irq(6); |
bogdanm | 0:9b334a45a8ff | 611 | } |
bogdanm | 0:9b334a45a8ff | 612 | #endif |
bogdanm | 0:9b334a45a8ff | 613 | |
bogdanm | 0:9b334a45a8ff | 614 | #if defined(UART8_BASE) |
bogdanm | 0:9b334a45a8ff | 615 | static void uart8_irq(void) |
bogdanm | 0:9b334a45a8ff | 616 | { |
mbed_official | 69:41db872bbc3a | 617 | uart_irq(7); |
bogdanm | 0:9b334a45a8ff | 618 | } |
bogdanm | 0:9b334a45a8ff | 619 | #endif |
bogdanm | 0:9b334a45a8ff | 620 | |
bogdanm | 0:9b334a45a8ff | 621 | void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) |
bogdanm | 0:9b334a45a8ff | 622 | { |
bogdanm | 0:9b334a45a8ff | 623 | irq_handler = handler; |
mbed_official | 55:814265bf5462 | 624 | serial_irq_ids[SERIAL_OBJ(index)] = id; |
bogdanm | 0:9b334a45a8ff | 625 | } |
bogdanm | 0:9b334a45a8ff | 626 | |
bogdanm | 0:9b334a45a8ff | 627 | void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) |
bogdanm | 0:9b334a45a8ff | 628 | { |
bogdanm | 0:9b334a45a8ff | 629 | IRQn_Type irq_n = (IRQn_Type)0; |
bogdanm | 0:9b334a45a8ff | 630 | uint32_t vector = 0; |
mbed_official | 55:814265bf5462 | 631 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 632 | IRQn_Type irqn_dma = (IRQn_Type)0; |
mbed_official | 55:814265bf5462 | 633 | uint32_t vector_dma = 0; |
mbed_official | 55:814265bf5462 | 634 | #endif |
bogdanm | 0:9b334a45a8ff | 635 | |
mbed_official | 69:41db872bbc3a | 636 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
bogdanm | 0:9b334a45a8ff | 637 | |
mbed_official | 69:41db872bbc3a | 638 | switch (SERIAL_OBJ(index)) { |
mbed_official | 69:41db872bbc3a | 639 | case 0: |
bogdanm | 0:9b334a45a8ff | 640 | irq_n = USART1_IRQn; |
bogdanm | 0:9b334a45a8ff | 641 | vector = (uint32_t)&uart1_irq; |
mbed_official | 69:41db872bbc3a | 642 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 69:41db872bbc3a | 643 | if (irq == RxIrq) { |
mbed_official | 69:41db872bbc3a | 644 | irqn_dma = DMA2_Stream5_IRQn; |
mbed_official | 69:41db872bbc3a | 645 | vector_dma = (uint32_t)&dma2_stream5_irq; |
mbed_official | 69:41db872bbc3a | 646 | } else { |
mbed_official | 69:41db872bbc3a | 647 | irqn_dma = DMA2_Stream7_IRQn; |
mbed_official | 69:41db872bbc3a | 648 | vector_dma = (uint32_t)&dma2_stream7_irq; |
mbed_official | 69:41db872bbc3a | 649 | } |
mbed_official | 69:41db872bbc3a | 650 | #endif |
bogdanm | 0:9b334a45a8ff | 651 | break; |
bogdanm | 0:9b334a45a8ff | 652 | |
mbed_official | 69:41db872bbc3a | 653 | case 1: |
bogdanm | 0:9b334a45a8ff | 654 | irq_n = USART2_IRQn; |
bogdanm | 0:9b334a45a8ff | 655 | vector = (uint32_t)&uart2_irq; |
mbed_official | 69:41db872bbc3a | 656 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 69:41db872bbc3a | 657 | if (irq == RxIrq) { |
mbed_official | 69:41db872bbc3a | 658 | irqn_dma = DMA1_Stream5_IRQn; |
mbed_official | 69:41db872bbc3a | 659 | vector_dma = (uint32_t)&dma1_stream5_irq; |
mbed_official | 69:41db872bbc3a | 660 | } else { |
mbed_official | 69:41db872bbc3a | 661 | irqn_dma = DMA1_Stream6_IRQn; |
mbed_official | 69:41db872bbc3a | 662 | vector_dma = (uint32_t)&dma1_stream6_irq; |
mbed_official | 69:41db872bbc3a | 663 | } |
mbed_official | 69:41db872bbc3a | 664 | #endif |
bogdanm | 0:9b334a45a8ff | 665 | break; |
bogdanm | 0:9b334a45a8ff | 666 | #if defined(USART3_BASE) |
mbed_official | 69:41db872bbc3a | 667 | case 2: |
bogdanm | 0:9b334a45a8ff | 668 | irq_n = USART3_IRQn; |
bogdanm | 0:9b334a45a8ff | 669 | vector = (uint32_t)&uart3_irq; |
mbed_official | 69:41db872bbc3a | 670 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 69:41db872bbc3a | 671 | if (irq == RxIrq) { |
mbed_official | 69:41db872bbc3a | 672 | irqn_dma = DMA1_Stream1_IRQn; |
mbed_official | 69:41db872bbc3a | 673 | vector_dma = (uint32_t)&dma1_stream1_irq; |
mbed_official | 69:41db872bbc3a | 674 | } else { |
mbed_official | 69:41db872bbc3a | 675 | irqn_dma = DMA1_Stream3_IRQn; |
mbed_official | 69:41db872bbc3a | 676 | vector_dma = (uint32_t)&dma1_stream3_irq; |
mbed_official | 69:41db872bbc3a | 677 | } |
mbed_official | 69:41db872bbc3a | 678 | #endif |
bogdanm | 0:9b334a45a8ff | 679 | break; |
bogdanm | 0:9b334a45a8ff | 680 | #endif |
bogdanm | 0:9b334a45a8ff | 681 | #if defined(UART4_BASE) |
mbed_official | 69:41db872bbc3a | 682 | case 3: |
bogdanm | 0:9b334a45a8ff | 683 | irq_n = UART4_IRQn; |
bogdanm | 0:9b334a45a8ff | 684 | vector = (uint32_t)&uart4_irq; |
mbed_official | 55:814265bf5462 | 685 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 686 | if (irq == RxIrq) { |
mbed_official | 55:814265bf5462 | 687 | irqn_dma = DMA1_Stream2_IRQn; |
mbed_official | 55:814265bf5462 | 688 | vector_dma = (uint32_t)&dma1_stream2_irq; |
mbed_official | 55:814265bf5462 | 689 | } else { |
mbed_official | 55:814265bf5462 | 690 | irqn_dma = DMA1_Stream4_IRQn; |
mbed_official | 55:814265bf5462 | 691 | vector_dma = (uint32_t)&dma1_stream4_irq; |
mbed_official | 55:814265bf5462 | 692 | } |
mbed_official | 55:814265bf5462 | 693 | #endif |
bogdanm | 0:9b334a45a8ff | 694 | break; |
bogdanm | 0:9b334a45a8ff | 695 | #endif |
bogdanm | 0:9b334a45a8ff | 696 | #if defined(UART5_BASE) |
mbed_official | 69:41db872bbc3a | 697 | case 4: |
bogdanm | 0:9b334a45a8ff | 698 | irq_n = UART5_IRQn; |
bogdanm | 0:9b334a45a8ff | 699 | vector = (uint32_t)&uart5_irq; |
mbed_official | 69:41db872bbc3a | 700 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 69:41db872bbc3a | 701 | if (irq == RxIrq) { |
mbed_official | 69:41db872bbc3a | 702 | irqn_dma = DMA1_Stream0_IRQn; |
mbed_official | 69:41db872bbc3a | 703 | vector_dma = (uint32_t)&dma1_stream0_irq; |
mbed_official | 69:41db872bbc3a | 704 | } else { |
mbed_official | 69:41db872bbc3a | 705 | irqn_dma = DMA1_Stream4_IRQn; |
mbed_official | 69:41db872bbc3a | 706 | vector_dma = (uint32_t)&dma1_stream7_irq; |
mbed_official | 69:41db872bbc3a | 707 | } |
mbed_official | 69:41db872bbc3a | 708 | #endif |
bogdanm | 0:9b334a45a8ff | 709 | break; |
bogdanm | 0:9b334a45a8ff | 710 | #endif |
bogdanm | 0:9b334a45a8ff | 711 | #if defined(USART6_BASE) |
mbed_official | 69:41db872bbc3a | 712 | case 5: |
bogdanm | 0:9b334a45a8ff | 713 | irq_n = USART6_IRQn; |
bogdanm | 0:9b334a45a8ff | 714 | vector = (uint32_t)&uart6_irq; |
mbed_official | 69:41db872bbc3a | 715 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 69:41db872bbc3a | 716 | if (irq == RxIrq) { |
mbed_official | 69:41db872bbc3a | 717 | irqn_dma = DMA2_Stream1_IRQn; |
mbed_official | 69:41db872bbc3a | 718 | vector_dma = (uint32_t)&dma2_stream1_irq; |
mbed_official | 69:41db872bbc3a | 719 | } else { |
mbed_official | 69:41db872bbc3a | 720 | irqn_dma = DMA2_Stream6_IRQn; |
mbed_official | 69:41db872bbc3a | 721 | vector_dma = (uint32_t)&dma2_stream6_irq; |
mbed_official | 69:41db872bbc3a | 722 | } |
mbed_official | 69:41db872bbc3a | 723 | #endif |
bogdanm | 0:9b334a45a8ff | 724 | break; |
bogdanm | 0:9b334a45a8ff | 725 | #endif |
bogdanm | 0:9b334a45a8ff | 726 | #if defined(UART7_BASE) |
mbed_official | 69:41db872bbc3a | 727 | case 6: |
bogdanm | 0:9b334a45a8ff | 728 | irq_n = UART7_IRQn; |
bogdanm | 0:9b334a45a8ff | 729 | vector = (uint32_t)&uart7_irq; |
bogdanm | 0:9b334a45a8ff | 730 | break; |
bogdanm | 0:9b334a45a8ff | 731 | #endif |
bogdanm | 0:9b334a45a8ff | 732 | #if defined(UART8_BASE) |
mbed_official | 69:41db872bbc3a | 733 | case 7: |
bogdanm | 0:9b334a45a8ff | 734 | irq_n = UART8_IRQn; |
bogdanm | 0:9b334a45a8ff | 735 | vector = (uint32_t)&uart8_irq; |
bogdanm | 0:9b334a45a8ff | 736 | break; |
bogdanm | 0:9b334a45a8ff | 737 | #endif |
bogdanm | 0:9b334a45a8ff | 738 | } |
bogdanm | 0:9b334a45a8ff | 739 | |
bogdanm | 0:9b334a45a8ff | 740 | if (enable) { |
bogdanm | 0:9b334a45a8ff | 741 | |
bogdanm | 0:9b334a45a8ff | 742 | if (irq == RxIrq) { |
mbed_official | 69:41db872bbc3a | 743 | __HAL_UART_ENABLE_IT(handle, UART_IT_RXNE); |
mbed_official | 55:814265bf5462 | 744 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 745 | NVIC_SetVector(irq_n, vector_dma); |
mbed_official | 55:814265bf5462 | 746 | NVIC_EnableIRQ(irq_n); |
mbed_official | 55:814265bf5462 | 747 | NVIC_SetVector(irqn_dma, vector_dma); |
mbed_official | 55:814265bf5462 | 748 | NVIC_EnableIRQ(irqn_dma); |
mbed_official | 55:814265bf5462 | 749 | #else |
mbed_official | 55:814265bf5462 | 750 | NVIC_SetVector(irq_n, vector); |
mbed_official | 55:814265bf5462 | 751 | NVIC_EnableIRQ(irq_n); |
mbed_official | 55:814265bf5462 | 752 | #endif |
bogdanm | 0:9b334a45a8ff | 753 | } else { // TxIrq |
mbed_official | 69:41db872bbc3a | 754 | __HAL_UART_ENABLE_IT(handle, UART_IT_TC); |
mbed_official | 55:814265bf5462 | 755 | NVIC_SetVector(irq_n, vector); |
mbed_official | 55:814265bf5462 | 756 | NVIC_EnableIRQ(irq_n); |
mbed_official | 55:814265bf5462 | 757 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 758 | NVIC_SetVector(irqn_dma, vector_dma); |
mbed_official | 55:814265bf5462 | 759 | NVIC_EnableIRQ(irqn_dma); |
mbed_official | 55:814265bf5462 | 760 | #endif |
bogdanm | 0:9b334a45a8ff | 761 | } |
bogdanm | 0:9b334a45a8ff | 762 | } else { // disable |
bogdanm | 0:9b334a45a8ff | 763 | |
bogdanm | 0:9b334a45a8ff | 764 | int all_disabled = 0; |
bogdanm | 0:9b334a45a8ff | 765 | |
bogdanm | 0:9b334a45a8ff | 766 | if (irq == RxIrq) { |
mbed_official | 69:41db872bbc3a | 767 | __HAL_UART_DISABLE_IT(handle, UART_IT_RXNE); |
bogdanm | 0:9b334a45a8ff | 768 | // Check if TxIrq is disabled too |
mbed_official | 69:41db872bbc3a | 769 | if ((handle->Instance->CR1 & USART_CR1_TXEIE) == 0) all_disabled = 1; |
bogdanm | 0:9b334a45a8ff | 770 | } else { // TxIrq |
mbed_official | 69:41db872bbc3a | 771 | __HAL_UART_DISABLE_IT(handle, UART_IT_TXE); |
bogdanm | 0:9b334a45a8ff | 772 | // Check if RxIrq is disabled too |
mbed_official | 69:41db872bbc3a | 773 | if ((handle->Instance->CR1 & USART_CR1_RXNEIE) == 0) all_disabled = 1; |
bogdanm | 0:9b334a45a8ff | 774 | } |
bogdanm | 0:9b334a45a8ff | 775 | |
mbed_official | 55:814265bf5462 | 776 | if (all_disabled) { |
mbed_official | 55:814265bf5462 | 777 | NVIC_DisableIRQ(irq_n); |
mbed_official | 55:814265bf5462 | 778 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 779 | NVIC_DisableIRQ(irqn_dma); |
mbed_official | 55:814265bf5462 | 780 | #endif |
mbed_official | 55:814265bf5462 | 781 | } |
bogdanm | 0:9b334a45a8ff | 782 | |
bogdanm | 0:9b334a45a8ff | 783 | } |
bogdanm | 0:9b334a45a8ff | 784 | } |
bogdanm | 0:9b334a45a8ff | 785 | |
bogdanm | 0:9b334a45a8ff | 786 | /****************************************************************************** |
bogdanm | 0:9b334a45a8ff | 787 | * READ/WRITE |
bogdanm | 0:9b334a45a8ff | 788 | ******************************************************************************/ |
bogdanm | 0:9b334a45a8ff | 789 | |
bogdanm | 0:9b334a45a8ff | 790 | int serial_getc(serial_t *obj) |
bogdanm | 0:9b334a45a8ff | 791 | { |
mbed_official | 69:41db872bbc3a | 792 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
bogdanm | 0:9b334a45a8ff | 793 | while (!serial_readable(obj)); |
mbed_official | 69:41db872bbc3a | 794 | return (int)(handle->Instance->DR & 0x1FF); |
bogdanm | 0:9b334a45a8ff | 795 | } |
bogdanm | 0:9b334a45a8ff | 796 | |
bogdanm | 0:9b334a45a8ff | 797 | void serial_putc(serial_t *obj, int c) |
bogdanm | 0:9b334a45a8ff | 798 | { |
mbed_official | 69:41db872bbc3a | 799 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
bogdanm | 0:9b334a45a8ff | 800 | while (!serial_writable(obj)); |
mbed_official | 69:41db872bbc3a | 801 | handle->Instance->DR = (uint32_t)(c & 0x1FF); |
bogdanm | 0:9b334a45a8ff | 802 | } |
bogdanm | 0:9b334a45a8ff | 803 | |
bogdanm | 0:9b334a45a8ff | 804 | int serial_readable(serial_t *obj) |
bogdanm | 0:9b334a45a8ff | 805 | { |
bogdanm | 0:9b334a45a8ff | 806 | int status; |
mbed_official | 69:41db872bbc3a | 807 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
bogdanm | 0:9b334a45a8ff | 808 | // Check if data is received |
mbed_official | 69:41db872bbc3a | 809 | status = ((__HAL_UART_GET_FLAG(handle, UART_FLAG_RXNE) != RESET) ? 1 : 0); |
bogdanm | 0:9b334a45a8ff | 810 | return status; |
bogdanm | 0:9b334a45a8ff | 811 | } |
bogdanm | 0:9b334a45a8ff | 812 | |
bogdanm | 0:9b334a45a8ff | 813 | int serial_writable(serial_t *obj) |
bogdanm | 0:9b334a45a8ff | 814 | { |
bogdanm | 0:9b334a45a8ff | 815 | int status; |
mbed_official | 69:41db872bbc3a | 816 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
bogdanm | 0:9b334a45a8ff | 817 | // Check if data is transmitted |
mbed_official | 69:41db872bbc3a | 818 | status = ((__HAL_UART_GET_FLAG(handle, UART_FLAG_TXE) != RESET) ? 1 : 0); |
bogdanm | 0:9b334a45a8ff | 819 | return status; |
bogdanm | 0:9b334a45a8ff | 820 | } |
bogdanm | 0:9b334a45a8ff | 821 | |
bogdanm | 0:9b334a45a8ff | 822 | void serial_clear(serial_t *obj) |
bogdanm | 0:9b334a45a8ff | 823 | { |
mbed_official | 69:41db872bbc3a | 824 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
mbed_official | 69:41db872bbc3a | 825 | __HAL_UART_CLEAR_FLAG(handle, UART_FLAG_TXE); |
mbed_official | 69:41db872bbc3a | 826 | __HAL_UART_CLEAR_FLAG(handle, UART_FLAG_RXNE); |
bogdanm | 0:9b334a45a8ff | 827 | } |
bogdanm | 0:9b334a45a8ff | 828 | |
bogdanm | 0:9b334a45a8ff | 829 | void serial_pinout_tx(PinName tx) |
bogdanm | 0:9b334a45a8ff | 830 | { |
bogdanm | 0:9b334a45a8ff | 831 | pinmap_pinout(tx, PinMap_UART_TX); |
bogdanm | 0:9b334a45a8ff | 832 | } |
bogdanm | 0:9b334a45a8ff | 833 | |
bogdanm | 0:9b334a45a8ff | 834 | void serial_break_set(serial_t *obj) |
bogdanm | 0:9b334a45a8ff | 835 | { |
mbed_official | 69:41db872bbc3a | 836 | UART_HandleTypeDef *uart = &UartHandle[SERIAL_OBJ(index)]; |
mbed_official | 69:41db872bbc3a | 837 | HAL_LIN_SendBreak(uart); |
bogdanm | 0:9b334a45a8ff | 838 | } |
bogdanm | 0:9b334a45a8ff | 839 | |
bogdanm | 0:9b334a45a8ff | 840 | void serial_break_clear(serial_t *obj) |
bogdanm | 0:9b334a45a8ff | 841 | { |
mbed_official | 69:41db872bbc3a | 842 | (void)obj; |
bogdanm | 0:9b334a45a8ff | 843 | } |
bogdanm | 0:9b334a45a8ff | 844 | |
mbed_official | 55:814265bf5462 | 845 | //######################################################################################## |
mbed_official | 55:814265bf5462 | 846 | |
mbed_official | 55:814265bf5462 | 847 | #if DEVICE_SERIAL_ASYNCH |
mbed_official | 55:814265bf5462 | 848 | |
mbed_official | 55:814265bf5462 | 849 | //---------------------------------------------------------------------------------------- |
mbed_official | 55:814265bf5462 | 850 | // LOCAL HELPER FUNCTIONS |
mbed_official | 55:814265bf5462 | 851 | //---------------------------------------------------------------------------------------- |
mbed_official | 55:814265bf5462 | 852 | |
mbed_official | 55:814265bf5462 | 853 | /** Configure the TX buffer for an asynchronous write serial transaction |
mbed_official | 55:814265bf5462 | 854 | * |
mbed_official | 55:814265bf5462 | 855 | * @param obj The serial object. |
mbed_official | 55:814265bf5462 | 856 | * @param tx The buffer for sending. |
mbed_official | 55:814265bf5462 | 857 | * @param tx_length The number of words to transmit. |
mbed_official | 55:814265bf5462 | 858 | */ |
mbed_official | 55:814265bf5462 | 859 | static void h_serial_tx_buffer_set(serial_t *obj, void *tx, int tx_length, uint8_t width) |
mbed_official | 55:814265bf5462 | 860 | { |
mbed_official | 55:814265bf5462 | 861 | // We only support byte buffers for now |
mbed_official | 55:814265bf5462 | 862 | MBED_ASSERT(width == 8); |
mbed_official | 55:814265bf5462 | 863 | |
mbed_official | 55:814265bf5462 | 864 | // Exit if a transmit is already on-going |
mbed_official | 55:814265bf5462 | 865 | if (serial_tx_active(obj)) return; |
mbed_official | 55:814265bf5462 | 866 | |
mbed_official | 55:814265bf5462 | 867 | obj->tx_buff.buffer = tx; |
mbed_official | 55:814265bf5462 | 868 | obj->tx_buff.length = tx_length; |
mbed_official | 55:814265bf5462 | 869 | obj->tx_buff.pos = 0; |
mbed_official | 55:814265bf5462 | 870 | |
mbed_official | 55:814265bf5462 | 871 | return; |
mbed_official | 55:814265bf5462 | 872 | } |
mbed_official | 55:814265bf5462 | 873 | |
mbed_official | 55:814265bf5462 | 874 | /** Configure the RX buffer for an asynchronous write serial transaction |
mbed_official | 55:814265bf5462 | 875 | * |
mbed_official | 55:814265bf5462 | 876 | * @param obj The serial object. |
mbed_official | 55:814265bf5462 | 877 | * @param tx The buffer for sending. |
mbed_official | 55:814265bf5462 | 878 | * @param tx_length The number of words to transmit. |
mbed_official | 55:814265bf5462 | 879 | */ |
mbed_official | 55:814265bf5462 | 880 | static void h_serial_rx_buffer_set(serial_t *obj, void *rx, int rx_length, uint8_t width) |
mbed_official | 55:814265bf5462 | 881 | { |
mbed_official | 55:814265bf5462 | 882 | /* Sanity check arguments */ |
mbed_official | 55:814265bf5462 | 883 | MBED_ASSERT(obj); |
mbed_official | 55:814265bf5462 | 884 | MBED_ASSERT(rx != (void*)0); |
mbed_official | 55:814265bf5462 | 885 | // We only support byte buffers for now |
mbed_official | 55:814265bf5462 | 886 | MBED_ASSERT(width == 8); |
mbed_official | 55:814265bf5462 | 887 | |
mbed_official | 55:814265bf5462 | 888 | // Exit if a reception is already on-going |
mbed_official | 55:814265bf5462 | 889 | if (serial_rx_active(obj)) return; |
mbed_official | 55:814265bf5462 | 890 | |
mbed_official | 55:814265bf5462 | 891 | obj->rx_buff.buffer = rx; |
mbed_official | 55:814265bf5462 | 892 | obj->rx_buff.length = rx_length; |
mbed_official | 55:814265bf5462 | 893 | obj->rx_buff.pos = 0; |
mbed_official | 55:814265bf5462 | 894 | |
mbed_official | 55:814265bf5462 | 895 | return; |
mbed_official | 55:814265bf5462 | 896 | } |
mbed_official | 55:814265bf5462 | 897 | |
mbed_official | 55:814265bf5462 | 898 | /** Configure TX events |
mbed_official | 55:814265bf5462 | 899 | * |
mbed_official | 55:814265bf5462 | 900 | * @param obj The serial object |
mbed_official | 55:814265bf5462 | 901 | * @param event The logical OR of the TX events to configure |
mbed_official | 55:814265bf5462 | 902 | * @param enable Set to non-zero to enable events, or zero to disable them |
mbed_official | 55:814265bf5462 | 903 | */ |
mbed_official | 55:814265bf5462 | 904 | static void h_serial_tx_enable_event(serial_t *obj, int event, uint8_t enable) |
mbed_official | 55:814265bf5462 | 905 | { |
mbed_official | 55:814265bf5462 | 906 | // Shouldn't have to enable TX interrupt here, just need to keep track of the requested events. |
mbed_official | 55:814265bf5462 | 907 | if (enable) SERIAL_OBJ(events) |= event; |
mbed_official | 55:814265bf5462 | 908 | else SERIAL_OBJ(events) &= ~event; |
mbed_official | 55:814265bf5462 | 909 | } |
mbed_official | 55:814265bf5462 | 910 | |
mbed_official | 55:814265bf5462 | 911 | /** Configure RX events |
mbed_official | 55:814265bf5462 | 912 | * |
mbed_official | 55:814265bf5462 | 913 | * @param obj The serial object |
mbed_official | 55:814265bf5462 | 914 | * @param event The logical OR of the RX events to configure |
mbed_official | 55:814265bf5462 | 915 | * @param enable Set to non-zero to enable events, or zero to disable them |
mbed_official | 55:814265bf5462 | 916 | */ |
mbed_official | 55:814265bf5462 | 917 | static void h_serial_rx_enable_event(serial_t *obj, int event, uint8_t enable) |
mbed_official | 55:814265bf5462 | 918 | { |
mbed_official | 55:814265bf5462 | 919 | // Shouldn't have to enable RX interrupt here, just need to keep track of the requested events. |
mbed_official | 55:814265bf5462 | 920 | if (enable) SERIAL_OBJ(events) |= event; |
mbed_official | 55:814265bf5462 | 921 | else SERIAL_OBJ(events) &= ~event; |
mbed_official | 55:814265bf5462 | 922 | } |
mbed_official | 55:814265bf5462 | 923 | |
mbed_official | 55:814265bf5462 | 924 | /** |
mbed_official | 55:814265bf5462 | 925 | * Get index of serial object TX IRQ, relating it to the physical peripheral. |
mbed_official | 55:814265bf5462 | 926 | * |
mbed_official | 55:814265bf5462 | 927 | * @param obj pointer to serial object |
mbed_official | 55:814265bf5462 | 928 | * @return internal NVIC TX IRQ index of U(S)ART peripheral |
mbed_official | 55:814265bf5462 | 929 | */ |
mbed_official | 55:814265bf5462 | 930 | static IRQn_Type h_serial_get_irq_index(serial_t *obj) |
mbed_official | 55:814265bf5462 | 931 | { |
mbed_official | 55:814265bf5462 | 932 | IRQn_Type irq_n = (IRQn_Type)0; |
mbed_official | 55:814265bf5462 | 933 | |
mbed_official | 69:41db872bbc3a | 934 | switch (SERIAL_OBJ(index)) { |
mbed_official | 55:814265bf5462 | 935 | #if defined(USART1_BASE) |
mbed_official | 69:41db872bbc3a | 936 | case 0: |
mbed_official | 55:814265bf5462 | 937 | irq_n = USART1_IRQn; |
mbed_official | 55:814265bf5462 | 938 | break; |
bogdanm | 0:9b334a45a8ff | 939 | #endif |
mbed_official | 55:814265bf5462 | 940 | #if defined(USART2_BASE) |
mbed_official | 69:41db872bbc3a | 941 | case 1: |
mbed_official | 55:814265bf5462 | 942 | irq_n = USART2_IRQn; |
mbed_official | 55:814265bf5462 | 943 | break; |
mbed_official | 55:814265bf5462 | 944 | #endif |
mbed_official | 55:814265bf5462 | 945 | #if defined(USART3_BASE) |
mbed_official | 69:41db872bbc3a | 946 | case 2: |
mbed_official | 55:814265bf5462 | 947 | irq_n = USART3_IRQn; |
mbed_official | 55:814265bf5462 | 948 | break; |
mbed_official | 55:814265bf5462 | 949 | #endif |
mbed_official | 55:814265bf5462 | 950 | #if defined(UART4_BASE) |
mbed_official | 69:41db872bbc3a | 951 | case 3: |
mbed_official | 55:814265bf5462 | 952 | irq_n = UART4_IRQn; |
mbed_official | 55:814265bf5462 | 953 | break; |
mbed_official | 55:814265bf5462 | 954 | #endif |
mbed_official | 69:41db872bbc3a | 955 | #if defined(USART5_BASE) |
mbed_official | 69:41db872bbc3a | 956 | case 4: |
mbed_official | 55:814265bf5462 | 957 | irq_n = UART5_IRQn; |
mbed_official | 55:814265bf5462 | 958 | break; |
mbed_official | 55:814265bf5462 | 959 | #endif |
mbed_official | 55:814265bf5462 | 960 | #if defined(USART6_BASE) |
mbed_official | 69:41db872bbc3a | 961 | case 5: |
mbed_official | 55:814265bf5462 | 962 | irq_n = USART6_IRQn; |
mbed_official | 55:814265bf5462 | 963 | break; |
mbed_official | 55:814265bf5462 | 964 | #endif |
mbed_official | 55:814265bf5462 | 965 | #if defined(UART7_BASE) |
mbed_official | 69:41db872bbc3a | 966 | case 6: |
mbed_official | 55:814265bf5462 | 967 | irq_n = UART7_IRQn; |
mbed_official | 55:814265bf5462 | 968 | break; |
mbed_official | 55:814265bf5462 | 969 | #endif |
mbed_official | 55:814265bf5462 | 970 | #if defined(UART8_BASE) |
mbed_official | 69:41db872bbc3a | 971 | case 7: |
mbed_official | 55:814265bf5462 | 972 | irq_n = UART8_IRQn; |
mbed_official | 55:814265bf5462 | 973 | break; |
mbed_official | 55:814265bf5462 | 974 | #endif |
mbed_official | 55:814265bf5462 | 975 | default: |
mbed_official | 55:814265bf5462 | 976 | irq_n = (IRQn_Type)0; |
mbed_official | 55:814265bf5462 | 977 | } |
mbed_official | 55:814265bf5462 | 978 | |
mbed_official | 55:814265bf5462 | 979 | return irq_n; |
mbed_official | 55:814265bf5462 | 980 | } |
mbed_official | 55:814265bf5462 | 981 | |
mbed_official | 55:814265bf5462 | 982 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 983 | |
mbed_official | 69:41db872bbc3a | 984 | /** |
mbed_official | 69:41db872bbc3a | 985 | * @brief Start the DMA Transfer with interrupt enabled. |
mbed_official | 69:41db872bbc3a | 986 | * @param hdma: pointer to a DMA_HandleTypeDef structure that contains |
mbed_official | 69:41db872bbc3a | 987 | * the configuration information for the specified DMA Stream. |
mbed_official | 69:41db872bbc3a | 988 | * @param SrcAddress: The source memory Buffer address |
mbed_official | 69:41db872bbc3a | 989 | * @param DstAddress: The destination memory Buffer address |
mbed_official | 69:41db872bbc3a | 990 | * @param DataLength: The length of data to be transferred from source to destination |
mbed_official | 69:41db872bbc3a | 991 | * @retval HAL status |
mbed_official | 69:41db872bbc3a | 992 | */ |
mbed_official | 69:41db872bbc3a | 993 | static HAL_StatusTypeDef MBED_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) |
mbed_official | 55:814265bf5462 | 994 | { |
mbed_official | 69:41db872bbc3a | 995 | /* Process locked */ |
mbed_official | 69:41db872bbc3a | 996 | __HAL_LOCK(hdma); |
mbed_official | 69:41db872bbc3a | 997 | |
mbed_official | 69:41db872bbc3a | 998 | /* Change DMA peripheral state */ |
mbed_official | 69:41db872bbc3a | 999 | hdma->State = HAL_DMA_STATE_BUSY; |
mbed_official | 69:41db872bbc3a | 1000 | |
mbed_official | 69:41db872bbc3a | 1001 | /* Check the parameters */ |
mbed_official | 69:41db872bbc3a | 1002 | assert_param(IS_DMA_BUFFER_SIZE(DataLength)); |
mbed_official | 69:41db872bbc3a | 1003 | |
mbed_official | 69:41db872bbc3a | 1004 | /* Disable the peripheral */ |
mbed_official | 69:41db872bbc3a | 1005 | __HAL_DMA_DISABLE(hdma); |
mbed_official | 69:41db872bbc3a | 1006 | |
mbed_official | 69:41db872bbc3a | 1007 | /* Configure the source, destination address and the data length */ |
mbed_official | 69:41db872bbc3a | 1008 | /* Clear DBM bit */ |
mbed_official | 69:41db872bbc3a | 1009 | hdma->Instance->CR &= (uint32_t)(~DMA_SxCR_DBM); |
mbed_official | 69:41db872bbc3a | 1010 | |
mbed_official | 69:41db872bbc3a | 1011 | /* Configure DMA Stream data length */ |
mbed_official | 69:41db872bbc3a | 1012 | hdma->Instance->NDTR = DataLength; |
mbed_official | 69:41db872bbc3a | 1013 | |
mbed_official | 69:41db872bbc3a | 1014 | /* Peripheral to Memory */ |
mbed_official | 69:41db872bbc3a | 1015 | if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) { |
mbed_official | 69:41db872bbc3a | 1016 | /* Configure DMA Stream destination address */ |
mbed_official | 69:41db872bbc3a | 1017 | hdma->Instance->PAR = DstAddress; |
mbed_official | 69:41db872bbc3a | 1018 | |
mbed_official | 69:41db872bbc3a | 1019 | /* Configure DMA Stream source address */ |
mbed_official | 69:41db872bbc3a | 1020 | hdma->Instance->M0AR = SrcAddress; |
mbed_official | 69:41db872bbc3a | 1021 | } else { |
mbed_official | 69:41db872bbc3a | 1022 | /* Memory to Peripheral */ |
mbed_official | 69:41db872bbc3a | 1023 | /* Configure DMA Stream source address */ |
mbed_official | 69:41db872bbc3a | 1024 | hdma->Instance->PAR = SrcAddress; |
mbed_official | 69:41db872bbc3a | 1025 | |
mbed_official | 69:41db872bbc3a | 1026 | /* Configure DMA Stream destination address */ |
mbed_official | 69:41db872bbc3a | 1027 | hdma->Instance->M0AR = DstAddress; |
mbed_official | 69:41db872bbc3a | 1028 | } |
mbed_official | 69:41db872bbc3a | 1029 | |
mbed_official | 69:41db872bbc3a | 1030 | /* Enable all interrupts EXCEPT HALF TRANSFER COMPLETE */ |
mbed_official | 69:41db872bbc3a | 1031 | hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; |
mbed_official | 69:41db872bbc3a | 1032 | hdma->Instance->FCR |= DMA_IT_FE; |
mbed_official | 69:41db872bbc3a | 1033 | |
mbed_official | 69:41db872bbc3a | 1034 | /* Enable the Peripheral */ |
mbed_official | 69:41db872bbc3a | 1035 | __HAL_DMA_ENABLE(hdma); |
mbed_official | 69:41db872bbc3a | 1036 | |
mbed_official | 69:41db872bbc3a | 1037 | return HAL_OK; |
mbed_official | 69:41db872bbc3a | 1038 | } |
mbed_official | 69:41db872bbc3a | 1039 | /** |
mbed_official | 69:41db872bbc3a | 1040 | * @brief DMA UART receive process half complete callback |
mbed_official | 69:41db872bbc3a | 1041 | * @param hdma: pointer to a DMA_HandleTypeDef structure that contains |
mbed_official | 69:41db872bbc3a | 1042 | * the configuration information for the specified DMA module. |
mbed_official | 69:41db872bbc3a | 1043 | * @retval None |
mbed_official | 69:41db872bbc3a | 1044 | */ |
mbed_official | 69:41db872bbc3a | 1045 | static void h_UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma) |
mbed_official | 69:41db872bbc3a | 1046 | { |
mbed_official | 69:41db872bbc3a | 1047 | UART_HandleTypeDef* huart = (UART_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; |
mbed_official | 69:41db872bbc3a | 1048 | |
mbed_official | 69:41db872bbc3a | 1049 | HAL_UART_RxHalfCpltCallback(huart); |
mbed_official | 55:814265bf5462 | 1050 | } |
mbed_official | 69:41db872bbc3a | 1051 | |
mbed_official | 69:41db872bbc3a | 1052 | /** |
mbed_official | 69:41db872bbc3a | 1053 | * @brief DMA UART receive process complete callback. |
mbed_official | 69:41db872bbc3a | 1054 | * @param hdma: DMA handle |
mbed_official | 69:41db872bbc3a | 1055 | * @retval None |
mbed_official | 69:41db872bbc3a | 1056 | */ |
mbed_official | 69:41db872bbc3a | 1057 | static void h_UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma) |
mbed_official | 69:41db872bbc3a | 1058 | { |
mbed_official | 69:41db872bbc3a | 1059 | UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; |
mbed_official | 69:41db872bbc3a | 1060 | /* DMA Normal mode*/ |
mbed_official | 69:41db872bbc3a | 1061 | if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0) |
mbed_official | 69:41db872bbc3a | 1062 | { |
mbed_official | 69:41db872bbc3a | 1063 | huart->RxXferCount = 0; |
mbed_official | 69:41db872bbc3a | 1064 | |
mbed_official | 69:41db872bbc3a | 1065 | /* Disable the DMA transfer for the receiver request by setting the DMAR bit |
mbed_official | 69:41db872bbc3a | 1066 | in the UART CR3 register */ |
mbed_official | 69:41db872bbc3a | 1067 | huart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAR); |
mbed_official | 69:41db872bbc3a | 1068 | |
mbed_official | 69:41db872bbc3a | 1069 | /* Check if a transmit process is ongoing or not */ |
mbed_official | 69:41db872bbc3a | 1070 | if(huart->State == HAL_UART_STATE_BUSY_TX_RX) |
mbed_official | 69:41db872bbc3a | 1071 | { |
mbed_official | 69:41db872bbc3a | 1072 | huart->State = HAL_UART_STATE_BUSY_TX; |
mbed_official | 69:41db872bbc3a | 1073 | } |
mbed_official | 69:41db872bbc3a | 1074 | else |
mbed_official | 69:41db872bbc3a | 1075 | { |
mbed_official | 69:41db872bbc3a | 1076 | huart->State = HAL_UART_STATE_READY; |
mbed_official | 69:41db872bbc3a | 1077 | } |
mbed_official | 69:41db872bbc3a | 1078 | } |
mbed_official | 69:41db872bbc3a | 1079 | HAL_UART_RxCpltCallback(huart); |
mbed_official | 69:41db872bbc3a | 1080 | } |
mbed_official | 69:41db872bbc3a | 1081 | /** |
mbed_official | 69:41db872bbc3a | 1082 | * @brief DMA UART communication error callback. |
mbed_official | 69:41db872bbc3a | 1083 | * @param hdma: DMA handle |
mbed_official | 69:41db872bbc3a | 1084 | * @retval None |
mbed_official | 69:41db872bbc3a | 1085 | */ |
mbed_official | 69:41db872bbc3a | 1086 | static void h_UART_DMAError(DMA_HandleTypeDef *hdma) |
mbed_official | 55:814265bf5462 | 1087 | { |
mbed_official | 69:41db872bbc3a | 1088 | UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; |
mbed_official | 69:41db872bbc3a | 1089 | huart->RxXferCount = 0; |
mbed_official | 69:41db872bbc3a | 1090 | huart->TxXferCount = 0; |
mbed_official | 69:41db872bbc3a | 1091 | huart->State= HAL_UART_STATE_READY; |
mbed_official | 69:41db872bbc3a | 1092 | huart->ErrorCode |= HAL_UART_ERROR_DMA; |
mbed_official | 69:41db872bbc3a | 1093 | HAL_UART_ErrorCallback(huart); |
mbed_official | 69:41db872bbc3a | 1094 | } |
mbed_official | 69:41db872bbc3a | 1095 | |
mbed_official | 69:41db872bbc3a | 1096 | /** |
mbed_official | 69:41db872bbc3a | 1097 | * @brief Receives an amount of data in non blocking mode. |
mbed_official | 69:41db872bbc3a | 1098 | * @note This function differs from HAL's function as it does not enable HalfTranferComplete |
mbed_official | 69:41db872bbc3a | 1099 | * @param huart: pointer to a UART_HandleTypeDef structure that contains |
mbed_official | 69:41db872bbc3a | 1100 | * the configuration information for the specified UART module. |
mbed_official | 69:41db872bbc3a | 1101 | * @param pData: Pointer to data buffer |
mbed_official | 69:41db872bbc3a | 1102 | * @param Size: Amount of data to be received |
mbed_official | 69:41db872bbc3a | 1103 | * @note When the UART parity is enabled (PCE = 1) the data received contain the parity bit. |
mbed_official | 69:41db872bbc3a | 1104 | * @retval HAL status |
mbed_official | 69:41db872bbc3a | 1105 | */ |
mbed_official | 69:41db872bbc3a | 1106 | static HAL_StatusTypeDef MBED_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) |
mbed_official | 69:41db872bbc3a | 1107 | { |
mbed_official | 69:41db872bbc3a | 1108 | uint32_t *tmp; |
mbed_official | 69:41db872bbc3a | 1109 | uint32_t tmp1 = 0; |
mbed_official | 69:41db872bbc3a | 1110 | |
mbed_official | 69:41db872bbc3a | 1111 | tmp1 = huart->State; |
mbed_official | 69:41db872bbc3a | 1112 | if((tmp1 == HAL_UART_STATE_READY) || (tmp1 == HAL_UART_STATE_BUSY_TX)) { |
mbed_official | 69:41db872bbc3a | 1113 | if((pData == NULL ) || (Size == 0)) { |
mbed_official | 69:41db872bbc3a | 1114 | return HAL_ERROR; |
mbed_official | 69:41db872bbc3a | 1115 | } |
mbed_official | 69:41db872bbc3a | 1116 | |
mbed_official | 69:41db872bbc3a | 1117 | /* Process Locked */ |
mbed_official | 69:41db872bbc3a | 1118 | __HAL_LOCK(huart); |
mbed_official | 69:41db872bbc3a | 1119 | |
mbed_official | 69:41db872bbc3a | 1120 | huart->pRxBuffPtr = pData; |
mbed_official | 69:41db872bbc3a | 1121 | huart->RxXferSize = Size; |
mbed_official | 69:41db872bbc3a | 1122 | |
mbed_official | 69:41db872bbc3a | 1123 | huart->ErrorCode = HAL_UART_ERROR_NONE; |
mbed_official | 69:41db872bbc3a | 1124 | /* Check if a transmit process is ongoing or not */ |
mbed_official | 69:41db872bbc3a | 1125 | if(huart->State == HAL_UART_STATE_BUSY_TX) { |
mbed_official | 69:41db872bbc3a | 1126 | huart->State = HAL_UART_STATE_BUSY_TX_RX; |
mbed_official | 69:41db872bbc3a | 1127 | } else { |
mbed_official | 69:41db872bbc3a | 1128 | huart->State = HAL_UART_STATE_BUSY_RX; |
mbed_official | 69:41db872bbc3a | 1129 | } |
mbed_official | 69:41db872bbc3a | 1130 | |
mbed_official | 69:41db872bbc3a | 1131 | /* Set the UART DMA transfer complete callback */ |
mbed_official | 69:41db872bbc3a | 1132 | huart->hdmarx->XferCpltCallback = h_UART_DMAReceiveCplt; |
mbed_official | 69:41db872bbc3a | 1133 | |
mbed_official | 69:41db872bbc3a | 1134 | /* Set the UART DMA Half transfer complete callback */ |
mbed_official | 69:41db872bbc3a | 1135 | huart->hdmarx->XferHalfCpltCallback = h_UART_DMARxHalfCplt; |
mbed_official | 69:41db872bbc3a | 1136 | |
mbed_official | 69:41db872bbc3a | 1137 | /* Set the DMA error callback */ |
mbed_official | 69:41db872bbc3a | 1138 | huart->hdmarx->XferErrorCallback = h_UART_DMAError; |
mbed_official | 69:41db872bbc3a | 1139 | |
mbed_official | 69:41db872bbc3a | 1140 | /* Enable the DMA Stream */ |
mbed_official | 69:41db872bbc3a | 1141 | tmp = (uint32_t*)&pData; |
mbed_official | 69:41db872bbc3a | 1142 | MBED_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->DR, *(uint32_t*)tmp, Size); |
mbed_official | 69:41db872bbc3a | 1143 | |
mbed_official | 69:41db872bbc3a | 1144 | /* Enable the DMA transfer for the receiver request by setting the DMAR bit |
mbed_official | 69:41db872bbc3a | 1145 | in the UART CR3 register */ |
mbed_official | 69:41db872bbc3a | 1146 | huart->Instance->CR3 |= USART_CR3_DMAR; |
mbed_official | 69:41db872bbc3a | 1147 | |
mbed_official | 69:41db872bbc3a | 1148 | /* Process Unlocked */ |
mbed_official | 69:41db872bbc3a | 1149 | __HAL_UNLOCK(huart); |
mbed_official | 69:41db872bbc3a | 1150 | |
mbed_official | 69:41db872bbc3a | 1151 | return HAL_OK; |
mbed_official | 69:41db872bbc3a | 1152 | } else { |
mbed_official | 69:41db872bbc3a | 1153 | return HAL_BUSY; |
mbed_official | 69:41db872bbc3a | 1154 | } |
mbed_official | 55:814265bf5462 | 1155 | } |
mbed_official | 55:814265bf5462 | 1156 | |
mbed_official | 55:814265bf5462 | 1157 | /** |
mbed_official | 55:814265bf5462 | 1158 | * Get index of serial object TX DMA IRQ, relating it to the physical peripheral. |
mbed_official | 55:814265bf5462 | 1159 | * |
mbed_official | 55:814265bf5462 | 1160 | * @param obj pointer to serial object |
mbed_official | 55:814265bf5462 | 1161 | * @return internal NVIC TX DMA IRQ index of U(S)ART peripheral |
mbed_official | 55:814265bf5462 | 1162 | */ |
mbed_official | 55:814265bf5462 | 1163 | static IRQn_Type h_serial_tx_get_irqdma_index(serial_t *obj) |
mbed_official | 55:814265bf5462 | 1164 | { |
mbed_official | 55:814265bf5462 | 1165 | IRQn_Type irq_n = (IRQn_Type)0; |
mbed_official | 55:814265bf5462 | 1166 | |
mbed_official | 69:41db872bbc3a | 1167 | switch (SERIAL_OBJ(index)) { |
mbed_official | 55:814265bf5462 | 1168 | #if defined(USART1_BASE) |
mbed_official | 69:41db872bbc3a | 1169 | case 0: |
mbed_official | 55:814265bf5462 | 1170 | irq_n = DMA2_Stream7_IRQn; |
mbed_official | 55:814265bf5462 | 1171 | break; |
mbed_official | 55:814265bf5462 | 1172 | #endif |
mbed_official | 55:814265bf5462 | 1173 | #if defined(USART2_BASE) |
mbed_official | 69:41db872bbc3a | 1174 | case 1: |
mbed_official | 55:814265bf5462 | 1175 | irq_n = DMA1_Stream6_IRQn; |
mbed_official | 55:814265bf5462 | 1176 | break; |
mbed_official | 55:814265bf5462 | 1177 | #endif |
mbed_official | 55:814265bf5462 | 1178 | #if defined(USART3_BASE) |
mbed_official | 69:41db872bbc3a | 1179 | case 2: |
mbed_official | 55:814265bf5462 | 1180 | irq_n = DMA1_Stream3_IRQn; |
mbed_official | 55:814265bf5462 | 1181 | break; |
mbed_official | 55:814265bf5462 | 1182 | #endif |
mbed_official | 55:814265bf5462 | 1183 | #if defined(UART4_BASE) |
mbed_official | 69:41db872bbc3a | 1184 | case 3: |
mbed_official | 55:814265bf5462 | 1185 | irq_n = DMA1_Stream4_IRQn; |
mbed_official | 55:814265bf5462 | 1186 | break; |
mbed_official | 55:814265bf5462 | 1187 | #endif |
mbed_official | 55:814265bf5462 | 1188 | #if defined(UART5_BASE) |
mbed_official | 69:41db872bbc3a | 1189 | case 4: |
mbed_official | 55:814265bf5462 | 1190 | irq_n = DMA1_Stream7_IRQn; |
mbed_official | 55:814265bf5462 | 1191 | break; |
mbed_official | 55:814265bf5462 | 1192 | #endif |
mbed_official | 55:814265bf5462 | 1193 | #if defined(USART6_BASE) |
mbed_official | 69:41db872bbc3a | 1194 | case 5: |
mbed_official | 55:814265bf5462 | 1195 | irq_n = DMA2_Stream6_IRQn; |
mbed_official | 55:814265bf5462 | 1196 | break; |
mbed_official | 55:814265bf5462 | 1197 | #endif |
mbed_official | 55:814265bf5462 | 1198 | default: |
mbed_official | 55:814265bf5462 | 1199 | irq_n = (IRQn_Type)0; |
mbed_official | 55:814265bf5462 | 1200 | } |
mbed_official | 55:814265bf5462 | 1201 | |
mbed_official | 55:814265bf5462 | 1202 | return irq_n; |
mbed_official | 55:814265bf5462 | 1203 | } |
mbed_official | 55:814265bf5462 | 1204 | /** |
mbed_official | 55:814265bf5462 | 1205 | * Get index of serial object RX DMA IRQ, relating it to the physical peripheral. |
mbed_official | 55:814265bf5462 | 1206 | * |
mbed_official | 55:814265bf5462 | 1207 | * @param obj pointer to serial object |
mbed_official | 55:814265bf5462 | 1208 | * @return internal NVIC RX DMA IRQ index of U(S)ART peripheral |
mbed_official | 55:814265bf5462 | 1209 | */ |
mbed_official | 55:814265bf5462 | 1210 | static IRQn_Type h_serial_rx_get_irqdma_index(serial_t *obj) |
mbed_official | 55:814265bf5462 | 1211 | { |
mbed_official | 55:814265bf5462 | 1212 | IRQn_Type irq_n = (IRQn_Type)0; |
mbed_official | 55:814265bf5462 | 1213 | |
mbed_official | 69:41db872bbc3a | 1214 | switch (SERIAL_OBJ(index)) { |
mbed_official | 55:814265bf5462 | 1215 | #if defined(USART1_BASE) |
mbed_official | 69:41db872bbc3a | 1216 | case 0: |
mbed_official | 55:814265bf5462 | 1217 | irq_n = DMA2_Stream5_IRQn; |
mbed_official | 55:814265bf5462 | 1218 | break; |
mbed_official | 55:814265bf5462 | 1219 | #endif |
mbed_official | 55:814265bf5462 | 1220 | #if defined(USART2_BASE) |
mbed_official | 69:41db872bbc3a | 1221 | case 1: |
mbed_official | 55:814265bf5462 | 1222 | irq_n = DMA1_Stream5_IRQn; |
mbed_official | 55:814265bf5462 | 1223 | break; |
mbed_official | 55:814265bf5462 | 1224 | #endif |
mbed_official | 55:814265bf5462 | 1225 | #if defined(USART3_BASE) |
mbed_official | 69:41db872bbc3a | 1226 | case 2: |
mbed_official | 55:814265bf5462 | 1227 | irq_n = DMA1_Stream1_IRQn; |
mbed_official | 55:814265bf5462 | 1228 | break; |
mbed_official | 55:814265bf5462 | 1229 | #endif |
mbed_official | 55:814265bf5462 | 1230 | #if defined(UART4_BASE) |
mbed_official | 69:41db872bbc3a | 1231 | case 3: |
mbed_official | 55:814265bf5462 | 1232 | irq_n = DMA1_Stream2_IRQn; |
mbed_official | 55:814265bf5462 | 1233 | break; |
mbed_official | 55:814265bf5462 | 1234 | #endif |
mbed_official | 55:814265bf5462 | 1235 | #if defined(UART5_BASE) |
mbed_official | 69:41db872bbc3a | 1236 | case 4: |
mbed_official | 55:814265bf5462 | 1237 | irq_n = DMA1_Stream0_IRQn; |
mbed_official | 55:814265bf5462 | 1238 | break; |
mbed_official | 55:814265bf5462 | 1239 | #endif |
mbed_official | 55:814265bf5462 | 1240 | #if defined(USART6_BASE) |
mbed_official | 69:41db872bbc3a | 1241 | case 5: |
mbed_official | 69:41db872bbc3a | 1242 | irq_n = DMA2_Stream1_IRQn; |
mbed_official | 55:814265bf5462 | 1243 | break; |
mbed_official | 55:814265bf5462 | 1244 | #endif |
mbed_official | 55:814265bf5462 | 1245 | default: |
mbed_official | 55:814265bf5462 | 1246 | irq_n = (IRQn_Type)0; |
mbed_official | 55:814265bf5462 | 1247 | } |
mbed_official | 55:814265bf5462 | 1248 | |
mbed_official | 55:814265bf5462 | 1249 | return irq_n; |
mbed_official | 55:814265bf5462 | 1250 | } |
mbed_official | 55:814265bf5462 | 1251 | #endif |
mbed_official | 55:814265bf5462 | 1252 | //---------------------------------------------------------------------------------------- |
mbed_official | 55:814265bf5462 | 1253 | // MBED API FUNCTIONS |
mbed_official | 55:814265bf5462 | 1254 | //---------------------------------------------------------------------------------------- |
mbed_official | 55:814265bf5462 | 1255 | |
mbed_official | 55:814265bf5462 | 1256 | /** Begin asynchronous TX transfer. The used buffer is specified in the serial object, |
mbed_official | 55:814265bf5462 | 1257 | * tx_buff |
mbed_official | 55:814265bf5462 | 1258 | * |
mbed_official | 55:814265bf5462 | 1259 | * @param obj The serial object |
mbed_official | 55:814265bf5462 | 1260 | * @param tx The buffer for sending |
mbed_official | 55:814265bf5462 | 1261 | * @param tx_length The number of words to transmit |
mbed_official | 55:814265bf5462 | 1262 | * @param tx_width The bit width of buffer word |
mbed_official | 55:814265bf5462 | 1263 | * @param handler The serial handler |
mbed_official | 55:814265bf5462 | 1264 | * @param event The logical OR of events to be registered |
mbed_official | 55:814265bf5462 | 1265 | * @param hint A suggestion for how to use DMA with this transfer |
mbed_official | 55:814265bf5462 | 1266 | * @return Returns number of data transfered, or 0 otherwise |
mbed_official | 55:814265bf5462 | 1267 | */ |
mbed_official | 69:41db872bbc3a | 1268 | #ifdef YOTTA_CFG_MBED_OS |
mbed_official | 69:41db872bbc3a | 1269 | int serial_tx_asynch(serial_t *obj, void *tx, size_t tx_length, uint8_t tx_width, uint32_t handler, uint32_t event, DMAUsage hint) |
mbed_official | 69:41db872bbc3a | 1270 | #else |
mbed_official | 55:814265bf5462 | 1271 | int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx_width, uint32_t handler, uint32_t event, DMAUsage hint) |
mbed_official | 69:41db872bbc3a | 1272 | #endif |
mbed_official | 55:814265bf5462 | 1273 | { |
mbed_official | 69:41db872bbc3a | 1274 | // DMA usage is currently ignored |
mbed_official | 69:41db872bbc3a | 1275 | (void) hint; |
mbed_official | 69:41db872bbc3a | 1276 | |
mbed_official | 55:814265bf5462 | 1277 | // Check buffer is ok |
mbed_official | 55:814265bf5462 | 1278 | MBED_ASSERT(tx != (void*)0); |
mbed_official | 55:814265bf5462 | 1279 | MBED_ASSERT(tx_width == 8); // support only 8b width |
mbed_official | 55:814265bf5462 | 1280 | |
mbed_official | 55:814265bf5462 | 1281 | if (tx_length == 0) return 0; |
mbed_official | 55:814265bf5462 | 1282 | |
mbed_official | 55:814265bf5462 | 1283 | // Set up buffer |
mbed_official | 55:814265bf5462 | 1284 | h_serial_tx_buffer_set(obj, (void *)tx, tx_length, tx_width); |
mbed_official | 55:814265bf5462 | 1285 | |
mbed_official | 55:814265bf5462 | 1286 | // Set up events |
mbed_official | 55:814265bf5462 | 1287 | h_serial_tx_enable_event(obj, SERIAL_EVENT_TX_ALL, 0); // Clear all events |
mbed_official | 55:814265bf5462 | 1288 | h_serial_tx_enable_event(obj, event, 1); // Set only the wanted events |
mbed_official | 55:814265bf5462 | 1289 | |
mbed_official | 69:41db872bbc3a | 1290 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
mbed_official | 55:814265bf5462 | 1291 | // Enable interrupt |
mbed_official | 55:814265bf5462 | 1292 | IRQn_Type irqn = h_serial_get_irq_index(obj); |
mbed_official | 55:814265bf5462 | 1293 | NVIC_ClearPendingIRQ(irqn); |
mbed_official | 55:814265bf5462 | 1294 | NVIC_DisableIRQ(irqn); |
mbed_official | 55:814265bf5462 | 1295 | NVIC_SetPriority(irqn, 1); |
mbed_official | 55:814265bf5462 | 1296 | NVIC_SetVector(irqn, (uint32_t)handler); |
mbed_official | 55:814265bf5462 | 1297 | NVIC_EnableIRQ(irqn); |
mbed_official | 55:814265bf5462 | 1298 | |
mbed_official | 55:814265bf5462 | 1299 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 1300 | // Enable DMA interrupt |
mbed_official | 55:814265bf5462 | 1301 | irqn = h_serial_tx_get_irqdma_index(obj); |
mbed_official | 55:814265bf5462 | 1302 | NVIC_ClearPendingIRQ(irqn); |
mbed_official | 55:814265bf5462 | 1303 | NVIC_DisableIRQ(irqn); |
mbed_official | 55:814265bf5462 | 1304 | NVIC_SetPriority(irqn, 1); |
mbed_official | 55:814265bf5462 | 1305 | NVIC_SetVector(irqn, (uint32_t)handler); |
mbed_official | 55:814265bf5462 | 1306 | NVIC_EnableIRQ(irqn); |
mbed_official | 55:814265bf5462 | 1307 | |
mbed_official | 55:814265bf5462 | 1308 | // the following function will enable program and enable the DMA transfer |
mbed_official | 69:41db872bbc3a | 1309 | if (HAL_UART_Transmit_DMA(handle, (uint8_t*)tx, tx_length) != HAL_OK) |
mbed_official | 55:814265bf5462 | 1310 | { |
mbed_official | 55:814265bf5462 | 1311 | /* Transfer error in transmission process */ |
mbed_official | 55:814265bf5462 | 1312 | return 0; |
mbed_official | 55:814265bf5462 | 1313 | } |
mbed_official | 55:814265bf5462 | 1314 | #else |
mbed_official | 55:814265bf5462 | 1315 | // the following function will enable UART_IT_TXE and error interrupts |
mbed_official | 69:41db872bbc3a | 1316 | if (HAL_UART_Transmit_IT(handle, (uint8_t*)tx, tx_length) != HAL_OK) |
mbed_official | 55:814265bf5462 | 1317 | { |
mbed_official | 55:814265bf5462 | 1318 | /* Transfer error in transmission process */ |
mbed_official | 55:814265bf5462 | 1319 | return 0; |
mbed_official | 55:814265bf5462 | 1320 | } |
mbed_official | 55:814265bf5462 | 1321 | #endif |
mbed_official | 69:41db872bbc3a | 1322 | |
mbed_official | 69:41db872bbc3a | 1323 | DEBUG_PRINTF("UART%u: Tx: 0=(%u, %u) %x\n", obj->serial.module+1, tx_length, tx_width, HAL_UART_GetState(handle)); |
mbed_official | 69:41db872bbc3a | 1324 | |
mbed_official | 55:814265bf5462 | 1325 | return tx_length; |
mbed_official | 55:814265bf5462 | 1326 | } |
mbed_official | 55:814265bf5462 | 1327 | |
mbed_official | 55:814265bf5462 | 1328 | /** Begin asynchronous RX transfer (enable interrupt for data collecting) |
mbed_official | 55:814265bf5462 | 1329 | * The used buffer is specified in the serial object - rx_buff |
mbed_official | 55:814265bf5462 | 1330 | * |
mbed_official | 55:814265bf5462 | 1331 | * @param obj The serial object |
mbed_official | 55:814265bf5462 | 1332 | * @param rx The buffer for sending |
mbed_official | 55:814265bf5462 | 1333 | * @param rx_length The number of words to transmit |
mbed_official | 55:814265bf5462 | 1334 | * @param rx_width The bit width of buffer word |
mbed_official | 55:814265bf5462 | 1335 | * @param handler The serial handler |
mbed_official | 55:814265bf5462 | 1336 | * @param event The logical OR of events to be registered |
mbed_official | 55:814265bf5462 | 1337 | * @param handler The serial handler |
mbed_official | 55:814265bf5462 | 1338 | * @param char_match A character in range 0-254 to be matched |
mbed_official | 55:814265bf5462 | 1339 | * @param hint A suggestion for how to use DMA with this transfer |
mbed_official | 55:814265bf5462 | 1340 | */ |
mbed_official | 55:814265bf5462 | 1341 | void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_width, uint32_t handler, uint32_t event, uint8_t char_match, DMAUsage hint) |
mbed_official | 55:814265bf5462 | 1342 | { |
mbed_official | 69:41db872bbc3a | 1343 | // DMA usage is currently ignored |
mbed_official | 69:41db872bbc3a | 1344 | (void) hint; |
mbed_official | 69:41db872bbc3a | 1345 | |
mbed_official | 55:814265bf5462 | 1346 | /* Sanity check arguments */ |
mbed_official | 55:814265bf5462 | 1347 | MBED_ASSERT(obj); |
mbed_official | 55:814265bf5462 | 1348 | MBED_ASSERT(rx != (void*)0); |
mbed_official | 55:814265bf5462 | 1349 | MBED_ASSERT(rx_width == 8); // support only 8b width |
mbed_official | 55:814265bf5462 | 1350 | |
mbed_official | 55:814265bf5462 | 1351 | h_serial_rx_enable_event(obj, SERIAL_EVENT_RX_ALL, 0); |
mbed_official | 55:814265bf5462 | 1352 | h_serial_rx_enable_event(obj, event, 1); |
mbed_official | 55:814265bf5462 | 1353 | // set CharMatch |
mbed_official | 55:814265bf5462 | 1354 | if (char_match != SERIAL_RESERVED_CHAR_MATCH) { |
mbed_official | 55:814265bf5462 | 1355 | obj->char_match = char_match; |
mbed_official | 55:814265bf5462 | 1356 | } |
mbed_official | 55:814265bf5462 | 1357 | h_serial_rx_buffer_set(obj, rx, rx_length, rx_width); |
mbed_official | 55:814265bf5462 | 1358 | |
mbed_official | 55:814265bf5462 | 1359 | IRQn_Type irqn = h_serial_get_irq_index(obj); |
mbed_official | 55:814265bf5462 | 1360 | NVIC_ClearPendingIRQ(irqn); |
mbed_official | 55:814265bf5462 | 1361 | NVIC_DisableIRQ(irqn); |
mbed_official | 55:814265bf5462 | 1362 | NVIC_SetPriority(irqn, 0); |
mbed_official | 55:814265bf5462 | 1363 | NVIC_SetVector(irqn, (uint32_t)handler); |
mbed_official | 55:814265bf5462 | 1364 | NVIC_EnableIRQ(irqn); |
mbed_official | 55:814265bf5462 | 1365 | |
mbed_official | 69:41db872bbc3a | 1366 | |
mbed_official | 69:41db872bbc3a | 1367 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
mbed_official | 55:814265bf5462 | 1368 | // flush current data + error flags |
mbed_official | 69:41db872bbc3a | 1369 | __HAL_UART_CLEAR_PEFLAG(handle); |
mbed_official | 55:814265bf5462 | 1370 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 55:814265bf5462 | 1371 | // Enable DMA interrupt |
mbed_official | 55:814265bf5462 | 1372 | irqn = h_serial_rx_get_irqdma_index(obj); |
mbed_official | 55:814265bf5462 | 1373 | NVIC_ClearPendingIRQ(irqn); |
mbed_official | 55:814265bf5462 | 1374 | NVIC_DisableIRQ(irqn); |
mbed_official | 55:814265bf5462 | 1375 | NVIC_SetPriority(irqn, 1); |
mbed_official | 55:814265bf5462 | 1376 | NVIC_SetVector(irqn, (uint32_t)handler); |
mbed_official | 55:814265bf5462 | 1377 | NVIC_EnableIRQ(irqn); |
mbed_official | 55:814265bf5462 | 1378 | // following HAL function will program and enable the DMA transfer |
mbed_official | 69:41db872bbc3a | 1379 | MBED_UART_Receive_DMA(handle, (uint8_t*)rx, rx_length); |
mbed_official | 55:814265bf5462 | 1380 | #else |
mbed_official | 55:814265bf5462 | 1381 | // following HAL function will enable the RXNE interrupt + error interrupts |
mbed_official | 69:41db872bbc3a | 1382 | HAL_UART_Receive_IT(handle, (uint8_t*)rx, rx_length); |
mbed_official | 55:814265bf5462 | 1383 | #endif |
mbed_official | 55:814265bf5462 | 1384 | /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */ |
mbed_official | 69:41db872bbc3a | 1385 | __HAL_UART_ENABLE_IT(handle, UART_IT_ERR); |
mbed_official | 55:814265bf5462 | 1386 | |
mbed_official | 69:41db872bbc3a | 1387 | DEBUG_PRINTF("UART%u: Rx: 0=(%u, %u, %u) %x\n", obj->serial.module+1, rx_length, rx_width, char_match, HAL_UART_GetState(handle)); |
mbed_official | 55:814265bf5462 | 1388 | return; |
mbed_official | 55:814265bf5462 | 1389 | } |
mbed_official | 55:814265bf5462 | 1390 | |
mbed_official | 55:814265bf5462 | 1391 | /** Attempts to determine if the serial peripheral is already in use for TX |
mbed_official | 55:814265bf5462 | 1392 | * |
mbed_official | 55:814265bf5462 | 1393 | * @param obj The serial object |
mbed_official | 55:814265bf5462 | 1394 | * @return Non-zero if the TX transaction is ongoing, 0 otherwise |
mbed_official | 55:814265bf5462 | 1395 | */ |
mbed_official | 55:814265bf5462 | 1396 | uint8_t serial_tx_active(serial_t *obj) |
mbed_official | 55:814265bf5462 | 1397 | { |
mbed_official | 55:814265bf5462 | 1398 | MBED_ASSERT(obj); |
mbed_official | 69:41db872bbc3a | 1399 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
mbed_official | 69:41db872bbc3a | 1400 | return ((HAL_UART_GetState(handle) & UART_STATE_TX_ACTIVE) ? 1 : 0); |
mbed_official | 55:814265bf5462 | 1401 | } |
mbed_official | 55:814265bf5462 | 1402 | |
mbed_official | 55:814265bf5462 | 1403 | /** Attempts to determine if the serial peripheral is already in use for RX |
mbed_official | 55:814265bf5462 | 1404 | * |
mbed_official | 55:814265bf5462 | 1405 | * @param obj The serial object |
mbed_official | 55:814265bf5462 | 1406 | * @return Non-zero if the RX transaction is ongoing, 0 otherwise |
mbed_official | 55:814265bf5462 | 1407 | */ |
mbed_official | 55:814265bf5462 | 1408 | uint8_t serial_rx_active(serial_t *obj) |
mbed_official | 55:814265bf5462 | 1409 | { |
mbed_official | 55:814265bf5462 | 1410 | MBED_ASSERT(obj); |
mbed_official | 69:41db872bbc3a | 1411 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
mbed_official | 69:41db872bbc3a | 1412 | return ((HAL_UART_GetState(handle) & UART_STATE_RX_ACTIVE) ? 1 : 0); |
mbed_official | 55:814265bf5462 | 1413 | |
mbed_official | 55:814265bf5462 | 1414 | } |
mbed_official | 55:814265bf5462 | 1415 | |
mbed_official | 55:814265bf5462 | 1416 | /** The asynchronous TX and RX handler. |
mbed_official | 55:814265bf5462 | 1417 | * |
mbed_official | 55:814265bf5462 | 1418 | * @param obj The serial object |
mbed_official | 55:814265bf5462 | 1419 | * @return Returns event flags if a TX/RX transfer termination condition was met or 0 otherwise |
mbed_official | 55:814265bf5462 | 1420 | */ |
mbed_official | 55:814265bf5462 | 1421 | int serial_irq_handler_asynch(serial_t *obj) |
mbed_official | 55:814265bf5462 | 1422 | { |
mbed_official | 55:814265bf5462 | 1423 | volatile int return_event = 0; |
mbed_official | 55:814265bf5462 | 1424 | uint8_t *buf = (uint8_t*)obj->rx_buff.buffer; |
mbed_official | 55:814265bf5462 | 1425 | uint8_t i = 0; |
mbed_official | 55:814265bf5462 | 1426 | |
mbed_official | 55:814265bf5462 | 1427 | // Irq handler is common to Tx and Rx |
mbed_official | 69:41db872bbc3a | 1428 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
mbed_official | 55:814265bf5462 | 1429 | #if DEVICE_SERIAL_ASYNCH_DMA |
mbed_official | 69:41db872bbc3a | 1430 | if ((handle->Instance->CR3 & USART_CR3_DMAT) !=0) { |
mbed_official | 55:814265bf5462 | 1431 | // call dma tx interrupt |
mbed_official | 69:41db872bbc3a | 1432 | HAL_DMA_IRQHandler(handle->hdmatx); |
mbed_official | 55:814265bf5462 | 1433 | } |
mbed_official | 69:41db872bbc3a | 1434 | if ((handle->Instance->CR3 & USART_CR3_DMAR) !=0) { |
mbed_official | 55:814265bf5462 | 1435 | // call dma rx interrupt |
mbed_official | 69:41db872bbc3a | 1436 | HAL_DMA_IRQHandler(handle->hdmarx); |
mbed_official | 55:814265bf5462 | 1437 | } |
mbed_official | 55:814265bf5462 | 1438 | #endif |
mbed_official | 69:41db872bbc3a | 1439 | HAL_UART_IRQHandler(handle); |
mbed_official | 55:814265bf5462 | 1440 | // TX PART: |
mbed_official | 69:41db872bbc3a | 1441 | if (__HAL_UART_GET_FLAG(handle, UART_FLAG_TC) != RESET) { |
mbed_official | 69:41db872bbc3a | 1442 | __HAL_UART_CLEAR_FLAG(handle, UART_FLAG_TC); |
mbed_official | 55:814265bf5462 | 1443 | // return event SERIAL_EVENT_TX_COMPLETE if requested |
mbed_official | 55:814265bf5462 | 1444 | if ((SERIAL_OBJ(events) & SERIAL_EVENT_TX_COMPLETE ) != 0){ |
mbed_official | 55:814265bf5462 | 1445 | return_event |= SERIAL_EVENT_TX_COMPLETE & obj->serial.events; |
mbed_official | 55:814265bf5462 | 1446 | } |
mbed_official | 55:814265bf5462 | 1447 | } |
mbed_official | 55:814265bf5462 | 1448 | // handle error events: |
mbed_official | 69:41db872bbc3a | 1449 | if (__HAL_UART_GET_FLAG(handle, HAL_UART_ERROR_PE)) { |
mbed_official | 69:41db872bbc3a | 1450 | __HAL_UART_CLEAR_FLAG(handle, HAL_UART_ERROR_PE); |
mbed_official | 55:814265bf5462 | 1451 | return_event |= SERIAL_EVENT_RX_PARITY_ERROR & obj->serial.events; |
mbed_official | 55:814265bf5462 | 1452 | } |
mbed_official | 69:41db872bbc3a | 1453 | if (__HAL_UART_GET_FLAG(handle, HAL_UART_ERROR_NE)||(handle->ErrorCode & HAL_UART_ERROR_NE)!=0) { |
mbed_official | 69:41db872bbc3a | 1454 | __HAL_UART_CLEAR_FLAG(handle, HAL_UART_ERROR_NE); |
mbed_official | 55:814265bf5462 | 1455 | // not supported by mbed |
mbed_official | 55:814265bf5462 | 1456 | } |
mbed_official | 69:41db872bbc3a | 1457 | if (__HAL_UART_GET_FLAG(handle, HAL_UART_ERROR_FE)||(handle->ErrorCode & HAL_UART_ERROR_FE)!=0) { |
mbed_official | 69:41db872bbc3a | 1458 | __HAL_UART_CLEAR_FLAG(handle, HAL_UART_ERROR_FE); |
mbed_official | 69:41db872bbc3a | 1459 | return_event |= SERIAL_EVENT_RX_FRAMING_ERROR & SERIAL_OBJ(events); |
mbed_official | 55:814265bf5462 | 1460 | } |
mbed_official | 69:41db872bbc3a | 1461 | if (__HAL_UART_GET_FLAG(handle, HAL_UART_ERROR_ORE)||(handle->ErrorCode & HAL_UART_ERROR_ORE)!=0) { |
mbed_official | 69:41db872bbc3a | 1462 | __HAL_UART_CLEAR_FLAG(handle, HAL_UART_ERROR_ORE); |
mbed_official | 69:41db872bbc3a | 1463 | return_event |= SERIAL_EVENT_RX_OVERRUN_ERROR & SERIAL_OBJ(events); |
mbed_official | 55:814265bf5462 | 1464 | } |
mbed_official | 55:814265bf5462 | 1465 | |
mbed_official | 55:814265bf5462 | 1466 | //RX PART |
mbed_official | 55:814265bf5462 | 1467 | // increment rx_buff.pos |
mbed_official | 69:41db872bbc3a | 1468 | if (handle->RxXferSize !=0) { |
mbed_official | 69:41db872bbc3a | 1469 | obj->rx_buff.pos = handle->RxXferSize - handle->RxXferCount; |
mbed_official | 55:814265bf5462 | 1470 | } |
mbed_official | 69:41db872bbc3a | 1471 | if ((handle->RxXferCount==0)&&(obj->rx_buff.pos >= (obj->rx_buff.length - 1))) { |
mbed_official | 69:41db872bbc3a | 1472 | return_event |= SERIAL_EVENT_RX_COMPLETE & SERIAL_OBJ(events); |
mbed_official | 55:814265bf5462 | 1473 | } |
mbed_official | 55:814265bf5462 | 1474 | // Chek if Char_match is present |
mbed_official | 55:814265bf5462 | 1475 | if (SERIAL_OBJ(events) & SERIAL_EVENT_RX_CHARACTER_MATCH) { |
mbed_official | 55:814265bf5462 | 1476 | if (buf != NULL){ |
mbed_official | 69:41db872bbc3a | 1477 | while((buf[i] != obj->char_match)&&(i<handle->RxXferSize)){//for (i=0;i<UartHandle.RxXferSize;i++){ |
mbed_official | 55:814265bf5462 | 1478 | i++;//if (buf[i] == obj->char_match{ |
mbed_official | 55:814265bf5462 | 1479 | //} |
mbed_official | 55:814265bf5462 | 1480 | } |
mbed_official | 69:41db872bbc3a | 1481 | if (i<handle->RxXferSize){ |
mbed_official | 55:814265bf5462 | 1482 | obj->rx_buff.pos = i; |
mbed_official | 69:41db872bbc3a | 1483 | return_event |= SERIAL_EVENT_RX_CHARACTER_MATCH & SERIAL_OBJ(events); |
mbed_official | 55:814265bf5462 | 1484 | } |
mbed_official | 55:814265bf5462 | 1485 | } |
mbed_official | 55:814265bf5462 | 1486 | } |
mbed_official | 55:814265bf5462 | 1487 | return return_event; |
mbed_official | 55:814265bf5462 | 1488 | } |
mbed_official | 55:814265bf5462 | 1489 | |
mbed_official | 55:814265bf5462 | 1490 | /** Abort the ongoing TX transaction. It disables the enabled interupt for TX and |
mbed_official | 55:814265bf5462 | 1491 | * flush TX hardware buffer if TX FIFO is used |
mbed_official | 55:814265bf5462 | 1492 | * |
mbed_official | 55:814265bf5462 | 1493 | * @param obj The serial object |
mbed_official | 55:814265bf5462 | 1494 | */ |
mbed_official | 55:814265bf5462 | 1495 | void serial_tx_abort_asynch(serial_t *obj) |
mbed_official | 55:814265bf5462 | 1496 | { |
mbed_official | 69:41db872bbc3a | 1497 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
mbed_official | 69:41db872bbc3a | 1498 | __HAL_UART_DISABLE_IT(handle, UART_IT_TC|UART_IT_TXE); |
mbed_official | 69:41db872bbc3a | 1499 | // clear flags |
mbed_official | 69:41db872bbc3a | 1500 | __HAL_UART_CLEAR_PEFLAG(handle); |
mbed_official | 69:41db872bbc3a | 1501 | // reset states |
mbed_official | 69:41db872bbc3a | 1502 | handle->TxXferCount = 0; |
mbed_official | 69:41db872bbc3a | 1503 | // update handle state |
mbed_official | 69:41db872bbc3a | 1504 | if (handle->State == HAL_UART_STATE_BUSY_TX_RX) { |
mbed_official | 69:41db872bbc3a | 1505 | handle->State = HAL_UART_STATE_BUSY_RX; |
mbed_official | 69:41db872bbc3a | 1506 | } else { |
mbed_official | 69:41db872bbc3a | 1507 | handle->State = HAL_UART_STATE_READY; |
mbed_official | 69:41db872bbc3a | 1508 | } |
mbed_official | 55:814265bf5462 | 1509 | } |
mbed_official | 55:814265bf5462 | 1510 | |
mbed_official | 55:814265bf5462 | 1511 | /** Abort the ongoing RX transaction It disables the enabled interrupt for RX and |
mbed_official | 55:814265bf5462 | 1512 | * flush RX hardware buffer if RX FIFO is used |
mbed_official | 55:814265bf5462 | 1513 | * |
mbed_official | 55:814265bf5462 | 1514 | * @param obj The serial object |
mbed_official | 55:814265bf5462 | 1515 | */ |
mbed_official | 55:814265bf5462 | 1516 | void serial_rx_abort_asynch(serial_t *obj) |
mbed_official | 55:814265bf5462 | 1517 | { |
mbed_official | 69:41db872bbc3a | 1518 | UART_HandleTypeDef *handle = &UartHandle[SERIAL_OBJ(index)]; |
mbed_official | 69:41db872bbc3a | 1519 | __HAL_UART_DISABLE_IT(handle, UART_IT_RXNE); |
mbed_official | 69:41db872bbc3a | 1520 | // clear flags |
mbed_official | 69:41db872bbc3a | 1521 | __HAL_UART_CLEAR_PEFLAG(handle); |
mbed_official | 69:41db872bbc3a | 1522 | // reset states |
mbed_official | 69:41db872bbc3a | 1523 | handle->RxXferCount = 0; |
mbed_official | 69:41db872bbc3a | 1524 | // update handle state |
mbed_official | 69:41db872bbc3a | 1525 | if (handle->State == HAL_UART_STATE_BUSY_TX_RX) { |
mbed_official | 69:41db872bbc3a | 1526 | handle->State = HAL_UART_STATE_BUSY_TX; |
mbed_official | 69:41db872bbc3a | 1527 | } else { |
mbed_official | 69:41db872bbc3a | 1528 | handle->State = HAL_UART_STATE_READY; |
mbed_official | 69:41db872bbc3a | 1529 | } |
mbed_official | 55:814265bf5462 | 1530 | } |
mbed_official | 55:814265bf5462 | 1531 | |
mbed_official | 55:814265bf5462 | 1532 | #endif |
mbed_official | 55:814265bf5462 | 1533 | |
mbed_official | 60:6e6ed0527880 | 1534 | #if DEVICE_SERIAL_FC |
mbed_official | 60:6e6ed0527880 | 1535 | /** Set HW Control Flow |
mbed_official | 60:6e6ed0527880 | 1536 | * @param obj The serial object |
mbed_official | 60:6e6ed0527880 | 1537 | * @param type The Control Flow type (FlowControlNone, FlowControlRTS, FlowControlCTS, FlowControlRTSCTS) |
mbed_official | 60:6e6ed0527880 | 1538 | * @param rxflow Pin for the rxflow |
mbed_official | 60:6e6ed0527880 | 1539 | * @param txflow Pin for the txflow |
mbed_official | 60:6e6ed0527880 | 1540 | */ |
mbed_official | 60:6e6ed0527880 | 1541 | void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow) |
mbed_official | 60:6e6ed0527880 | 1542 | { |
mbed_official | 60:6e6ed0527880 | 1543 | |
mbed_official | 60:6e6ed0527880 | 1544 | // Determine the UART to use (UART_1, UART_2, ...) |
mbed_official | 60:6e6ed0527880 | 1545 | UARTName uart_rts = (UARTName)pinmap_peripheral(rxflow, PinMap_UART_RTS); |
mbed_official | 60:6e6ed0527880 | 1546 | UARTName uart_cts = (UARTName)pinmap_peripheral(txflow, PinMap_UART_CTS); |
mbed_official | 60:6e6ed0527880 | 1547 | |
mbed_official | 60:6e6ed0527880 | 1548 | // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object |
mbed_official | 69:41db872bbc3a | 1549 | UARTName instance = (UARTName)pinmap_merge(uart_cts, uart_rts); |
mbed_official | 60:6e6ed0527880 | 1550 | |
mbed_official | 69:41db872bbc3a | 1551 | MBED_ASSERT(instance != (UARTName)NC); |
mbed_official | 60:6e6ed0527880 | 1552 | |
mbed_official | 60:6e6ed0527880 | 1553 | if(type == FlowControlNone) { |
mbed_official | 60:6e6ed0527880 | 1554 | // Disable hardware flow control |
mbed_official | 60:6e6ed0527880 | 1555 | SERIAL_OBJ(hw_flow_ctl) = UART_HWCONTROL_NONE; |
mbed_official | 60:6e6ed0527880 | 1556 | } |
mbed_official | 60:6e6ed0527880 | 1557 | if (type == FlowControlRTS) { |
mbed_official | 60:6e6ed0527880 | 1558 | // Enable RTS |
mbed_official | 60:6e6ed0527880 | 1559 | MBED_ASSERT(uart_rts != (UARTName)NC); |
mbed_official | 60:6e6ed0527880 | 1560 | SERIAL_OBJ(hw_flow_ctl) = UART_HWCONTROL_RTS; |
mbed_official | 60:6e6ed0527880 | 1561 | SERIAL_OBJ(pin_rts) = rxflow; |
mbed_official | 60:6e6ed0527880 | 1562 | // Enable the pin for RTS function |
mbed_official | 60:6e6ed0527880 | 1563 | pinmap_pinout(rxflow, PinMap_UART_RTS); |
mbed_official | 60:6e6ed0527880 | 1564 | } |
mbed_official | 60:6e6ed0527880 | 1565 | if (type == FlowControlCTS) { |
mbed_official | 60:6e6ed0527880 | 1566 | // Enable CTS |
mbed_official | 60:6e6ed0527880 | 1567 | MBED_ASSERT(uart_cts != (UARTName)NC); |
mbed_official | 60:6e6ed0527880 | 1568 | SERIAL_OBJ(hw_flow_ctl) = UART_HWCONTROL_CTS; |
mbed_official | 60:6e6ed0527880 | 1569 | SERIAL_OBJ(pin_cts) = txflow; |
mbed_official | 60:6e6ed0527880 | 1570 | // Enable the pin for CTS function |
mbed_official | 60:6e6ed0527880 | 1571 | pinmap_pinout(txflow, PinMap_UART_CTS); |
mbed_official | 60:6e6ed0527880 | 1572 | } |
mbed_official | 60:6e6ed0527880 | 1573 | if (type == FlowControlRTSCTS) { |
mbed_official | 60:6e6ed0527880 | 1574 | // Enable CTS & RTS |
mbed_official | 60:6e6ed0527880 | 1575 | MBED_ASSERT(uart_rts != (UARTName)NC); |
mbed_official | 60:6e6ed0527880 | 1576 | MBED_ASSERT(uart_cts != (UARTName)NC); |
mbed_official | 60:6e6ed0527880 | 1577 | SERIAL_OBJ(hw_flow_ctl) = UART_HWCONTROL_RTS_CTS; |
mbed_official | 60:6e6ed0527880 | 1578 | SERIAL_OBJ(pin_rts) = rxflow; |
mbed_official | 60:6e6ed0527880 | 1579 | SERIAL_OBJ(pin_cts) = txflow; |
mbed_official | 60:6e6ed0527880 | 1580 | // Enable the pin for CTS function |
mbed_official | 60:6e6ed0527880 | 1581 | pinmap_pinout(txflow, PinMap_UART_CTS); |
mbed_official | 60:6e6ed0527880 | 1582 | // Enable the pin for RTS function |
mbed_official | 60:6e6ed0527880 | 1583 | pinmap_pinout(rxflow, PinMap_UART_RTS); |
mbed_official | 60:6e6ed0527880 | 1584 | } |
mbed_official | 69:41db872bbc3a | 1585 | init_uart(obj, instance); |
mbed_official | 60:6e6ed0527880 | 1586 | } |
mbed_official | 55:814265bf5462 | 1587 | #endif |
mbed_official | 60:6e6ed0527880 | 1588 | #endif |