SapegoAL 0 17 сентября, 2013 Опубликовано 17 сентября, 2013 · Жалоба Подскажите, кто знает... 10 раз уже всё проверял. Вроде всё правильно, а передача не стартует. Камень stm32f407 Инициализирую RCC RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_DMA1 | RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx | RCC_AHB1Periph_ETH_MAC_Rx | RCC_AHB1Periph_ETH_MAC_PTP, ENABLE); прерывания... // Прерывание по завершению DMA при передаче с USART 1 NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); Получаю пакет обычным способом, разбираю его и формирую ответ ... После чего пытаюсь отправить ответ посредством DMA следующим образом ... // Передача в nCOM. nCOM = 0, 1, 2. // Через DMA void vUSARTTransmit(uint32_t nCom) { DMA_Stream_TypeDef *DMA_Stream; uint32_t tmp; // Выбрать канал DMA // Остановить его на всякий случай // Очистить флаги // Выбрать канал // Инициализировать адрес периферии в DMA контроллере if(nCom == 1) { DMA_Stream = DMA1_Stream2; //DMA_Stream->CR &= ~DMA_SxCR_EN; DMA1->LIFCR = DMA_LIFCR_CTCIF2 | DMA_LIFCR_CHTIF2 | DMA_LIFCR_CTEIF2 | DMA_LIFCR_CDMEIF2 | DMA_LIFCR_CFEIF2; tmp = DMA_SxCR_CHSEL_1; // канал 2 DMA_Stream->PAR = (uint32_t)&USART2->DR; // USART 2 StatusCom->usart2rd = 1; USART2->CR3 |= USART_CR3_DMAT; // разрешить передачу USART2->SR = (uint16_t)~USART_SR_TC; } else if(nCom == 2) { DMA_Stream = DMA1_Stream3; //DMA_Stream->CR &= ~DMA_SxCR_EN; DMA1->LIFCR = DMA_LIFCR_CTCIF3 | DMA_LIFCR_CHTIF3 | DMA_LIFCR_CTEIF3 | DMA_LIFCR_CDMEIF3 | DMA_LIFCR_CFEIF3; tmp = DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0; // канал 3 DMA_Stream->PAR = (uint32_t)&USART3->DR; // USART 3 StatusCom->usart3rd = 1; USART3->CR3 |= USART_CR3_DMAT; // разрешить передачу USART3->SR = (uint16_t)~USART_SR_TC; } else { DMA_Stream = DMA1_Stream1; //DMA_Stream->CR &= ~DMA_SxCR_EN; DMA1->LIFCR = DMA_LIFCR_CTCIF1 | DMA_LIFCR_CHTIF1 | DMA_LIFCR_CTEIF1 | DMA_LIFCR_CDMEIF1 | DMA_LIFCR_CFEIF1; tmp = DMA_SxCR_CHSEL_0; // канал 1 DMA_Stream->PAR = (uint32_t)&USART1->DR; // USART 1 StatusCom->usart1rd = 1; USART1->CR3 |= USART_CR3_DMAT; // разрешить передачу USART1->SR = (uint16_t)~USART_SR_TC; } // FIFO is full DMA_Stream->FCR = DMA_SxFCR_FTH; // CR Memory & Peripheral single transfer, Priority level Medium, Peripheral increment PSIZE, Memory & Peripheral data size = byte // Memory increment, Peripheral no increment, не повторять, Memory-to-peripheral, Transfer complete interrupt enable, tmp |= DMA_SxCR_PL_0 | DMA_SxCR_MINC | DMA_SxCR_DIR_0 | DMA_SxCR_TCIE; DMA_Stream->CR = tmp; // Загрузить длину пакета DMA_Stream->NDTR = ComData[nCom].Tx.Ptr; // Указать буфер DMA_Stream->M0AR = (uint32_t)ComData[nCom].Tx.buf; // Запретить FIFO mode DMA_Stream->FCR = 0; // Разрешить работу DMA DMA_Stream->CR |= DMA_SxCR_EN; } Все регистры DMA заполняются верно - я это вижу в отладчике. А передача не стартует... В чём я не прав? Чёто всю голову сломал... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 17 сентября, 2013 Опубликовано 17 сентября, 2013 · Жалоба Согласно табличке Table 35. DMA1 request mapping в RM: UART2_TX это стрим 6, канал 4, а UART3_TX это стрим 3 канал 4. А у вас каналы/стримы какие-то левые. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 17 сентября, 2013 Опубликовано 17 сентября, 2013 · Жалоба Согласно табличке Table 35. DMA1 request mapping в RM: UART2_TX это стрим 6, канал 4, а UART3_TX это стрим 3 канал 4. А у вас каналы/стримы какие-то левые. Спасибо. Уже сам разобрался. Весь мозг сломал. Сначала написал обработчик ч/з прерывание. Тоже не работает. )) Я включил RTS/CTS, а програмка тестовая не управляла потоком. )) В результате передача не работала. Убрал управление потоком (для тестирования). Ну думаю, всё покатит. )) Не тут то было. В конце концов стал соображать, а как USART указывает DMA, что кадо забирать байт ... ну и вышел на таблицу. Оказывается мне надо 2 DMA задействовать.. Всем спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться