Shivers 0 17 апреля, 2012 Опубликовано 17 апреля, 2012 · Жалоба Всем привет! Хочу использовать DMA1 в связке с USART2 для работы с DS18b20 (1-wire). Для этого взял в качестве примера работающую либу для STM32L ( здесь ) и переделал. Результат: наглухо виснет попытка вызвать DMA. USART сам по себе работает, проверял на сбросе 1-wire. Но для обмена по шине хочется использовать дма. //объявление буферов на прием и передачу uint8_t ow_rx[8]; uint8_t ow_tx[8]; //Частота для dma1 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); ... DMA_InitTypeDef DMA_InitStructure; //RX DMA reset DMA_DeInit(DMA1_Stream5); //For STM32F4 while (DMA_GetCmdStatus(DMA1_Stream5) != DISABLE) {} //DMA config DMA1, Channel 4, Stream 5: USART2_RX DMA_InitStructure.DMA_Channel = DMA_Channel_4; //For STM32F4 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &(USART2->DR); DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) ow_rx; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = num_bytes; 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_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream5, &DMA_InitStructure); //TX DMA reset DMA_DeInit(DMA1_Stream6); //For STM32F4 while (DMA_GetCmdStatus(DMA1_Stream6) != DISABLE) {} //DMA config DMA1, Channel 4, Stream 6: USART2_TX DMA_InitStructure.DMA_Channel = DMA_Channel_4; //For STM32F4 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &(USART2->DR); DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) ow_tx; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize = num_bytes; 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_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream6, &DMA_InitStructure); //чистим буфер, флаги, и запускаем USART_ReceiveData(USART2); //clear RX Buffer USART_ClearFlag(USART2, USART_FLAG_RXNE | USART_FLAG_TC | USART_FLAG_TXE); USART_DMACmd(USART2, USART_DMAReq_Tx | USART_DMAReq_Rx, ENABLE); DMA_Cmd(DMA1_Stream5, ENABLE); DMA_Cmd(DMA1_Stream6, ENABLE); // Ставим системный таймаут, ждем выхода из дма OW_TimeOut = ((uint32_t)0x100); while ((DMA_GetFlagStatus(DMA1_Stream5, DMA_FLAG_TCIF4 | DMA_FLAG_HTIF4 | DMA_FLAG_TEIF4 | DMA_FLAG_DMEIF4 | DMA_FLAG_FEIF4) == RESET) && (OW_TimeOut != 0)) { } if(OW_TimeOut == 0) printf("\r\n DMA Timed Out, ERROR"); //debug if((DMA_GetFlagStatus(DMA1_Stream5, DMA_FLAG_TEIF4) == SET)) printf("\r\n Streamx transfer complete flag"); //debug if((DMA_GetFlagStatus(DMA1_Stream5, DMA_FLAG_HTIF4) == SET)) printf("\r\n half transfer complete flag"); //debug if((DMA_GetFlagStatus(DMA1_Stream5, DMA_FLAG_TEIF4) == SET)) printf("\r\n transfer error flag"); //debug if((DMA_GetFlagStatus(DMA1_Stream5, DMA_FLAG_DMEIF4) == SET)) printf("\r\n direct mode error flag"); //debug if((DMA_GetFlagStatus(DMA1_Stream5, DMA_FLAG_FEIF4) == SET)) printf("\r\n FIFO error flag"); //debug // disable DMA DMA_Cmd(DMA1_Stream6, DISABLE); DMA_Cmd(DMA1_Stream5, DISABLE); USART_DMACmd(USART2, USART_DMAReq_Tx | USART_DMAReq_Rx, DISABLE); Запуск приводит к вису и аварийному выходу по системному таймеру. Ни один из флагов у дма не поднят. Не понимаю что вообще происходит. Где я ошибся? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться