Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2019, 20:58

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 2777 ]  На страницу Пред.  1 ... 104, 105, 106, 107, 108, 109, 110 ... 112  След.
Автор Сообщение
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 13 авг 2019, 16:06 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6157
"как мне достать эти данные"
Что вы хотите 'доставать'? DMA кладет то, что получает. Всё принятое уже лежит в вашем буфере. Сколько уже принято (на данный момент) вы можете вычислить из счетчика посылок того самого канала DMA.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 13 авг 2019, 16:25 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1091
Gnusmas писал(а):
Вопрос из разряда "хочу понять суть". Юзаю HAL/Кал (называйте как вам будет удобнее).
1. Сделал передачу по UART на DMA. Вроде все логично, пнул ОДИН РАЗ массив на передачу, по окончанию ВСЕЙ передачи получил ОДИН вызов callback в котором поставил флажок что передатчик свободен для следующей отправки - действительно удобно, нет лишних вызовов прерываний, не надо по 1 байту в прерывании из массива пихать в передатчик. Красота.
2. Теперь пытаюсь сделать прием в кольцевой буфер через DMA. При вызове HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) мне надо указать СКОЛЬКО БАЙТ я хочу принять. И только после приема такого количества байт будет вызван HAL_UART_RxCpltCallback, в котором я должен обработать ответ. И вот тут у меня ломается мозг. Если размер принятого будет меньшего размера, как мне достать эти данные из неполного буфера ? Объясните плиз логику работы на прием через DMA.


Мыслите шире как сказал бы dosikus_2 ставьте максимальное кол-во которое может быть.
Какая разница сколько байт у вас прилетит если можно включить прерывание по IDLE или так любимое мной для работы c Modbus RTU - TimeOut (это тот же самый Idle + определенное время - офигенно удобная штука на Stm32F0)

Сама последовательность:
Пришло что то в приемный буфер - поймали прерывание RXNE - пнули в обработчике DMA на прием и вышли из прерывания.
Как только сработало прерывание IDLE, выставили флаг на чтение вышли из прерывания и уже где то в теле основной программы по флагу спокойно и без суеты разбираем буфер приема любезно заполненный DMA :)

P\S Использую для этого либо кольцевой либо двойной буфер.

обработчик, будет выглядеть как то так:

Код:
void USART1_IRQHandler(void)       {//USART1 IRQ HANDLER
   if (USART1->ISR & USART_ISR_RXNE)   {
// тут нужно пнуть DMA если у вас двойной буфер, или ничего не делать если кольцевой, он и так пишет постоянно
}
   
   if (USART1->ISR & USART_ISR_RTOF)                                 {// TimeOut - message receidved
      dma_qnt=DMA1_Channel3->CNDTR;
      word_flag=1;
      USART1->ICR |=USART_ICR_RTOCF;

}
   
   if (USART1->ISR & USART_ISR_ORE)      {
         USART1->ICR |=USART_ICR_ORECF;      // Reset OverRun
   }   
   
   }



Выше как и говорил используется не Idle а Таймаут (кусок кода из разбора NMEA строки)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 13 авг 2019, 16:49 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 677
Откуда: Earth
sed_alex писал(а):
... Сама последовательность:
Пришло что то в приемный буфер - поймали прерывание RXNE - пнули в обработчике DMA на прием и вышли из прерывания.
Как только сработало прерывание IDLE, выставили флаг на чтение вышли из прерывания и уже где то в теле основной программы по флагу спокойно и без суеты разбираем буфер приема любезно заполненный DMA :) ...

Благодарю !!! Все четко и понятно расписали.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 13 авг 2019, 17:00 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3938
Откуда: КЧР, поселок Нижний Архыз
Коль уж все равно прерывание RXNE активно, да еще и там так много кода, то на кой черт DMA на прием?
Я сам исключительно на передачу DMA использую, а принятые байты обрабатываю в прерывании RXNE: заполняю буфер, если он переполняется — обнуляю и выставляю флаг переполнения, если пришло '\n', меняю буферы и выставляю флаг готовности (у меня все протоколы строковые).
Код на гитхабе лежит. Последнее, что делал — хронометр на STM32F103. Там используется три UART'а + USB-CDC. Прием у всех уартов обрабатывается в прерывании, передача — через DMA.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 13 авг 2019, 17:04 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5652
sed_alex писал(а):
Пришло что то в приемный буфер - поймали прерывание RXNE - пнули в обработчике DMA на прием и вышли из прерывания.


А нахрена первый байт руками ловить?
Что с IDLE что с таймаутом заранее заряжал и запускал DMA, далее как у тебя...

Eddy_Em, это твои же фобии - боязнь DMA на прием,боязнь отладчика, боязнь джлинка...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 13 авг 2019, 17:15 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 677
Откуда: Earth
dosikus_2 писал(а):
А нахрена первый байт руками ловить?

Я для себя выкинул этот шаг. Сразу буду запускать HAL_UART_Receive_DMA. Но сама последовательность мне наконец-то стала понятна.

Eddy_Em писал(а):
то на кой черт DMA на прием?

Это требование человека, который ставил мне ТЗ)) Прием по прерываниям я и раньше умел.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 13 авг 2019, 17:22 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1091
Eddy_Em писал(а):
Коль уж все равно прерывание RXNE активно, да еще и там так много кода, то на кой черт DMA на прием?
Я сам исключительно на передачу DMA использую, а принятые байты обрабатываю в прерывании RXNE: заполняю буфер, если он переполняется — обнуляю и выставляю флаг переполнения, если пришло '\n', меняю буферы и выставляю флаг готовности (у меня все протоколы строковые).
Код на гитхабе лежит. Последнее, что делал — хронометр на STM32F103. Там используется три UART'а + USB-CDC. Прием у всех уартов обрабатывается в прерывании, передача — через DMA.


В том то и дело, что в случае использования кольцевого буфера вообще можно не использовать RXNE (как видно обработчик пустой, если DMA постоянно в кольцевой буфер пишет) настраивается DMA в при инициализации и все.
Попробуй если будешь что то опять делать переведи на DMA, у тебя 103 тогда 90 % времени спать будет.

P\S у меня загрузка 32F042 уменьшилась ощутимо когда применил такой режим работы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 13 авг 2019, 17:29 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 820
Gnusmas писал(а):
dosikus_2 писал(а):
А нахрена первый байт руками ловить?

Я для себя выкинул этот шаг. Сразу буду запускать HAL_UART_Receive_DMA. Но сама последовательность мне наконец-то стала понятна.

Eddy_Em писал(а):
то на кой черт DMA на прием?

Это требование человека, который ставил мне ТЗ)) Прием по прерываниям я и раньше умел.


А поговорить с ним?? Ведь в некоторых случаях это сложнее , а выигрыш если есть то сомнительный. Как-то странно DMA ради DMA..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 17 авг 2019, 13:53 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 677
Откуда: Earth
kos писал(а):
А поговорить с ним?? Ведь в некоторых случаях это сложнее , а выигрыш если есть то сомнительный. Как-то странно DMA ради DMA..

Я просто пишу либу. Для себя - в учебных целях, для человека - чтобы юзать, в т.ч. и во всяких ртосах, посему надо ДМА (пнул и забыл, нет лишних вызовов прерываний). Поэтому сам хочу сделать так, как он просит.

По результатам работы.
Вроде как получилось сделать кое-как рабочий прием на ДМА (в обработчике UART_IDLE_Callback):
Show

Ставлю точку останова на "if (uart_write(rx_buff, temp_rx_count) != STATUS_OK)".
Запуска отладку, посылаю пакет в контроллер, отладчик замирает на бряке. Смотрю содержимое rx_buff - вижу там свой пакет. Если после этого сделать Step Over, получаю на выходе свой пакет, если же сделать Resume, получаю на выходе пакет нужной длинны, но в нем только первых 1-2 символа (когда как) из моего пакета, а остальное - 0. То же самое при запуске без отладки. Сама по себе функция uart_write работает нормально, то есть код вида
Show

будет циклично слать в uart нужную строку с нужным периодом.
Подскажите плиз, что я не учел.


Последний раз редактировалось Gnusmas 19 авг 2019, 00:54, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 17 авг 2019, 16:54 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3938
Откуда: КЧР, поселок Нижний Архыз
dosikus_2 писал(а):
боязнь DMA на прием,боязнь отладчика, боязнь джлинка...

DMA на прием работать будет только в идеальном случае, т.к. обычно неизвестно, сколько должно байт прийти. Не нужно.
Отладчик - тоже совершенно бесполезная штука, не имеющая отношения к реальной жизни.
жлинк уж тем более не нужен: зачем всякую дрянь использовать, когда через бутлоадер прошить можно? Ну или через дешевый stlink?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 03:24 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 33
Eddy_Em писал(а):
DMA на прием работать будет только в идеальном случае, т.к. обычно неизвестно, сколько должно байт прийти. Не нужно.
Вовсе нет, на STM32F0 прием по DMA работает как часы при разнообразных динах пакетов. Основные требования - чтобы размер буфера DMA был больше длины максимально возможного пакета и работал в циклическом режиме, на тот случай, если вдруг прилетит что-то большее, чем буфер в состоянии вместить. А дальше все как выше уже расписали:
sed_alex писал(а):
Пришло что то в приемный буфер - поймали прерывание RXNE - пнули в обработчике DMA на прием и вышли из прерывания.
Как только сработало прерывание IDLE, выставили флаг на чтение вышли из прерывания и уже где то в теле основной программы по флагу спокойно и без суеты разбираем буфер приема любезно заполненный DMA :)
Только RXNE конечно же не нужен, DMA просто включен и принимает все что приходит, складывая в буфер и генерируя прерывание по IDLE (ну или Timeout, кому что). В прерывании по IDLE помимо флага на парсинг, еще необходимо вычислить длину принятого пакета и перезапустить DMA для следующего приема в буфер с 1-й позиции. Ну или если есть нужда в реальном кольцевом буфере, то нужно будет еще сохранить текущую позицию конца пакета для вычисления длины пакета следующего. Но тут уже на этапе парсинга придется контролировать, не было ли двукратной перезаписи кольцевого буфера при приходе гигантского пакета. Перезапускать DMA и отбрасывать пакеты, переполнившие буфер DMA на этапе IDLE мне оказалось проще.

Вообще, кто знает, откуда ноги растут у этого заблуждения что прием по DMA возможен только при заранее известной длине пакета? Имел дело только STM32F0, и прием по прерываниям на них видится мне морально устаревшей процедурой, возможно на других сериях STM32 этот механизм и правда не работает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 11:21 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3938
Откуда: КЧР, поселок Нижний Архыз
Это - идиотизм! Зачем принимать по DMA, если все равно обрабатывается прерывание?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 12:04 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Не нужен тут DMA, не усложняйте.
Я тестировал на скорости 9600 успевал принять и обработать символы, максимальное использование кольцевого буфера было 1 байт.
То есть и без буфера обошёлся бы.

Складывайте в прерывании по приему символы в буфер.
А в основном потоке обрабатывайте.


Опять же служебный символ можно отловить, возврат каретки, например - и выставить флаг (семафор) приема строки.

Но если человек хочет свои шишки набить - ради Бога.

И кстати - "пинать" ДМА можно и без вызова обработчика прерывания - в этом и весь цимус.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 12:26 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2348
Вы зачем буфер в стеке разместили?

while(1){
uint8_t rx_buff[1000] = {0};


Либо объявляйте как глобальную переменную либо используйте static
while(1){
static uint8_t rx_buff[1000] = {0};


Тут тоже зачем строка в оперативке?
uint8_t buff[] = "Hello World!!!\r";

Разместите во флеше

const uint8_t buff[] = "Hello World!!!\r";


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 12:35 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2373
Откуда: Китай, Пекин
Цитата:
обычно неизвестно, сколько должно байт

верно - в черезжопных протоколах именно так

в нормальном протоколе, BlackBox например.
все участники обмена имеют метаданные о пакетах которых обмениваются.

по прилетевшему ID пакета сразу, легко опредлеляется его длинна -
если все поля в пакете обязательны, то он фиксированной, предопределенной он длинны.
если в нем есть НЕ обязательные поля, соответственно его длинна переменная. и далее ждем байты в которых прилетит его длинна сверх обязательной.

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 12:54 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3619
Любой GPS-модуль не имеет постоянной длинны пакета в интерфейсе. Практически ANSI-обмен в текстовом виде не имеет фиксированной длинны.
---
Приём по прерываниям при низкой скорости и неизвестной длине - это вполне нормально. Особенно когда разбор "на лету".


Последний раз редактировалось BusMaster 18 авг 2019, 13:19, всего редактировалось 4 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 12:58 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 33
Eddy_Em писал(а):
Это - идиотизм! Зачем принимать по DMA, если все равно обрабатывается прерывание?
Вы не прикидываетесь, правда не понимаете? IDLE - это одно прерывание в конце пакета, а не 100 - по одному на каждый байт. И весь пакет уже в буфере, без всяких копирований этих самых байт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 13:08 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 33
Pingvin писал(а):
Складывайте в прерывании по приему символы в буфер.
А в основном потоке обрабатывайте.
Зачем лишние действия? Есть одно аппаратное прерывание в конце пакета. Пакет уже в буфере, по смещению в буфере определяется его длина. Понятно что делать можно по-разному и по-разному будет работать. И аппаратно всегда проще и правильнее. Это вроде очевидно, не? Удивительно, что вы еще не пишите "Зачем аппаратный uart? Программно ногами дрыгайте да и все".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 14:19 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 33
BusMaster писал(а):
Любой GPS-модуль не имеет постоянной длинны пакета в интерфейсе. Практически ANSI-обмен в текстовом виде не имеет фиксированной длинны.
Приём по прерываниям при низкой скорости и неизвестной длине - это вполне нормально. Особенно когда разбор "на лету".
Как выше выяснили, для приема по DMA постоянная длина пакета не требуется. В любом случае прием сообщений GPS модулей - это частный случай и реализовать его через DMA будет невозможно, только если между пакетами паузы не будет совсем, ну или длина будет совсем гигантской. А если будет регламентированная пауза и адекватная длина, то тоже проще будет по DMA и IDLE, причем и с точки зрения программирования и с точки зрения минимизации кода. А то процессорное время что вы тратите на излишние прерывания, копирование байт и программное определение конца посылки, будете тратить на свой разбор на лету. Еще и кольцевой буфер в DMA считайте реализован, бери - не хочу, ваша страховка на тот случай если не успеете что-то на лету распаковать вдруг. В общем, по-моему, выгода DMA при приеме очевидна, точно так же как и при передаче и смысла ее оспаривать я не вижу вообще.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 14:41 
Старожил

Зарегистрирован: 06 июн 2018, 22:30
Сообщения: 415
Откуда: Киев
А если и паузы велики между байтами, то IDLE запускает таймер... а уже по таймеру конец пакета.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 15:19 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 33
MasterElectric писал(а):
А если и паузы велики между байтами, то IDLE запускает таймер... а уже по таймеру конец пакета.
Это уже треш какой-то, если паузы между байтами будут соизмеримы с паузами между пакетами, тут без шансов. А если паузы больше IDLE, но сильно меньше пауз между пакетами, то лучше не IDLE использовать, а аппаратный таймаут, определяющий конец пакета, если он конечно есть для вашего МК

Show Timeout


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 15:39 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1432
Атарасий писал(а):
Это уже треш какой-то

Да разве ж это трэш, а вот что будет с программой [и с dma, и с прерываниями] в случае настоящего трэша - белого шума на rxd втечение, скажем, секунды?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 16:23 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 2373
Откуда: Китай, Пекин
Цитата:
случае настоящего трэша - белого шума на

для этого нужна котрольная сумма, CRC16 как минимум. и то.. совсем не панацея, но хоть что-то.
+ четкое детектирование начала входящего пакета
+ если пакет получен не полностью, по тамауту считать его битым и отбрасывать полученное...

но кто в наколеночном поделии о таком заморачивается.
Изображение

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 16:39 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1432
cheblin писал(а):
для этого нужна котрольная сумма

Хорошо ещё если будет кому её проверять - если программа не ляжет после interrupt storm
Мне эти "аппаратные" игры другую игру напоминают )


Вложения:
jenga.jpg
jenga.jpg [ 22.79 Кб | Просмотров: 223 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 17:01 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 33
vt340 писал(а):
Атарасий писал(а):
Это уже треш какой-то

Да разве ж это трэш, а вот что будет с программой [и с dma, и с прерываниями] в случае настоящего трэша - белого шума на rxd втечение, скажем, секунды?
С таким к сожалению не сталкивался, имел дело только с промышленными протоколами, к примеру взять банальный Modbus RTU, все паузы жестко регламентированы протоколом. Не более 1.5 символов между байтами, не менее 3.5 символов между посылками. Прием элементарно реализовывается полностью аппаратно с DMA и прерыванием по таймауту, настроенным на 3.5 символа.

vt340 писал(а):
Хорошо ещё если будет кому её проверять - если программа не ляжет после interrupt storm
Если программа ляжет - IWDG ее перезапустит, в чем проблема? В любом случае - шум это уже нештатная ситуация, и протоколом она не регламентируется, а стало быть является неисправностью, таких ситуаций много можно нафантазировать и все их нужно решать индивидуально. Ни прерывания, ни DMA не будут панацеей.

Контрольная сумма кстати на STM32F0 тоже считается аппаратно - полином задал и готово, ни ресурсоёмких алгоритмов не нужно, ни гигантских таблиц. После унылого AVR - просто песня.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2777 ]  На страницу Пред.  1 ... 104, 105, 106, 107, 108, 109, 110 ... 112  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: meykj


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

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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB