Использую передачу данных usart-> dma и обратно. Передача работает с прерываниями проблем нет . Прием хочу сделать без прерываний в режиме DMA_Mode_Circular. Все настроил отправляю данные с пк функция DMA_GetCurrDataCounter в цикле возвращает правильное количество принятых байт. Отправляю полученный буфер обратно на пк приходят нули. Думал что что то напутал с указателями,для проверки приемный буфер в начале инициализации заполнил memset(bufreceiver,0x10,255) . Отправляю с ПК данные в stm32f4 ,он возвращает принятый буфер заполненный 0x10; Получается что dma ничего в него не записала. Наверно что то упустил, на что обратить внимание?
CODE
void*ReceiveBuff485dma;
ReceiveBuff485dma = (uint8_t*) calloc(DMA_BUFFER_SIZE_RECEIVE_RS485,sizeof(uint8_t));
memset(ReceiveBuff485dma,0x10,DMA_BUFFER_SIZE_RECEIVE_RS485);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
DMA_InitTypeDef dma;
DMA_StructInit(&dma);
dma.DMA_PeripheralBaseAddr = (uint32_t)&(USART3->DR);
dma.DMA_Memory0BaseAddr = (uint32_t)ReceiveBuff485dma;
dma.DMA_DIR = DMA_DIR_PeripheralToMemory;
dma.DMA_BufferSize = DMA_BUFFER_SIZE_RECEIVE_RS485;
dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
dma.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
dma.DMA_Channel = DMA_Channel_4;
dma.DMA_Mode = DMA_Mode_Circular;
DMA_Init(DMA1_Stream1, &dma);
USART_Cmd(USART3, ENABLE);
USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);
DMA_Cmd(DMA1_Stream1, ENABLE);
///**********cycl*
while(DMA_GetFlagStatus(DMA1_Stream1, DMA_FLAG_TCIF1) == RESET);
DMA_ClearFlag(DMA1_Stream1, DMA_FLAG_HTIF1 | DMA_FLAG_TCIF1);
contdatareceive = DMA_GetCurrDataCounter(DMA1_Stream1);
DMA_Cmd(DMA1_Stream1, DISABLE);
//USART_SendData(USART3,contdatareceive);//для проверки отправляет правильное число байт
if((DMA_BUFFER_SIZE_RECEIVE_RS485 - contdatareceive)>1){
for(ii = 0; ii<255; ii++){USART_SendData(USART3,*((uint8_t*)ReceiveBuff485dma+ii)); while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);}
//здесь должны быть отправлены полученные данные а уходят то что записывает в начале инициализации memset. Dma ничего не записывает в ReceiveBuff485dma.
}
DMA_SetCurrDataCounter(DMA1_Stream1,DMA_BUFFER_SIZE_RECEIVE_RS485);
DMA_Cmd(DMA1_Stream1, ENABLE);
//*****cycl
Сообщение отредактировал IgorKossak - May 6 2015, 16:33
Причина редактирования: [codebox] для длинного кода, [code] - для короткого