реклама на сайте
подробности

 
 
> Передача на USART ч/з DMA, что-то не стартует.
SasaVitebsk
сообщение Sep 17 2013, 06:24
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Подскажите, кто знает... 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 следующим образом ...
CODE

// Передача в 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 заполняются верно - я это вижу в отладчике. А передача не стартует...
В чём я не прав? Чёто всю голову сломал...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
Flexz
сообщение Sep 17 2013, 08:51
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Согласно табличке Table 35. DMA1 request mapping в RM: UART2_TX это стрим 6, канал 4, а UART3_TX это стрим 3 канал 4.
А у вас каналы/стримы какие-то левые.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 17 2013, 09:49
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Flexz @ Sep 17 2013, 11:51) *
Согласно табличке Table 35. DMA1 request mapping в RM: UART2_TX это стрим 6, канал 4, а UART3_TX это стрим 3 канал 4.
А у вас каналы/стримы какие-то левые.

Спасибо. Уже сам разобрался. Весь мозг сломал.
Сначала написал обработчик ч/з прерывание. Тоже не работает. ))
Я включил RTS/CTS, а програмка тестовая не управляла потоком. )) В результате передача не работала.
Убрал управление потоком (для тестирования). Ну думаю, всё покатит. )) Не тут то было.
В конце концов стал соображать, а как USART указывает DMA, что кадо забирать байт ... ну и вышел на таблицу.
Оказывается мне надо 2 DMA задействовать..
Всем спасибо
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 22:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01383 секунд с 7
ELECTRONIX ©2004-2016