cancel
Showing results for 
Search instead for 
Did you mean: 

DMA USART Tranmission Problem

blue_dolphin1987
Associate II
Posted on December 05, 2013 at 10:38

Hi .

I am new to MCU programming and i am working on stm32f103 . I am trying to allow usart communication via dma . I have modify the code for the STM3210E_EVAL.

int main(void)
{
/* System Clocks Configuration */
RCC_Configuration();
/* NVIC configuration */
NVIC_Configuration();
/* Configure the GPIO ports */
GPIO_Configuration();
/* Configure the DMA */
DMA_Configuration();
/* USARTy and USARTz configuration -------------------------------------------*/
/* USARTy and USARTz 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 = 9600;
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;
/* Configure USARTy */
USART_Init(USARTy, &USART_InitStructure);
/* Configure USARTz */
USART_Init(USARTz, &USART_InitStructure);
/* Enable USARTy DMA TX request */
USART_DMACmd(USARTy, USART_DMAReq_Tx, ENABLE);
/* Enable USARTz DMA TX request */
USART_DMACmd(USARTz, USART_DMAReq_Tx, ENABLE);
/* Enable the USARTz Receive Interrupt */
USART_ITConfig(USARTz, USART_IT_RXNE, ENABLE);
/* Enable USARTy */
USART_Cmd(USARTy, ENABLE);
/* Enable USARTz */
USART_Cmd(USARTz, ENABLE);
/* Enable USARTy DMA TX Channel */
DMA_Cmd(USARTy_Tx_DMA_Channel, ENABLE);
/* Enable USARTz DMA TX Channel */
DMA_Cmd(USARTz_Tx_DMA_Channel, ENABLE);
/* Receive the TxBuffer2 */
while(index < TxBufferSize2)
{
while(USART_GetFlagStatus(USARTy, USART_FLAG_RXNE) == RESET)
{
}
RxBuffer1[index++] = USART_ReceiveData(USARTy); 
}
/* Wait until USARTy TX DMA1 Channel Transfer Complete */
while (DMA_GetFlagStatus(USARTy_Tx_DMA_FLAG) == RESET)
{
}
/* Wait until USARTz TX DMA1 Channel Transfer Complete */
while (DMA_GetFlagStatus(USARTz_Tx_DMA_FLAG) == RESET)
{
}
while (1)
{
}
}
/**
* @brief Configures the different system clocks.
* @param None
* @retval None
*/
void RCC_Configuration(void)
{ 
/* DMA clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* Enable GPIO clock */
RCC_APB2PeriphClockCmd(USARTy_GPIO_CLK | USARTz_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE);
/* Enable USARTy Clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); 
/* Enable USARTz Clock */
RCC_APB1PeriphClockCmd(USARTz_CLK, ENABLE); 
}
/**
* @brief Configures the different GPIO ports.
* @param None
* @retval None
*/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure USARTy Rx as input floating */
GPIO_InitStructure.GPIO_Pin = USARTy_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);
/* Configure USARTz Rx as input floating */
GPIO_InitStructure.GPIO_Pin = USARTz_RxPin;
GPIO_Init(USARTz_GPIO, &GPIO_InitStructure); 
/* Configure USARTy Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = USARTy_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);
/* Configure USARTz Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = USARTz_TxPin;
GPIO_Init(USARTz_GPIO, &GPIO_InitStructure); 
}
/**
* @brief Configures the nested vectored interrupt controller.
* @param None
* @retval None
*/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the USARTz Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USARTz_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**
* @brief Configures the DMA.
* @param None
* @retval None
*/
void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
/* USARTy_Tx_DMA_Channel (triggered by USARTy Tx event) Config */
DMA_DeInit(USARTy_Tx_DMA_Channel);
DMA_InitStructure.DMA_PeripheralBaseAddr = USARTy_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)TxBuffer1;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = TxBufferSize1;
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_M2M = DMA_M2M_Disable;
DMA_Init(USARTy_Tx_DMA_Channel, &DMA_InitStructure);
/* USARTz_Tx_DMA_Channel (triggered by USARTz Tx event) Config */
DMA_DeInit(USARTz_Tx_DMA_Channel);
DMA_InitStructure.DMA_PeripheralBaseAddr = USARTz_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)TxBuffer2;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = TxBufferSize2;
DMA_Init(USARTz_Tx_DMA_Channel, &DMA_InitStructure);
}

I am able to receive and send the data on program startup. How can i build on this example to continuous ad-hoc send and receive data . I read that we can use dma by just writing and reading the buffer defined on DMA initalization. I tried writing directly to the tx_buffer but the data is not transmitted. I tried using :

while(USART_GetFlagStatus(USARTz, USART_FLAG_TXE) == RESET); // Wait for Empty
USART_SendData(USARTz, 'w');

and it works . But is this still DMA transfer ? Thanks for all help.
0 REPLIES 0