cancel
Showing results for 
Search instead for 
Did you mean: 

Cannot do DMA with USART Rx

stanzanim
Associate III
Posted on April 22, 2016 at 11:07

Hello community

I am having troubles when doing DMA with USART on an STM32F030. Thanks in advance to anybody will help.

Not sure if i did the homework correctly so I need someboody to check this

TMy application aims to receive one character at a time (DMA xfer size =1) @19200 baud/8b/no parity/1 start bit from a COBS coded stream. The ISR will add to a buffer asn soon as it synchronize with the SOH character.

I generated a Cube MX project and am doing as following with the HAL drivers

  HAL_Init();

  /* Configure the system clock */

  SystemClock_Config();

  

  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_DMA_Init(); // used by operating and maint and userInterface

  MX_ADC_Init();

  MX_TIM1_Init();

  MX_USART1_UART_Init();

uint8_t rxBuff;

  HAL_UART_Receive_DMA(&huart1, &rxBuff, sizeof(rxBuff)) ;

and in the xfer complete callback

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

  __HAL_UART_SEND_REQ(&huart1, UART_RXDATA_FLUSH_REQUEST); // Clear the buffer to prevent overrun

//  userInterface.interProcCommMgr();

//  HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&rxBuffer, 1);

}

The USART in Rx only and I am transmitting @19200/ 8b / no parity (checked with the scope) from another board

Here they are the MX_* function which initialize the peripherals

void MX_USART1_UART_Init(void)

{

  huart1.Instance = USART1;

  huart1.Init.BaudRate = 19200;

  huart1.Init.WordLength = UART_WORDLENGTH_8B;

  huart1.Init.StopBits = UART_STOPBITS_1;

  huart1.Init.Parity = UART_PARITY_NONE;

  huart1.Init.Mode = UART_MODE_RX;

  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart1.Init.OverSampling = UART_OVERSAMPLING_16;

  huart1.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED ;

  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

  HAL_UART_Init(&huart1);

}

void HAL_UART_MspInit(UART_HandleTypeDef* huart)

{

  GPIO_InitTypeDef GPIO_InitStruct;

  if(huart->Instance==USART1)

  {

  /* USER CODE BEGIN USART1_MspInit 0 */

  /* USER CODE END USART1_MspInit 0 */

    /* Peripheral clock enable */

    __USART1_CLK_ENABLE();

  

    /**USART1 GPIO Configuration    

    PA1     ------> USART1_DE

    PA2     ------> USART1_TX

    PA3     ------> USART1_RX 

    */

    GPIO_InitStruct.Pin = RS485_DE_Pin;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF1_USART1;

    HAL_GPIO_Init(RS485_DE_GPIO_Port, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF1_USART1;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* Peripheral DMA init*/

  

    hdma_usart1_rx.Instance = DMA1_Channel3;

    hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;

    hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;

    hdma_usart1_rx.Init.MemInc = DMA_MINC_DISABLE;

    hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;

    hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;

    hdma_usart1_rx.Init.Mode = DMA_CIRCULAR;

    hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;

    HAL_DMA_Init(&hdma_usart1_rx);

    __HAL_LINKDMA(huart,hdmarx,hdma_usart1_rx);

    /* Peripheral interrupt init*/

    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(USART1_IRQn);

  /* USER CODE BEGIN USART1_MspInit 1 */

  /* USER CODE END USART1_MspInit 1 */

  }

}

/** 

  * Enable DMA controller clock

  */

void MX_DMA_Init(void) 

{

  /* DMA controller clock enable */

  __DMA1_CLK_ENABLE();

  /* DMA interrupt init */

  HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);

  HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);

  HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0, 0);

  HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);

}

1 REPLY 1
stanzanim
Associate III
Posted on May 03, 2016 at 17:15

to whom who cares

- the posted code is ok

- it did not work since I was loading it on a discovery board with a different MCU than specified on my CUVE-MX ioc file, resulting in a different UART pins position

thanks