Например TDA7294

Форум РадиоКот • Просмотр темы - Параллельная работа нескольких каналов DMA
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Чт июл 18, 2019 13:44:21

Часовой пояс: UTC + 3 часа [ Летнее время ]


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Параллельная работа нескольких каналов DMA
СообщениеДобавлено: Ср апр 25, 2018 13:55:16 
Встал на лапы

Зарегистрирован: Сб янв 11, 2014 22:25:55
Сообщений: 100
Рейтинг сообщения: 0
Доброго времени суток! Возникла необходимость запустить 3 ЮСАРТА на STM32, желательно через DMA. С одним каналом нет проблем. Не понятно, как запустить параллельно несколько каналов. Это вообще возможно?
ПС. Собственно, на прерываниях тоже вполне устроит. Но пока не получается настроить. Код следующий:
Код:
//--- Конфиг USART1 _______
USART1->BRR = 0x88C;
USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE | USART_CR1_TCIE;
NVIC_SetPriority (USART1_IRQn, 2);
NVIC_EnableIRQ(USART1_IRQn);
//_______

void put_char_rs232(uint8_t data){
   while(!(USART1->SR & USART_SR_TC));
   
   USART1->DR = data;
}


void USART1_IRQHandler(){
   if (USART1->SR & USART_SR_RXNE){
      USART1->SR&=~USART_SR_RXNE;
      uart_data = USART1->DR;
   }

   if(USART1->SR & USART_SR_TC){
      USART1->SR&=~USART_SR_TC;
      if(UartAnswers--)   USART1->DR = 'S';
   }
}





В бесконечном цикле с частотой 10 Гц посылаю
Код:
UartAnswers = 2;
put_char_rs232('B');


В порт летит постоянно 0x28. Остальная программа не выполняется. Такое ощущение, что где-то не сброшены флаги.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельная работа нескольких каналов DMA
СообщениеДобавлено: Ср апр 25, 2018 14:09:04 
Опытный кот

Карма: 15
Рейтинг сообщений: 142
Зарегистрирован: Вс июн 19, 2016 10:32:03
Сообщений: 814
Рейтинг сообщения: 0
Для каждого Usart своя пара каналов, только их номера и меняются, потому не вижу в чем у тебя вообще проблема, если один канал работает...


Вернуться наверх
 
JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Отличное качество, подтвержденное более чем 600,000 пользователей! Более 10,000 заказов в день.

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/quote

Не в сети
 Заголовок сообщения: Re: Параллельная работа нескольких каналов DMA
СообщениеДобавлено: Ср апр 25, 2018 14:20:50 
Встал на лапы

Зарегистрирован: Сб янв 11, 2014 22:25:55
Сообщений: 100
Рейтинг сообщения: 0
Проблема послать одновременно

Добавлено after 1 minute 21 second:
При работе на разных потоках никаких проблем нет, на разных каналах - есть.

Добавлено after 3 minutes 4 seconds:
Настройка DMA
Код:
void Start_DMA_USART1_Tx (uint8_t am_bytes, uint8_t *m_data){
      
    DMA2_Stream7->CR = 0;                           // Отключаем поток. Нужно обеспечить, чтобы не была вызвана
                                                                              // функция Start_DMA_USART3_Rx, когда предыдущая передача
                                                    // еще не завершилась, иначе данные будут потеряны.
    while(DMA2_Stream7->CR & DMA_SxCR_EN);          // ждем пока поток эффективно остановится
                                                    // поток готов к настройке
    DMA2_Stream7->PAR = (uint32_t) & USART1->DR;    // устанавливаем адрес периферии
    DMA2_Stream7->M0AR = (uint32_t) m_data;
    DMA2_Stream7->NDTR = am_bytes;                           // количество байт
 
    DMA2_Stream7->CR = DMA_SxCR_EN | DMA_SxCR_DIR_0 | DMA_SxCR_CHSEL_2 | DMA_SxCR_MINC | DMA_SxCR_TCIE ;   
   
    USART1->CR3 |= USART_CR3_DMAT;
      NVIC_EnableIRQ( DMA2_Stream7_IRQn );
}

void Start_DMA_USART6_Tx (uint8_t am_bytes, uint8_t *m_data){
      
    DMA2_Stream7->CR = 0;                           // Отключаем поток. Нужно обеспечить, чтобы не была вызвана
                                                                              // функция Start_DMA_USART3_Rx, когда предыдущая передача
                                                    // еще не завершилась, иначе данные будут потеряны.
    while(DMA2_Stream7->CR & DMA_SxCR_EN);          // ждем пока поток эффективно остановится
                                                    // поток готов к настройке
    DMA2_Stream7->PAR = (uint32_t) & USART6->DR;    // устанавливаем адрес периферии
    DMA2_Stream7->M0AR = (uint32_t) m_data;
    DMA2_Stream7->NDTR = am_bytes;                           // количество байт
 
    DMA2_Stream7->CR = DMA_SxCR_EN | DMA_SxCR_DIR_0 | DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_0 |DMA_SxCR_MINC | DMA_SxCR_TCIE ;   
   
    USART6->CR3 |= USART_CR3_DMAT;
      NVIC_EnableIRQ( DMA2_Stream7_IRQn );
}


Запуск отправки данных (с частотой 10 Гц)
Код:
Start_DMA_USART1_Tx(rec_bt, config_6);   
         Start_DMA_USART6_Tx(rec_bt, config_6);
         
         DMA2_Stream7->CR |= DMA_SxCR_EN;



Добавлено after 4 minutes 30 seconds:
При этом по USART1 прилетает хотя бы 1й байт массива, а вот по USART6 вообще тишина


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $88 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay
Не в сети
 Заголовок сообщения: Re: Параллельная работа нескольких каналов DMA
СообщениеДобавлено: Ср апр 25, 2018 14:21:10 
Опытный кот

Карма: 15
Рейтинг сообщений: 142
Зарегистрирован: Вс июн 19, 2016 10:32:03
Сообщений: 814
Рейтинг сообщения: 0
Ты хочешь прям совсем синхронно 3 канала запустить?


Вернуться наверх
 
Плавкие предохранители LittelFuse. Грамотный подбор

Выбор оптимального плавкого предохранителя требует учета многих параметров. Для упрощения выбора оптимального предохранителя и автоматизации расчетов Littelfuse предлагает онлайн-утилиту. Подробнее>>
Не в сети
 Заголовок сообщения: Re: Параллельная работа нескольких каналов DMA
СообщениеДобавлено: Ср апр 25, 2018 14:27:14 
Встал на лапы

Зарегистрирован: Сб янв 11, 2014 22:25:55
Сообщений: 100
Рейтинг сообщения: 0
Совсем синхронно не получится, не ПЛИС всё таки. Хотя бы друг за другом - отправил посылку по USART1, следом эту же посылку отправляю по USART6. Засовывал уже даже в прерывание по окончанию передачи DMA отправку по USART6 - раз в 10 минут чё-то выкидывает.

Добавлено after 2 minutes 10 seconds:
О, даже раз в 10 минут перестал выкидывать


Вернуться наверх
 
Немногим дороже дискретного решения: новое поколение импульсных стабилизаторов Mornsun

Практически во всех радиоэлектронных устройствах массово применяются линейные понижающие стабилизаторы напряжения типа КРЕН в корпусе TO220 (другое обозначение – 78хх) и им подобные для формирования основного напряжения питания схемы.
Данные стабилизаторы позволяют без особых затрат получить нужное для каскада или узла схемы напряжение, если устройство питается от внешнего источника с более высоким напряжением. Для этого требуются… Подробнее>>
Не в сети
 Заголовок сообщения: Re: Параллельная работа нескольких каналов DMA
СообщениеДобавлено: Ср апр 25, 2018 14:32:36 
Опытный кот

Карма: 15
Рейтинг сообщений: 142
Зарегистрирован: Вс июн 19, 2016 10:32:03
Сообщений: 814
Рейтинг сообщения: 0
Мк какой? USART6 без USART1 я так понимаю нормально работает?


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Параллельная работа нескольких каналов DMA
СообщениеДобавлено: Ср апр 25, 2018 14:36:52 
Встал на лапы

Зарегистрирован: Сб янв 11, 2014 22:25:55
Сообщений: 100
Рейтинг сообщения: 0
STM32f401, да, один без другого работает нормально

Добавлено after 1 minute 58 seconds:
Всё, нашёл проблему. Как обычно, невнимательность...

Добавлено after 1 minute 31 second:
Код:
void DMA2_Stream7_IRQHandler(void){
   if( DMA2->HISR & DMA_HISR_TCIF7){
      DMA2->HIFCR = DMA_HIFCR_CTCIF7;
   
      if((DMAState)<1){
         Start_DMA_USART6_Tx(rec_bt, config_6);
         DMAState++;
      }
      else{
         DMA2_Stream7->CR &=~ DMA_SxCR_EN;
      }
   
        }
}


В бесконечном цикле не обнулял DMAState. Спасибо, что уделили время!


Вернуться наверх
 


Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y