cancel
Showing results for 
Search instead for 
Did you mean: 

usart dma - receive

arunl4g
Associate II
Posted on July 06, 2015 at 13:36

hej, 

can anyone tell me why dma is  not working?...but the usart works...

volatile uint8_t Buffer[32];

uint8_t receiveword;

/**************************************************************************************/

void gpio_Usart()

{

//enable the usart

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);

//enabling the port for usart6

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 |GPIO_Pin_7;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;

GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;

GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_UP;

GPIO_Init(GPIOC, &GPIO_InitStruct);

GPIO_PinAFConfig(GPIOC, GPIO_PinSource6 , GPIO_AF_USART6);

GPIO_PinAFConfig(GPIOC, GPIO_PinSource7 , GPIO_AF_USART6);

//enable usart configuration

USART_InitTypeDef USART_InitStruct;

USART_InitStruct.USART_BaudRate = 9600;

USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ;

USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;;

USART_InitStruct.USART_Parity = USART_Parity_No;

USART_InitStruct.USART_StopBits = USART_StopBits_1;

USART_InitStruct.USART_WordLength = USART_WordLength_8b;

USART_Init(USART6, &USART_InitStruct);

//enable usart

USART_Cmd( USART6, ENABLE);

//clock for leds

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

//GPIO intialization for leds

GPIO_InitTypeDef GPIO_IntStruct;

GPIO_IntStruct.GPIO_Mode = GPIO_Mode_OUT;

GPIO_IntStruct.GPIO_OType = GPIO_OType_PP ;

GPIO_IntStruct.GPIO_Pin = GPIO_Pin_12 |GPIO_Pin_13 |GPIO_Pin_14 |GPIO_Pin_15 ;

GPIO_IntStruct.GPIO_PuPd = GPIO_PuPd_UP ;

GPIO_IntStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_IntStruct);

}

/**************************************************************************************/

void DMA_Nvic_Configuration(void)

{

//clock for dma

RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA2, ENABLE);

DMA_DeInit(DMA2_Stream1);

DMA_InitTypeDef DMA_InitStruct;

DMA_InitStruct.DMA_Channel = DMA_Channel_5;

DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory; // Receive

DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)Buffer;

DMA_InitStruct.DMA_BufferSize = (uint16_t)sizeof(Buffer);

DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&USART6->DR;

DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;

DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;

DMA_InitStruct.DMA_Priority = DMA_Priority_High;

DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Enable;

DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;

DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;

DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

DMA_Init(DMA2_Stream1, &DMA_InitStruct);

//enable dma2

DMA_Cmd(DMA2_Stream1, ENABLE);

//usart request

USART_DMACmd(USART6, USART_DMAReq_Rx, ENABLE);

//enable the dma interrupt

DMA_ITConfig(DMA2_Stream1, DMA_IT_TC | DMA_IT_HT, ENABLE);

//enable interrupt for dma

NVIC_InitTypeDef NVIC_InitStruct;

NVIC_InitStruct.NVIC_IRQChannel                   = DMA2_Stream1_IRQn; 

NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStruct.NVIC_IRQChannelSubPriority        = 1;

NVIC_InitStruct.NVIC_IRQChannelCmd                = ENABLE;

NVIC_Init(&NVIC_InitStruct);

}

void DMA2_Stream1_IRQHandler(void)

{

  /* Test on DMA Stream Transfer Complete interrupt */

  if (DMA_GetITStatus(DMA2_Stream1, DMA_IT_TCIF1))

  {

    /* Clear DMA Stream Transfer Complete interrupt pending bit */

    DMA_ClearITPendingBit(DMA2_Stream1, DMA_IT_TCIF1);

    GPIO_SetBits(GPIOD, GPIO_Pin_12);

  }

  /* Test on DMA Stream Half Transfer interrupt */

  if (DMA_GetITStatus(DMA2_Stream1, DMA_IT_HTIF1))

  {

    /* Clear DMA Stream Half Transfer interrupt pending bit */

    DMA_ClearITPendingBit(DMA2_Stream1, DMA_IT_HTIF1);

    GPIO_SetBits(GPIOD, GPIO_Pin_13);

  }

}

void receiveUsart()

{

while(USART_GetFlagStatus(USART6, USART_FLAG_RXNE) != SET);

receiveword = USART6->DR;

}

int main(void)

{

int decremt = 32;

printf(''decremt %d\n'', decremt);

gpio_Usart();

DMA_Nvic_Configuration();

while(decremt)

{

receiveUsart();

printf(''receiveword %c\n'', receiveword);

decremt--;

}

return 0;

}

8 REPLIES 8
Amel NASRI
ST Employee
Posted on July 06, 2015 at 15:42

Hi m.dums,

What do you mean by ''DMA is not working but USART is woking''?

How did you checked this?

-Mayla-

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.

arunl4g
Associate II
Posted on July 06, 2015 at 15:51

i checked usart seperately by toggling the bits  and print the characters in semihosting. but half transfer and full transfer interrupt is not trigerring ....

Do you know why ?
Posted on July 06, 2015 at 16:01

May be you should have the IRQ toggle the LED's

Not sure you're going to see RXNE if the DMA is servicing it correctly.

Don't exit main(), only bad things can happen.

Tips, buy me a coffee, or three.. PayPal Venmo Up vote any posts that you find helpful, it shows what's working..
jpeacock
Associate II
Posted on July 06, 2015 at 19:49

Don't poll RXNE, don't enable the RXNE interrupt and most important of all DO NOT read the DR register when DMA is enabled.  The DMA controller will trigger on the RXNE and read DR; you are interfering with the DMA hardware 

In the DMA IRQ handler you also need to check for errors.  If DMA stops the error flags will tell you why.

  Jack Peacock
Amel NASRI
ST Employee
Posted on July 07, 2015 at 10:42

Hi,

I suggest you have a look to the example in the standard library (For STM32F4), folder: Project\STM32F4xx_StdPeriph_Examples\USART\USART_TwoBoards\USART_DataExchangeDMA.

It may bring you some help.

-Mayla-

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.

arunl4g
Associate II
Posted on July 07, 2015 at 11:58

clive, i ahve tried what u told. but its not even going to interrupt handlar..

any idea to solve?
Posted on July 07, 2015 at 14:11

Want to enable the DMA2 clock, not reset it

RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA2, ENABLE);

Tips, buy me a coffee, or three.. PayPal Venmo Up vote any posts that you find helpful, it shows what's working..
arunl4g
Associate II
Posted on July 07, 2015 at 15:24

copied wrongly from coocox ....did not notice properly...

now it works....

thank you 🙂