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

Нужна программная реализация UART для STM32.

лепится. Я на atmega8 сразу два делал, на каждый нужно по таймеру и одному внешнему прерыванию. У меня 19200 работало без проблем, это на мелкой атмеге. Слепить из битов байты - не самое сложное, самое сложное- обработка возможных ошибок.

Я тоже делал. На PIC16. Поэтому и не советую никому, если есть возможность использовать аппаратный.

 

Ну если ресурсов вагон (процессорного времени + есть пара лишних DMA) - можно написать так, что разницы не заметишь:

таймер на 115200*16 (можно *8) Гц дёргает DMA, который читает в память RX-пин и иногда в ISR разбираем принятый массив.

Еще и памяти под массив надо набрать. Посылка может быть длинной. :biggrin:

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


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

Еще и памяти под массив надо набрать. Посылка может быть длинной. :biggrin:

можно закольцевать, а обрабатывать побайтно.

или побитно, в прерывании по фронту

и да, я бы тоже не стал софтовый уарт делать.

SPI мастер ногодрыгом ещё куда ни шло, хотя тоже времени жалко (процессорного)

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


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

Так как, побайтно или побитно записывать в буфер по ПДП? :rolleyes: В смысле, как биты складывать при ПДП? И обрабатывать, соответственно.

О, bitband задействовать можно?!

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


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

Так как, побайтно или побитно записывать в буфер по ПДП? :rolleyes:
Не вижу повода для ухмылок. На сколько буфера не жалко - по столько и складывать. С учетом допустимой задержки на прием. Обработчик таймерного прерывания может быть задержан другими обработчиками или блоками кода с запретом прерываний. ПДП складывает в ОЗУ "снимки" состояния вывода гораздо равномернее. Вход-выход в прерывание занимает какое-то время и в случае ПДП можно входить в прерывание гораздо реже, обрабатывая несколько выборок за раз. Да даже если сделать буфер ПДП всего на две выборки (разумеется и прерывание по заполнению половины буфера) - будет все то же самое как и с таймернвм прерыванием, но без гуляния момента выборки.

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


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

Еще и памяти под массив надо набрать. Посылка может быть длинной. :biggrin:

Какая связь между длиной посылки и размером массива для DMA??? :wacko:

Размер DMA-массива определяется только максимально допустимой частотой прерываний DMA-transfer complete.

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


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

Так как, побайтно или побитно записывать в буфер по ПДП? :rolleyes: В смысле, как биты складывать при ПДП? И обрабатывать, соответственно.

Посэмплово конечно. UART.RX сэмплировать с частотой baudrate*16 (в худшем случае *8), эти сэмплы в виде байтов и складывать в буфер.

Прочитайте как работает UART.

 

или побитно, в прерывании по фронту

Это уже не UART, так как не соответствует его алгоритму работы. И насчёт пагубного влияния задержки вызова ISR тут уже сказали.

 

Чего не хватает для полноценности UART?

А Вы знаете как работает алгоритм UART.RX?

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


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

Я вопрошаю, как единичные биты с вывода приема будут утрамбовываться в байты буфера при ПДП. Если только один бит из байта будет нести полезную информацию, то это злостное растранжиривание памяти.

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

Вот на две выборки буфер, как предложил С. Борщ - неплохо, экономно. Но чтобы очень уж сильно требовалось выдерживать время выборки, такого нет.

А можно, вообще, на одну выборку буфер. Я упростил идею! :)

Прочитайте как работает UART.

А Вы знаете как работает алгоритм UART.RX?

Читали сто лет назад. Знаем не хуже вашего. :rolleyes:

 

Размер DMA-массива определяется только максимально допустимой частотой прерываний DMA-transfer complete.

По каждой выборке можно? То-то. И без ПДП, памяти, парсинга... Чисто конечный автомат.

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


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

Но разве программный уарт не требует только лишь таймера настроенного на частоту baudrate * 3 и внешнего прерывания?

При наличии DMA программный уарт будет мало отличаться от аппаратного, длительность обработки прерывания RX НЕМНОГО ВОЗРАСТЕТ, это верно. Но так ли это важно на скорости 168мгц?

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


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

В библиотеках Ардуино (Atmega) есть реализация программного UART. Называется SoftwareSerial, но ее используют на скоростях до 9600. Выше работа нестабильная, думаю, в первую очередь из-за плохого кварца от которого тактируется процессор. Разве для STM такого готового нет?

 

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


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

В библиотеках Ардуино (Atmega) есть реализация программного UART. Называется SoftwareSerial, но ее используют на скоростях до 9600. Выше работа нестабильная, думаю, в первую очередь из-за плохого кварца от которого тактируется процессор.

Не, не из-за кварца. А от того, что процессорные ресурсы кушает. Не успевает процессор вовремя прочитать бит, обработать его и еще основное дело выполнять.

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


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

Не понятно, о чём две страницы темы, когда автор не соизволил озвучить, какие узлы МК в данной разводке чудесным образом оказались на тех ногах, про которые он наивно думал, что они UART, потому что более-менее отвечающий требованию стандарта чисто программный на такой скорости не получится однозначно.

 

А если полуаппаратно, то на защёлке/компараторе таймера можно попробовать, даже без прерываний.

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


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

Если только один бит из байта будет нести полезную информацию, то это злостное растранжиривание памяти.

Гораздо меньше :)

 

Читали сто лет назад. Знаем не хуже вашего. :rolleyes:

Похоже что не читали....

UART.RX на самом нижнем уровне принимает не биты, а сэмплы. И работает с ними.

Читайте про uart oversampling ratio. По стандарту оно ==16.

 

По каждой выборке можно?

Зачем???

Вы застряли в мире однобайтовых AVR? Сочувствую :laughing:

 

Но разве программный уарт не требует только лишь таймера настроенного на частоту baudrate * 3 и внешнего прерывания?

Тут уже написали выше про влияние задержки входа в ISR вызванной либо запретом прерывания либо работающими другими(другими) более приоритетными ISR.

Какие есть максимальные длительности других IST и запретов прерываний у ТС - мы не знаем, значит предполагаем худшее. Отсюда следует, что всякие программные псевдо-UART на прерываниях идут сразу в мусорку.

 

Выше работа нестабильная, думаю, в первую очередь из-за плохого кварца от которого тактируется процессор.

Не из-за этого. Читайте ещё и ещё раз про задержку входа в ISR. До просветления.

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


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

А то что можно сколхозить на частоте 115200Гц и внешнем прерывании по перепаду RX - это не UART.

Чего не хватает для полноценности UART?

Чтобы УАРТ можно было назвать полноценным, он должен работать близко к аппаратному:

частота сэмплирования входа х16 от бодрейта (х8 в крайнем случае).

И принятие решения о уровне по мажоритару от трех центральных выборок по центру бита.

Из этого, кстати, и идет требование об одинаковости тактирования приемника и передатчика в пределах 3%

На 10-11 битах это уже 30% + 3 сэмпла.

 

Все остальные упрощения, типа один сэмпл в центре бита по таймеру, это "не полноценный УАРТ"

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

Но на внешний RS-485 с линией связи в сотни метров по цеху - применять не стоит.

 

А на 115200 х16 это уже 0.5мкс. Прерывания с такой частотой - это круто.

Так что, на мой взгляд, делать можно только если ресурсы МК ну совсем уж девать некуда.

Хотя идея с DMA - хороша! (выбор смайликов маловат - где большой палец вверх?) :)

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


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

Не понятно, о чём две страницы темы, когда автор не соизволил озвучить, какие узлы МК в данной разводке чудесным образом оказались на тех ногах, про которые он наивно думал, что они UART, потому что более-менее отвечающий требованию стандарта чисто программный на такой скорости не получится однозначно.

Автор уже давно воспользовался паяльником и забыл про эту тему. Всё как всегда :laughing:

Получится полностью отвечающий стандарту если использовать таймер+DMA. Ну если конечно при работе системы нет моментов времени, когда шина так загружена, что тормозят даже DMA-транзакции на значительное время ;)

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


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

UART.RX на самом нижнем уровне принимает не биты, а сэмплы. И работает с ними.

Читайте про uart oversampling ratio. По стандарту оно ==16.

Пусть выборки (хоть горшки! :biggrin:).

Программно можно не хватать горшок сэмпл за сэмплом. Достаточно 3-х в середине битового интервала. У Микрочипа была Application Note такая.

Вы застряли в мире однобайтовых AVR? Сочувствую :laughing:

Эта чаша пронеслась мимо меня. Никогда не любил Атмел.

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


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

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

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

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

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

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

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

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

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

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