2017-08-14 08:23 AM
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 4static 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
Solved! Go to Solution.
2017-08-14 08:57 AM
You enable the DMA1 clock someplace?
2017-08-14 08:26 AM
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); }/**/2017-08-14 08:57 AM
You enable the DMA1 clock someplace?
2017-08-16 03:11 AM
Nice thank you Clive One!! Now it beginning to work
:)