Форум программистов, компьютерный форум, киберфорум
Наши страницы

Микроконтроллеры

Войти
Регистрация
Восстановить пароль
 
phosphorus74
3 / 3 / 0
Регистрация: 29.05.2012
Сообщений: 19
#1

USART2 и DMA - Микроконтроллер

20.04.2016, 12:39. Просмотров 319. Ответов 5
Метки нет (Все метки)

Пытаюсь запустить считывание из USART2 в DMA (IAR Embedded)
Делаю:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if ((RCC->AHBENR & RCC_AHBENR_DMA1EN) != RCC_AHBENR_DMA1EN)  RCC->AHBENR |=RCC_AHBENR_DMA1EN; //Подаем тактовые импульсы на DMA
DMA1_Channel7->CCR   =  0;                           //предочистка регистра конфигурации
  DMA1_Channel7->CMAR = (uint32_t) &RxBuff[0];       //адрес буфера приемника
  DMA1_Channel7->CPAR = (uint32_t) &USART2->DR;      //адрес регистра данных приемника
  DMA1_Channel7->CNDTR = 16;                         //для приемника
  DMA1_Channel7->CCR  &= ~DMA_CCR7_DIR;                //направление: чтение из перефирии
  DMA1_Channel7->CCR |= DMA_CCR7_PSIZE_0;              //по 16 бит
  DMA1_Channel7->CCR |= DMA_CCR1_EN;                                    //Включаем DMA?????
  
   NVIC_EnableIRQ (DMA1_Channel7_IRQn);//Разрешить прерывания от DMA канал №7
   DMA1_Channel7->CCR |= DMA_CCR7_TEIE;
  DMA1_Channel7->CCR |= DMA_CCR7_TCIE; //канал 7 Разрешить прерывание по завершении обмена
 
void DMA1_Channel7_IRQHandler ()   ////функцию-обработчик прерываний DMA канала 7
{
 
        SetPBit(Out1);
      for(f=1;f<200;f++){}
      ClrPBit(Out1);
}
Но импульса на выходе нет. Не подскажите где ошибка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2016, 12:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос USART2 и DMA (Микроконтроллер):

DMA - Микроконтроллер
Вопрос собственно возник при чтении документации: Тоесть выходит, что DMA тут совсем не DMA и паралельно с основной программой...

Генерация синусоиды с ЦАПа через DMA (ADuCM360) - Микроконтроллер
Есть код программы DAC_DMA. Надо чуть чуть переделать что бы генерировать синусоиду и через DMA(прямой доступ к памяти) выводить на ЦАП. Я...

Что такое USB Soft connect и DMA engine - Микроконтроллер
Здравствуйте объясните пожалуйста доходчиво что такое USB Soft connect и DMA engine?

Эффективность чтения датчиков SPI через DMA в режиме реального времени - Микроконтроллер
Кто знает, насколько эффективно использование разных датчиков интерфейса SPI, для отслеживания показателей в режиме реального времени? С...

USART2(RX+IDLE+DMA)+USART3(TX DMA) - ARM, Cortex, STM32 микроконтроллер
Принимаю по юсарт2, побайтно, на скрости 115200. Пытаюсь передавать по юсарт3 через DMA, скорость 115200. На выходе юсарт3, получаю вот...

STM32F407 USART2 DMA - ARM, Cortex, STM32 микроконтроллер
Всем добрый день! У меня есть тестовый пример использования USORT2 + DMA для платы STM32DISCOVERY (stm32F407VG). Передача осуществляется...

5
Voland_
1448 / 951 / 91
Регистрация: 04.01.2010
Сообщений: 3,078
20.04.2016, 14:13 #2
Цитата Сообщение от phosphorus74 Посмотреть сообщение
Но импульса на выходе нет. Не подскажите где ошибка
ошибка в инициализации DMA путем прямого задания значений регистрам. Используйте SDK для этого - это намного надежнее и проще. Потом можете оптимизировать.

Во-вторых, чтение из UART должно триггерить канал DMA специальным сигналом от USART к этому каналу DMA. Я у вас в коде этого (вроде бы) не обнаружил. DMA не может определить когда пришел символ и когда он готов к приему от USART. Поэтому, такой сигнал должен возводиться в USART и включать DMA на один шаг, чтобы сделать то, что вы хотите.

В-третьих, не забывайте - RxBuff должен быть выровнен на 32бита.

ЗЫ: использование DMA может вызвать трудности, если вы используете пакетный тип передачи данных, который весьма полезен для USART. Подумайте, что произойдет, если вы потеряете хотя бы один байт из ожидаемого пакета?

ЗЫ: Зачем вы проверяете состояние RCC_AHBENR_DMA1EN если вы его потом все равно устанавливаете?
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,212
20.04.2016, 22:17 #3
Цитата Сообщение от phosphorus74 Посмотреть сообщение
Пытаюсь запустить считывание из USART2 в DMA
камень то какой?
Цитата Сообщение от Voland_ Посмотреть сообщение
В-третьих, не забывайте - RxBuff должен быть выровнен на 32бита.
не факт, у кортексов нет такого железного правила, хотя да желательно
Цитата Сообщение от phosphorus74 Посмотреть сообщение
C
1
DMA1_Channel7->CCR |= DMA_CCR7_PSIZE_0; //по 16 бит
странный такой УСАРТ цельных шешнадцать бит принять может
и де настройка этого УСАРТа???
Цитата Сообщение от phosphorus74 Посмотреть сообщение
C
1
DMA1_Channel7->CCR  = 0;  //предочистка регистра конфигурации
Цитата Сообщение от phosphorus74 Посмотреть сообщение
C
1
DMA1_Channel7->CCR &= ~DMA_CCR7_DIR; //направление: чтение из перефирии
бесполезное действие, в CCR итак все биты 0
0
phosphorus74
3 / 3 / 0
Регистрация: 29.05.2012
Сообщений: 19
21.04.2016, 10:51  [ТС] #4
В идеале по UART мне нужно передавать 512 бит.
Но пока без DMA передаю только 16 например 4Е 20, принимается, или 4Е 20 или 20 4Е.
Думаете есть смысл применять DMA?
0
Voland_
1448 / 951 / 91
Регистрация: 04.01.2010
Сообщений: 3,078
21.04.2016, 12:11 #5
Цитата Сообщение от ValeryS Посмотреть сообщение
не факт, у кортексов нет такого железного правила, хотя да желательно
нашел у STM32F4:
When the data width (programmed in the PSIZE or MSIZE bits in the DMA_SxCR register)
is a half-word or a word, respectively, the peripheral or memory address written into the
DMA_SxPAR or DMA_SxM0AR/M1AR registers has to be aligned on a word or half-word
address boundary, respectively
...Подозреваю, что это не есть правило, но встречал такое же поведение в Stellaris от TI (LM3S9B95)

Цитата Сообщение от phosphorus74 Посмотреть сообщение
Но пока без DMA передаю только 16
USART не предназначен для отправки 16бит одним фреймом. USART максимум может передать 11бит - 1старт, 1 стоп, 1 парити и 8 бит данных. Конфигурации 8-e-1, 8-o-1. Или 8-n-2. Все остальные конфиги передают 8 бит данных и менее. 16 бит можно передать только как два байта, что меняет описание

Добавлено через 3 минуты
... и в догонку, насчет регистра управления инкременированием адресов, цитата из того же мануала:
If PINCOS bit is set, the address of the next transfer is the address of the previous one
incremented by 4 (automatically aligned on a 32-bit address) whatever the PSIZE value.
The AHB memory port, however, is not impacted by this operation.
2
phosphorus74
3 / 3 / 0
Регистрация: 29.05.2012
Сообщений: 19
21.04.2016, 13:16  [ТС] #6
Вы правы передаю 2 по 8
0
21.04.2016, 13:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2016, 13:16
Привет! Вот еще темы с ответами:

STM32F4Discovery - ADC DMA и FSMC DMA - ARM, Cortex, STM32 микроконтроллер
Привет всем. Вынужден опять обратиться за Вашей помощью :) Ситуация такая. 1. Дисплей работает через FSMC. Написал драйвер...

USART2 на STM32F4xx - ARM, Cortex, STM32 микроконтроллер
Навичак в работе с STM32. Второй день бьюсь с простенькой задачей - выслать что-нибудь на ПК через USORT. С библиотеками не работал, поэтму...

STM32F4 USART2 прием по прерыванию - ARM, Cortex, STM32 микроконтроллер
Здравствуйте,уважаемые! Спасибо за помощь с генерацией меиндра! Возникли у меня проблемы с приемом по USORT2. Все это нормально...

STM32L011F3 - USART2 проблемы с передачей. - ARM, Cortex, STM32 микроконтроллер
Доброго дня всем. Прошу помочь разобраться. Так как для L0 нет SPL , решил попробовать куб. Инициализирую UART2, выведенный на PA2,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru