cancel
Showing results for 
Search instead for 
Did you mean: 

How to Reset the DMA receiving buffer

Raider E
Associate III
Posted on January 23, 2017 at 00:31

I am not dealing with continuous streaming of data, I just send a command to the connected device and wait a reply on the UART using DMA. Now using DMA I can only start seeing data after a while, say 1sec!!. I I liteerally added a hal_delay(1000) before I start processing data.

If I use normal reception without DMA it works instantly and dont have to wait!!, but the problem is I am afraid to lose some data if the process was interrupted or something.One more thing,

I would like also to reset the DMA buffer after every reception but not sure how to do so and is there a way to check if reception is complete with DMA, (i.e., no more bytes are coming). I am using the HAL library and put DMA in a circular mode.

 HAL_UART_Receive_DMA(&huart1, (uint8_t *)&rxbytes, 100);
// HAL_UART_Receive(huart, (uint8_t *)rxbytes, 32,100);
Uart settings:
/**
 ******************************************************************************
 * File Name : USART.c
 * Description : This file provides code for the configuration
 * of the USART instances.
 ******************************************************************************
 *
 * Copyright (c) 2017 STMicroelectronics International N.V. 
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted, provided that the following conditions are met:
 *
 * 1. Redistribution of source code must retain the above copyright notice, 
 * this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 * 3. Neither the name of STMicroelectronics nor the names of other 
 * contributors to this software may be used to endorse or promote products 
 * derived from this software without specific written permission.
 * 4. This software, including modifications and/or derivative works of this 
 * software, must execute solely and exclusively on microcontroller or
 * microprocessor devices manufactured by or for STMicroelectronics.
 * 5. Redistribution and use of this software other than as permitted under 
 * this license is void and will automatically terminate your rights under 
 * this license. 
 *
 * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS 'AS IS' 
 * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
 * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
 * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
 * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 ******************************************************************************
 */
/* Includes ------------------------------------------------------------------*/
#include 'usart.h'
#include 'gpio.h'
#include 'dma.h'
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
UART_HandleTypeDef huart1;
DMA_HandleTypeDef hdma_usart1_rx;
DMA_HandleTypeDef hdma_usart1_tx;
/* USART1 init function */
void MX_USART1_UART_Init(void)
{
 huart1.Instance = USART1;
 huart1.Init.BaudRate = 38400;
 huart1.Init.WordLength = UART_WORDLENGTH_8B;
 huart1.Init.StopBits = UART_STOPBITS_1;
 huart1.Init.Parity = UART_PARITY_NONE;
 huart1.Init.Mode = UART_MODE_TX_RX;
 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 huart1.Init.OverSampling = UART_OVERSAMPLING_16;
 huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
 huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXOVERRUNDISABLE_INIT|UART_ADVFEATURE_DMADISABLEONERROR_INIT;
 huart1.AdvancedInit.OverrunDisable = UART_ADVFEATURE_OVERRUN_DISABLE;
 huart1.AdvancedInit.DMADisableonRxError = UART_ADVFEATURE_DMA_DISABLEONRXERROR;
 if (HAL_UART_Init(&huart1) != HAL_OK)
 {
 Error_Handler();
 }
}
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
 GPIO_InitTypeDef GPIO_InitStruct;
 if(uartHandle->Instance==USART1)
 {
 /* USER CODE BEGIN USART1_MspInit 0 */
 /* USER CODE END USART1_MspInit 0 */
 /* Peripheral clock enable */
 __HAL_RCC_USART1_CLK_ENABLE();
 
 /**USART1 GPIO Configuration 
 PB14 ------> USART1_TX
 PB15 ------> USART1_RX 
 */
 GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 /* Peripheral DMA init*/
 
 hdma_usart1_rx.Instance = DMA2_Stream2;
 hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4;
 hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
 hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
 hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
 hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
 hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
 hdma_usart1_rx.Init.Mode = DMA_NORMAL;
 hdma_usart1_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
 hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
 if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK)
 {
 Error_Handler();
 }
 __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx);
 hdma_usart1_tx.Instance = DMA2_Stream7;
 hdma_usart1_tx.Init.Channel = DMA_CHANNEL_4;
 hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
 hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
 hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
 hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
 hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
 hdma_usart1_tx.Init.Mode = DMA_NORMAL;
 hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
 hdma_usart1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
 if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
 {
 Error_Handler();
 }
 __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);
 /* Peripheral interrupt init */
 HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
 HAL_NVIC_EnableIRQ(USART1_IRQn);
 /* USER CODE BEGIN USART1_MspInit 1 */
 /* USER CODE END USART1_MspInit 1 */
 }
}
void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{
 if(uartHandle->Instance==USART1)
 {
 /* USER CODE BEGIN USART1_MspDeInit 0 */
 /* USER CODE END USART1_MspDeInit 0 */
 /* Peripheral clock disable */
 __HAL_RCC_USART1_CLK_DISABLE();
 
 /**USART1 GPIO Configuration 
 PB14 ------> USART1_TX
 PB15 ------> USART1_RX 
 */
 HAL_GPIO_DeInit(GPIOB, GPIO_PIN_14|GPIO_PIN_15);
 /* Peripheral DMA DeInit*/
 HAL_DMA_DeInit(uartHandle->hdmarx);
 HAL_DMA_DeInit(uartHandle->hdmatx);
 /* Peripheral interrupt Deinit*/
 HAL_NVIC_DisableIRQ(USART1_IRQn);
 }
 /* USER CODE BEGIN USART1_MspDeInit 1 */
 /* USER CODE END USART1_MspDeInit 1 */
} 
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/**
 * @}
 */
/**
 * @}
 */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?

thank you.

0 REPLIES 0