Перейти к содержанию
    

STM32F4 DMA1, RAM<->USART

Всем привет!

Хочу использовать 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);

Запуск приводит к вису и аварийному выходу по системному таймеру. Ни один из флагов у дма не поднят. Не понимаю что вообще происходит. Где я ошибся?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...