Skip to main content
Greusard Alexandre
Associate
August 14, 2017
Solved

Configuration of DMA for USART-RX buffer

  • August 14, 2017
  • 3 replies
  • 1044 views
Posted on August 14, 2017 at 17:23

Hey there!

I'm working on stm32f051 MCU for a little project and a I  have to receive and process data from its USART port 1.

My issu is that

I don't have any interuption from the DMA

, and if I check directly on the buffer selected for the memory transfert there is also nothing in it.

But

I do receive informations

when I work with the USART directly ( from the USART1_IRQHandler() )

And I make DMA working fine with ADC.

I'm completly lost and going mad about this for to much time now.

I'd be glad to have any answer, and please tell me if you need any informations mere!

Here is my code:

#define USART_RX             GPIO_Pin_10

#define USART_TX             GPIO_Pin_9

#define USART_source_RX         GPIO_PinSource10

#define USART_source_TX         GPIO_PinSource9

#define USART_PERIPH                    USART1

#define USART_BAUDRATE                  115200

#define MSG_SIZE_MAX 50

static char msg[MSG_SIZE_MAX];

#define DMA_RX_BUFFER_SIZE          4

static uint8_t DMA_RX_Buffer[DMA_RX_BUFFER_SIZE];

static uint32_t Send_Byte (uint8_t c)

{

    while (USART_GetFlagStatus(USART_PERIPH, USART_FLAG_TXE) == RESET);

    USART_SendData(USART_PERIPH, c);

  return 0;

}

void SendPacket(uint8_t *data, uint16_t length)

{

  uint16_t i;

  i = 0;

  while (i < length)

  {

    Send_Byte(data[i]);

    i++;

  }

}

LeGreuch

    This topic has been closed for replies.
    Best answer by Tesla DeLorean
    Posted on August 14, 2017 at 17:57

    You enable the DMA1 clock someplace?

    3 replies

    Greusard Alexandre
    Associate
    August 14, 2017
    Posted on August 14, 2017 at 17:26

    Sory didn't finish my job, here is the rest of my code:

    void Setup_UART_DMA()

    {

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

            

        GPIO_InitTypeDef GPIO_InitStructure;

        USART_InitTypeDef USART_InitStructure;

        GPIO_PinAFConfig(GPIOA, USART_source_TX, GPIO_AF_1);

        GPIO_PinAFConfig(GPIOA, USART_source_RX, GPIO_AF_1);

        //Configure USART1 pins: Rx (PA2) and Tx (PA3)

        GPIO_InitStructure.GPIO_Pin = USART_RX | USART_TX;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

        GPIO_Init(GPIOA, &GPIO_InitStructure);

            

            

        //Configure USART2 setting: ----------------------------

        USART_InitStructure.USART_BaudRate = USART_BAUDRATE;

        USART_InitStructure.USART_WordLength = USART_WordLength_9b;//USART_WordLength_8b;

        USART_InitStructure.USART_StopBits = USART_StopBits_1;

        USART_InitStructure.USART_Parity = USART_Parity_No;

        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

        USART_Init(USART_PERIPH, &USART_InitStructure);

        

            // Enable RXNE interrupt

            //USART_ITConfig(USART_PERIPH, USART_IT_RXNE, ENABLE);

            

            // Enable USART1 global interrupt

            //NVIC_EnableIRQ(USART1_IRQn);

            

            DMA_DeInit(DMA1_Channel3);

              /* Configure DMA for USART RX, DMA1, Stream5, Channel4 */

            DMA_InitTypeDef DMA_InitStruct;

            DMA_StructInit(&DMA_InitStruct);

            DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&USART1->RDR;

            DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)DMA_RX_Buffer;

            DMA_InitStruct.DMA_BufferSize = DMA_RX_BUFFER_SIZE;

            DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC; // ou DMA_DIR_PeripheralDST ?

            DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

            DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//DMA_PeripheralDataSize_Byte;

            DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;

            DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

            DMA_Init(DMA1_Channel3, &DMA_InitStruct);

            

            USART_DMACmd(USART_PERIPH,USART_DMAReq_Rx,ENABLE);

            

            USART_Cmd(USART_PERIPH,ENABLE);

            

            DMA_Cmd(DMA1_Channel3, ENABLE);

            

            DMA_ITConfig(DMA1_Channel3, DMA_IT_TC,ENABLE);

            

            /* Enable global interrupts for DMA stream */

            NVIC_InitTypeDef NVIC_InitStruct;

            NVIC_InitStruct.NVIC_IRQChannel = DMA1_Channel2_3_IRQn;

            NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

            NVIC_InitStruct.NVIC_IRQChannelPriority = 0;

            NVIC_Init(&NVIC_InitStruct);

            

            

            NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);

    }

    void DMA1_Channel2_3_IRQHandler(void)

    {

        if(DMA_GetITStatus(DMA_ISR_TCIF3) != RESET)

        {

          while (USART_GetFlagStatus(USART_PERIPH, USART_FLAG_TXE) == RESET);

          sprintf(msg,'Transfer complete\r\n');

          SendPacket(msg, strlen(msg));

          DMA_ClearITPendingBit(DMA1_IT_GL3);

        }

        //while(USART_GetFlagStatus(USART_PERIPH, USART_FLAG_TXE) == RESET);  

    }/**/
    Tesla DeLorean
    Tesla DeLoreanBest answer
    Guru
    August 14, 2017
    Posted on August 14, 2017 at 17:57

    You enable the DMA1 clock someplace?

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    Greusard Alexandre
    Associate
    August 16, 2017
    Posted on August 16, 2017 at 10:11

    Nice thank you Clive One!! Now it beginning to work

    :)