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

Передача на USART ч/з DMA

Подскажите, кто знает... 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 заполняются верно - я это вижу в отладчике. А передача не стартует...

В чём я не прав? Чёто всю голову сломал...

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


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

Согласно табличке Table 35. DMA1 request mapping в RM: UART2_TX это стрим 6, канал 4, а UART3_TX это стрим 3 канал 4.

А у вас каналы/стримы какие-то левые.

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


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

Согласно табличке Table 35. DMA1 request mapping в RM: UART2_TX это стрим 6, канал 4, а UART3_TX это стрим 3 канал 4.

А у вас каналы/стримы какие-то левые.

Спасибо. Уже сам разобрался. Весь мозг сломал.

Сначала написал обработчик ч/з прерывание. Тоже не работает. ))

Я включил RTS/CTS, а програмка тестовая не управляла потоком. )) В результате передача не работала.

Убрал управление потоком (для тестирования). Ну думаю, всё покатит. )) Не тут то было.

В конце концов стал соображать, а как USART указывает DMA, что кадо забирать байт ... ну и вышел на таблицу.

Оказывается мне надо 2 DMA задействовать..

Всем спасибо

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


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

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

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

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

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

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

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

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

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

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