ELIOT1 HAL
Загрузка...
Поиск...
Не найдено
hal_uart_dma.h
См. документацию.
1
12#ifndef HAL_SPI_DMA_H
13#define HAL_SPI_DMA_H
14
15#include "hal_dma.h"
16#include "hal_uart.h"
17
19#define HAL_UART_DMA_DRIVER_VERSION (MAKE_VERSION(1, 0, 0))
20
25
27typedef void (*uart_dma_transfer_callback_t)(UART_Type *base,
28 uart_dma_handle_t *handle,
29 enum uart_status status,
30 void *user_data);
31
52
53#if defined(__cplusplus)
54extern "C" {
55#endif
56
67void UART_TransferCreateHandleDMA(UART_Type *base,
68 uart_dma_handle_t *handle,
70 void *user_data, dma_handle_t *tx_dma_handle,
71 dma_handle_t *rx_dma_handle);
72
88enum uart_status UART_TransferSendDMA(UART_Type *base,
89 uart_dma_handle_t *handle, struct uart_transfer *xfer);
90
107 uart_dma_handle_t *handle, struct uart_transfer *xfer);
108
115void UART_TransferAbortSendDMA(UART_Type *base, uart_dma_handle_t *handle);
116
123void UART_TransferAbortReceiveDMA(UART_Type *base, uart_dma_handle_t *handle);
124
131static inline void UART_WaitWhileActive(UART_Type *base)
132{
133 /* Ожидание завершения передачи */
134 while (base->USR & UART_USR_BUSY_Msk);
135}
136
147static inline void UART_DMADescriptorInitTX(UART_Type *base,
148 dma_descriptor_t *desc, uint32_t count, uint32_t data_size,
149 uint32_t data_width, void *src_addr)
150{
151 dma_multiblock_config_t config = {
152 .count = count,
153 .data_size = data_size,
154 .transfer_type = DMA_MemoryToPeripheral_DMA,
155 .scatter_en = false,
156 .gather_en = false,
157 .src_burst_size = DMA_BurstSize32,
158 .dst_burst_size = DMA_BurstSize1,
159 .src_incr = DMA_Incr,
160 .dst_incr = DMA_NoChange,
161 .src_data_width = data_width,
162 .dst_data_width = data_width,
163 .src_addr = src_addr,
164 .dst_addr = (void *) &base->THR,
165 .int_en = true
166 };
167
168 DMA_InitMultiblockDescriptor(desc, &config);
169}
170
181static inline void UART_DMADescriptorInitRX(UART_Type *base,
182 dma_descriptor_t *desc, uint32_t count, uint32_t data_size,
183 uint32_t data_width, void *dst_addr)
184{
185 dma_multiblock_config_t config = {
186 .count = count,
187 .data_size = data_size,
188 .transfer_type = DMA_PeripheralToMemory_DMA,
189 .scatter_en = false,
190 .gather_en = false,
191 .src_burst_size = DMA_BurstSize1,
192 .dst_burst_size = DMA_BurstSize32,
193 .src_incr = DMA_NoChange,
194 .dst_incr = DMA_Incr,
195 .src_data_width = data_width,
196 .dst_data_width = data_width,
197 .src_addr = (void *) &base->RBR,
198 .dst_addr = dst_addr,
199 .int_en = true
200 };
201
202 DMA_InitMultiblockDescriptor(desc, &config);
203}
204
205#if defined(__cplusplus)
206}
207#endif
208
209#endif /* HAL_UART_DMA_H */
210
void DMA_InitMultiblockDescriptor(dma_descriptor_t *desc, dma_multiblock_config_t *config)
Функция, инициализирующая DMA дескрипторы многоблочной передачи.
@ DMA_NoChange
Definition hal_dma.h:165
@ DMA_Incr
Definition hal_dma.h:163
@ DMA_PeripheralToMemory_DMA
Definition hal_dma.h:213
@ DMA_MemoryToPeripheral_DMA
Definition hal_dma.h:212
@ DMA_BurstSize1
Definition hal_dma.h:149
@ DMA_BurstSize32
Definition hal_dma.h:153
static void UART_DMADescriptorInitTX(UART_Type *base, dma_descriptor_t *desc, uint32_t count, uint32_t data_size, uint32_t data_width, void *src_addr)
Инициализация дескрипторов DMA для многоблочной передачи TX.
Definition hal_uart_dma.h:147
enum uart_status UART_TransferSendDMA(UART_Type *base, uart_dma_handle_t *handle, struct uart_transfer *xfer)
Функция осуществляющая передачу данных по UART, данные в буфер попадают через DMA канал
static void UART_WaitWhileActive(UART_Type *base)
Ожидание завершения передачи. Выход из функции будет осуществлен по окончании UART транзакций
Definition hal_uart_dma.h:131
void UART_TransferAbortSendDMA(UART_Type *base, uart_dma_handle_t *handle)
Функция прерывающая передачу данных между UART(TX) и DMA.
static void UART_DMADescriptorInitRX(UART_Type *base, dma_descriptor_t *desc, uint32_t count, uint32_t data_size, uint32_t data_width, void *dst_addr)
Инициализация дескрипторов DMA для многоблочной передачи TX.
Definition hal_uart_dma.h:181
enum uart_status UART_TransferReceiveDMA(UART_Type *base, uart_dma_handle_t *handle, struct uart_transfer *xfer)
Функция осуществляющая передачу данных по UART, данные в буфер попадают через DMA канал
void UART_TransferCreateHandleDMA(UART_Type *base, uart_dma_handle_t *handle, uart_dma_transfer_callback_t callback, void *user_data, dma_handle_t *tx_dma_handle, dma_handle_t *rx_dma_handle)
Функция для инициализации полей дескриптора UART-DMA.
void UART_TransferAbortReceiveDMA(UART_Type *base, uart_dma_handle_t *handle)
Функция прерывающая передачу данных между UART(RX) и DMA.
void(* uart_dma_transfer_callback_t)(UART_Type *base, uart_dma_handle_t *handle, enum uart_status status, void *user_data)
Функция обратного вызова
Definition hal_uart_dma.h:27
uart_status
Статусы драйвера UART.
Definition hal_uart.h:45
Интерфейс драйвера прямого доступа к памяти
Интерфейс драйвера UART.
Описатель следующего блока DMA (LLI)
Definition hal_dma.h:222
Управляющая структура передачи
Definition hal_dma.h:296
Конфигурация многоблочной передачи
Definition hal_dma.h:306
uint32_t count
Definition hal_dma.h:307
Дескриптор UART-DMA передачи
Definition hal_uart_dma.h:35
volatile uint8_t rx_state
Definition hal_uart_dma.h:50
uint32_t rx_data_size_all
Definition hal_uart_dma.h:40
UART_Type * base
Definition hal_uart_dma.h:36
dma_handle_t * rx_dma_handle
Definition hal_uart_dma.h:44
dma_handle_t * tx_dma_handle
Definition hal_uart_dma.h:43
uint32_t tx_data_size_all
Definition hal_uart_dma.h:41
void * user_data
Definition hal_uart_dma.h:39
volatile uint8_t tx_state
Definition hal_uart_dma.h:49
uart_dma_transfer_callback_t callback
Definition hal_uart_dma.h:38
Указатель на буфер приема или передачи
Definition hal_uart.h:193