cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F207 Usart DMA RX Interrupt

momede
Associate II
Posted on April 26, 2012 at 21:20

dear all,

I'm working with the microcontroller STM32F207, below there is my function to configure the DMA in order to acquire 3 characters from USART2 and have the interrupt when those 3 characters arrived.

Unfortunately there is something wrong because the interrupt isn't ever enabled.

Someone can suggest a solution on this issue?

many thanks for your help

regards

#define RXBUFFERSIZE

3;

uint8_t RxBuffer[RXBUFFERSIZE];

void USART2_DMA_Config (void)

{

  USART_InitTypeDef USART_InitStructure;

  GPIO_InitTypeDef GPIO_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

  DMA_InitTypeDef  DMA_InitStructure;

  /* USARTx configured as follow:

        - BaudRate = 230400 baud  

        - Word Length = 8 Bits

        - One Stop Bit

        - No parity

        - Hardware flow control disabled (RTS and CTS signals)

        - Receive and transmit enabled

  */

  USART_InitStructure.USART_BaudRate = 230400;

  USART_InitStructure.USART_WordLength = 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(USART2, &USART_InitStructure);

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);

  /* DMA USART2 Configuration */

  DMA_DeInit(DMA1_Stream5);

  DMA_Cmd(DMA1_Stream5, DISABLE);

  DMA_InitStructure.DMA_PeripheralBaseAddr = ((uint32_t)USART2 + 0x04);

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;

  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;

  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;

  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;

  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

  DMA_InitStructure.DMA_Channel = DMA_Channel_4;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;  

  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)RxBuffer;

  DMA_InitStructure.DMA_BufferSize = (uint16_t)3;

  DMA_Init(DMA1_Stream5, &DMA_InitStructure);

 

  /* Enable the DMA Stream */

  DMA_Cmd(DMA1_Stream5, ENABLE);

 

  USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);

 

  /* Enable GPIO clock */

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

 

  /* Enable UART clock */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

                                              

  /* Connect PXx to USARTx_Tx*/

  GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2);

  /* Connect PXx to USARTx_Rx*/

  GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART2);

  /* Configure USART Tx as alternate function  */

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOD, &GPIO_InitStructure);

 

  /* Configure USART Rx as alternate function  */

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /* Enable the USARTx Interrupt */

  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

    

  /* Enable USART */

  USART_Cmd(USART2, ENABLE);

  DMA_ITConfig(DMA1_Stream5, DMA_IT_TC, ENABLE);

}
2 REPLIES 2
Posted on April 26, 2012 at 22:11

Rule#1 of synchronous logic, always enable the clocks before initializing the hardware that depends on them.

This needs to occur much earlier in the code :

/* Enable UART clock */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
hzrnbgy
Associate II
Posted on May 02, 2012 at 14:05

try using direct mode instead of the DMA FIFO and enable DMA TC interrupt so any received character is drained right away to the memory buffer and trigger the interrupt once the third char is transferred