29 #define stdout _LLIO_STDOUT 49 #define RECEIVE_QUEUE_SIZE NUCLEO_UARTx_RX_QUEUE_SIZE 50 #define TRANSMIT_QUEUE_SIZE NUCLEO_UARTx_TX_QUEUE_SIZE 52 #define UART_ENTER_CRITICAL() __disable_irq() 53 #define UART_EXIT_CRITICAL() __enable_irq() 55 uint8_t rxQ[RECEIVE_QUEUE_SIZE];
58 volatile uint16_t rxUsed = 0;
59 UART_HandleTypeDef huart;
60 DMA_HandleTypeDef dma_handle_rx,dma_handle_tx;
62 uint8_t txQ[TRANSMIT_QUEUE_SIZE];
65 volatile uint16_t txUsed = 0,txLastRequest=0;
66 uint8_t dmaTransmitting = 0;
81 static void prepareDmaTx(
void);
90 GPIO_InitTypeDef GPIO_InitStructure;
92 NUCLEO_UARTx_GPIO_CLK_ENABLE();
93 NUCLEO_UARTx_CLK_ENABLE();
94 NUCLEO_UARTx_DMA_CLK_ENABLE();
97 #ifdef USE_STM32F4XX_NUCLEO 98 dma_handle_rx.Instance = NUCLEO_UARTx_RX_DMA_STREAM;
99 dma_handle_rx.Init.Channel = NUCLEO_UARTx_RX_DMA_CHANNEL;
101 dma_handle_rx.Instance = NUCLEO_UARTx_RX_DMA_CHANNEL;
105 #ifdef USE_STM32L0XX_NUCLEO 106 dma_handle_rx.Init.Request=NUCLEO_UARTx_RX_DMA_REQUEST;
108 dma_handle_rx.Init.Direction=DMA_PERIPH_TO_MEMORY;
109 dma_handle_rx.Init.PeriphInc=DMA_PINC_DISABLE;
110 dma_handle_rx.Init.MemInc=DMA_MINC_ENABLE;
111 dma_handle_rx.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;
112 dma_handle_rx.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;
113 dma_handle_rx.Init.Mode=DMA_CIRCULAR;
114 dma_handle_rx.Init.Priority=DMA_PRIORITY_LOW;
115 HAL_DMA_Init(&dma_handle_rx);
117 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
118 GPIO_InitStructure.Pull = GPIO_PULLUP;
119 GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
121 GPIO_InitStructure.Pin = NUCLEO_UARTx_RX_PIN;
122 GPIO_InitStructure.Alternate = NUCLEO_UARTx_AF;
123 HAL_GPIO_Init(NUCLEO_UARTx_PORT, &GPIO_InitStructure);
125 GPIO_InitStructure.Pin = NUCLEO_UARTx_TX_PIN;
126 GPIO_InitStructure.Alternate = NUCLEO_UARTx_AF;
127 HAL_GPIO_Init(NUCLEO_UARTx_PORT, &GPIO_InitStructure);
130 huart.Init.BaudRate=SDK_EVAL_UART_BAUDRATE;
131 huart.Init.WordLength=UART_WORDLENGTH_8B;
132 huart.Init.StopBits=UART_STOPBITS_1;
133 huart.Init.Parity=UART_PARITY_NONE;
134 huart.Init.HwFlowCtl=UART_HWCONTROL_NONE;
135 huart.Init.Mode=UART_MODE_TX_RX;
136 __HAL_LINKDMA(&huart, hdmarx, dma_handle_rx);
138 #ifdef USE_STM32F4XX_NUCLEO 139 dma_handle_tx.Instance = NUCLEO_UARTx_TX_DMA_STREAM;
140 dma_handle_tx.Init.Channel = NUCLEO_UARTx_TX_DMA_CHANNEL;
142 dma_handle_tx.Instance = NUCLEO_UARTx_TX_DMA_CHANNEL;
146 #ifdef USE_STM32L0XX_NUCLEO 147 dma_handle_tx.Init.Request=NUCLEO_UARTx_TX_DMA_REQUEST;
149 dma_handle_tx.Init.Direction=DMA_MEMORY_TO_PERIPH;
150 dma_handle_tx.Init.PeriphInc=DMA_PINC_DISABLE;
151 dma_handle_tx.Init.MemInc=DMA_MINC_ENABLE;
152 dma_handle_tx.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;
153 dma_handle_tx.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;
154 dma_handle_tx.Init.Mode=DMA_NORMAL;
155 dma_handle_tx.Init.Priority=DMA_PRIORITY_HIGH;
156 HAL_DMA_Init(&dma_handle_tx);
158 __HAL_LINKDMA(&huart, hdmatx, dma_handle_tx);
160 huart.Instance=NUCLEO_UARTx;
162 HAL_UART_Init(&huart);
164 HAL_NVIC_EnableIRQ(NUCLEO_UARTx_TX_DMA_CHANNEL_IRQn);
165 HAL_NVIC_SetPriority(NUCLEO_UARTx_TX_DMA_CHANNEL_IRQn, NUCLEO_UARTx_PRIORITY, 0);
168 HAL_UART_Receive_DMA(&huart,rxQ,RECEIVE_QUEUE_SIZE);
170 HAL_NVIC_SetPriority(NUCLEO_UARTx_IRQn, NUCLEO_UARTx_PRIORITY-1, 0);
171 HAL_NVIC_EnableIRQ(NUCLEO_UARTx_IRQn);
176 void SdkEvalComTriggerTx(
void)
183 UART_ENTER_CRITICAL();
184 #ifdef USE_STM32F4XX_NUCLEO 185 uint16_t dmaResidual=huart.hdmatx->Instance->NDTR;
187 uint16_t dmaResidual=huart.hdmatx->Instance->CNDTR;
189 txTail=(txTail+(txLastRequest-dmaResidual))%TRANSMIT_QUEUE_SIZE;
190 txUsed-=(txLastRequest-dmaResidual);
191 txLastRequest=dmaResidual;
192 UART_EXIT_CRITICAL();
196 void enqueueTxChars(
const unsigned char * buffer, uint16_t size)
201 while(txUsed>TRANSMIT_QUEUE_SIZE-size)
206 UART_ENTER_CRITICAL();
207 txQ[txHead] = *buffer++;
209 txHead = (txHead+1) % TRANSMIT_QUEUE_SIZE;
211 UART_EXIT_CRITICAL();
217 void SdkEvalComBaudrate(uint32_t baudrate)
219 huart.Init.BaudRate=baudrate;
220 __HAL_UART_DISABLE(&huart);
221 HAL_UART_Init(&huart);
222 __HAL_UART_ENABLE(&huart);
227 void prepareDmaTx(
void)
229 if(!dmaTransmitting && txUsed!=0)
231 UART_ENTER_CRITICAL();
234 if(txTail+txUsed<TRANSMIT_QUEUE_SIZE)
236 txLastRequest=txUsed;
240 txLastRequest=(TRANSMIT_QUEUE_SIZE-txTail);
243 if(HAL_UART_Transmit_DMA(&huart,&txQ[txTail],txLastRequest)==HAL_OK)
248 UART_EXIT_CRITICAL();
255 size_t __write(
int handle,
const unsigned char * buffer,
size_t size)
260 if (handle != _LLIO_STDOUT && handle != _LLIO_STDERR) {
265 enqueueTxChars(&c,1);
271 enqueueTxChars(buffer,size);
277 size_t fflush(
int handle)
279 return __write(_LLIO_STDOUT, NULL, 0);
283 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
285 txTail=(txTail+txLastRequest)%TRANSMIT_QUEUE_SIZE;
286 txUsed-=txLastRequest;
294 void USART2_IRQHandler(
void)
296 HAL_UART_IRQHandler(&huart);
299 void NUCLEO_UARTx_TX_DMA_CHANNEL_IRQHandler(
void)
301 HAL_DMA_IRQHandler(huart.hdmatx);
303 #if defined(USE_STM32L0XX_NUCLEO) || defined(USE_STM32F0XX_NUCLEO) 304 HAL_DMA_IRQHandler(huart.hdmarx);
310 size_t __read(
int handle,
unsigned char * buffer,
size_t size)
316 if (handle != _LLIO_STDIN)
323 #ifdef USE_STM32F4XX_NUCLEO 324 rxHead=(RECEIVE_QUEUE_SIZE-huart.hdmarx->Instance->NDTR)%RECEIVE_QUEUE_SIZE;
326 rxHead=(RECEIVE_QUEUE_SIZE-huart.hdmarx->Instance->CNDTR)%RECEIVE_QUEUE_SIZE;
330 rxUsed=rxHead-rxTail;
332 rxUsed=RECEIVE_QUEUE_SIZE-rxTail+rxHead;
336 for(nChars = 0; (rxUsed>0) && (nChars < size); nChars++) {
337 *buffer++ = rxQ[rxTail];
338 rxTail = (rxTail+1) % RECEIVE_QUEUE_SIZE;
345 void enqueueRxChars(
unsigned char * buffer, uint16_t size)
347 while (( size > 0 ) && (rxUsed < (RECEIVE_QUEUE_SIZE-1))) {
348 rxQ[rxHead] = *buffer++;
349 rxHead = (rxHead+1) % RECEIVE_QUEUE_SIZE;
355 uint8_t __io_getcharNonBlocking(uint8_t *data)
357 if (__read(_LLIO_STDIN,data,1))
363 void __io_putchar(
char c )
365 __write(_LLIO_STDOUT, (
unsigned char *)&c, 1);
371 __read(_LLIO_STDIN, &c, 1);
375 void __io_flush(
void )
377 __write(_LLIO_STDOUT, NULL, 0);
380 uint8_t append_to_buf(
void)
384 HAL_UART_Receive(&huart, &c, 1, 100);
386 rxHead=(rxHead+1)%RECEIVE_QUEUE_SIZE;
389 if(c==
'\n' || c==
'\r')
This file contains SDK EVAL configuration and useful defines.
void SdkEvalComInit(void)
Configures UART port in DMA mode for both RX and TX.
This file contains definitions for Software Development Kit eval board COM ports.