Программное обеспечение Serial Revisited

Ронк
Вторник 19 января 2016 г., 21:29
Привет, ребята,

У меня была пара проектов, где мне нужно было более трех последовательных портов. Иногда это всего лишь один, но мне нужно было 3 дополнительных порта для одного проекта. Типичный выбор - используйте часть «V» с его 5 портами, добавьте внешнее оборудование UART для полного аппаратного решения, добавьте внешние регистры смены для некоторой аппаратной помощи, или... только программное обеспечение.

Учитывая проблемы с стоимостью и сложности, которые я выбрал для серийного решения программного обеспечения. Я начал с относительно простого взлома серийного программного обеспечения Arduino AVR на основе задержки. Работает нормально для некоторых приложений, но для других мне нужен полный дуплекс и/или одновременный прием и передача в других портах, поэтому я написал новый сериал с прерыванием программного обеспечения с нуля с использованием таймеров и Exint, позволяя использовать почти любые контакты для TX/RX. Однако, из-за неэффективного способа прерывания акций STM32 и того, как библиотеки ST32DUIN. Он также несколько чувствителен к задержке прерывания, но имеет преимущество в том, что он способен использовать практически любой PIN -код GPIO. Таким образом, в попытке повысить терпимость к более высоким задержкам прерывания, я получил подсказку из последовательной библиотеки программного обеспечения Teensy и написал версию, которая получает дополнительную помощь в аппаратном обеспечении, используя захват таймера и сравнение возможностей.

Каждая библиотека имеет свой собственный набор уникальных преимуществ и соображений, поэтому они не заменяют друг друга. Скорее, тот, кто наилучшим образом подходит для вашего приложения, должен использоваться.

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

1. Серийная библиотека программного обеспечения на основе задержки. SoftwareserialStm32
https: // github.com/wingspinner/softwareserialstm32
Это взлом библиотеки AVR Arduino с условными, поэтому та же самая библиотека может быть использована для AVR или STM32DUINO. Он имеет все преимущества и ограничения оригинальной библиотеки, включая:

Преимущества:
- Простой в использовании, потому что не беспокойтесь о задержке прерывания (прерывания отключено) и может использовать практически любой контакт GPIO для RX/TX.

Ограничения/соображения
- Требует, чтобы все прерывания были отключены во время передачи и получения, что делает его несовместимым с любым другим прерыванием
приводимый в силу периферийных устройств.
- Не может получить или передавать одновременно
- Поддерживает несколько экземпляров, но только один может быть активным одновременно.
- TX не буферирован. Система должна ждать, пока TX завершит. Это оказывает огромное влияние на производительность системы, особенно на более низком уровне
Ставки на бод.

2. Библиотека программного обеспечения, управляемого прерыванием, серийная библиотека. Softserialintap
https: // github.com/wingspinner/softserialintap
Это полностью буферизовано как для TX, так и для RX и может использовать практически любой вывод GPIO для TX или RX, а также для любого таймера. В настоящее время он должен использовать любой из первых четырех таймеров, но это можно легко изменить, если вы используете часть с большим количеством таймеров и хотите использовать, кроме первых четырех. Один таймер требуется на порт, и вы можете создать экземпляр нескольких независимых портов.

Преимущества:
- Управляемое прерыванием, поэтому влияние на производительность системы незначительно даже при низких показателях бода.
- Может использовать практически любой вывод GPIO для TX или RX
- Полностью буферированный TX/RX
- Высокое точное время с использованием системных таймеров
- Множественные, одновременные экземпляры
- Совместимые функции членов с серийной библиотекой программного обеспечения Arduino
- TX и RX могут быть независимо включены/отключены (вместо всего порта).

Ограничения/соображения
- Несколько чувствителен к задержке прерывания, так как битовое время зависит от прерываний таймера обслуживания. Я бы оценил, что он может терпеть примерно 0.5 -битное время задержки прерывания.
- В настоящее время не поддерживает инвертированный серийный сигнал.
- В настоящее время поддерживает только 8 бит, без паритета

3 прерывание, управляемое с использованием серийной библиотеки программного обеспечения Capture/Compare. Softserialintcc
https: // github.com/wingspinner/softserialintcc
Это основано на моем Softserialintap Библиотека, но модифицирован для использования возможностей таймера/сравнения. Это немного более терпимо к другой активности прерываний и, по -видимому, может сделать полный дуплекс до 57 600 бод (YMMV!). У него более низкие накладные расходы, потому что он прерывается только при изменениях битов (по сравнению с каждым временем). Как с Softserialintap, Softserialintcc может использовать любой из первых четырех таймеров, но это может быть легко изменено, если вы используете часть с большим количеством таймеров и хотите использовать, кроме первых четырех. Один таймер требуется на порт, и вы можете создать экземпляр нескольких независимых портов.

Преимущества:
- Прерывание, управляемое с использованием захвата/сравнения таймера, поэтому воздействие на производительность системы незначительно даже при низких скоростях бод.
- Полностью буферированный TX/RX
- Высокое точное время с использованием системных таймеров
- Множественные, одновременные экземпляры
- Совместимые функции членов с серийной библиотекой программного обеспечения Arduino
- TX и RX могут быть независимо включены/отключены (вместо всего порта).
- Менее чувствителен к задержкам прерывания из -за захвата/сравнения оборудования. Оцените 1 -битное время задержки.

Ограничения/соображения
- Может использовать только контакты захвата/сравнения, назначенного таймеру, используемому для RX и TX.
- Выбор выводов не автоматический. Вы должны указать правильные булавки для таймера, который вы указываете при создании в создании возможностей.
- В настоящее время не поддерживает инвертированный серийный сигнал.
- В настоящее время поддерживает только 8 бит, без паритета

Как вы можете себе представить, это много работы, чтобы проверить все эти вещи, поэтому мое тестирование было в основном ограничено тем, что мне нужно для моих приложений. Поэтому убедитесь, что вы делаете адекватное тестирование в своей среде и конфигурации. Кроме того, имея дело с ISRS в C ++ и особенно позволяя для нескольких независимых экземпляров, которые требуют прыгать через некоторые обручи. Может быть лучше, чем я придумал. Возможно, кто -то может внести свой вклад в улучшения.

Рон Карри

Martinayotte
Ср 20 января 2016 г. 1:59
Спасибо за ваш вклад, Рон !
Конечно, «время все еще не хватает ингредиента», поэтому у меня не будет времени, чтобы попробовать его, хотя я их скачал.

Weiming
Ср 20 января 2016 г. 2:03
Это здорово, у меня есть тест на STM32F103R8T6, но SofterialIntap это не может RX, только TX.

Ронк
Чт 21 января 2016 г. 18:39
Weiming написал:Это здорово, у меня есть тест на STM32F103R8T6, но SofterialIntap это не может RX, только TX.

Rogerclark
Чт 21 января 2016 г., 19:50
На днях я нашел программный сериал для ESP8266 Arduino... который, кажется, работает.

Таким образом, вы можете взглянуть на это и посмотреть, использует ли он просто вызовы API и поэтому может работать на STM32 без модификации.

Mrburnette
Чт 21 января 2016 г. 22:30
Rogerclark написал:На днях я нашел программный сериал для ESP8266 Arduino... который, кажется, работает.

Таким образом, вы можете взглянуть на это и посмотреть, использует ли он просто вызовы API и поэтому может работать на STM32 без модификации.

Rogerclark
Чт 21 января 2016 г. 22:39
Mrburnette написал:
Ник Гаммон также имеет "Sendonly" & Реализация «receeOnly».

Луча

Ронк
Пт 22 января 2016 12:53
Rogerclark написал:На днях я нашел программный сериал для ESP8266 Arduino... который, кажется, работает.

Таким образом, вы можете взглянуть на это и посмотреть, использует ли он просто вызовы API и поэтому может работать на STM32 без модификации.

Rogerclark
Пт 22 января 2016 г. 1:03
Я уверен, что это был этот

https: // github.com/plieningerweb/esp8266-software-uart

Ронк
Пт 22 января 2016 г. 3:16 утра
Rogerclark написал:Я уверен, что это был этот

https: // github.com/plieningerweb/esp8266-software-uart

Weiming
Пт 22 января 2016 12:23
SoftserialIntap MISERIAL (PB15, PB14, 1); // rx tx таймер

void setup ()
{
Мисериальный.начало (9600);
Мисериальный.println ("Привет, мир?");
}

void loop () // бежать снова и снова
{
Мисериальный.println ("Привет, мир?");
задержка (1000);
}

Это мой код, я не получаю строку, я не знаю, почему?

Ронк
Пт 22 января 2016 г. 18:23
Weiming написал:SoftserialIntap MISERIAL (PB15, PB14, 1); // rx tx таймер

void setup ()
{
Мисериальный.начало (9600);
Мисериальный.println ("Привет, мир?");
}

void loop () // бежать снова и снова
{
Мисериальный.println ("Привет, мир?");
задержка (1000);
}

Это мой код, я не получаю строку, я не знаю, почему?

Weiming
Сб 23 января 2016 г. 3:24
это работает хорошо, все в порядке.
SoftserialStm32 MISERIAL (PB15, PB14); // rx, Техас
-----------------------------------------------------------------------------------------------
SoftserialIntap MISERIAL (PB15, PB14, 1); // RX TX Timer RX в порядке, TX - что -то не так
Но это мисериально.println ("Привет, мир?"); не работай, что -то не так?
// if (myserial.доступный())
// серийный.Напишите (мисериальный.читать()); // Эта линия работает хорошо

Дэвидж
Sun 24 июля 2016 г., 9:27
Я не могу заставить эти библиотеки работать на STM32F103C8T6 на 72 МГц.
Я использую голый эскиз. Попробовал несколько досок, портов и бодратов (9600 и 57600).
SoftserialStm32 отправляет поврежденные данные.
Softserialintap ничего не делает.
SoftserialIntcc только создает повторные места.
Все подключено правильно. Аппаратный серийный/серийный 1 работаю нормально.

Кто -нибудь выяснил, как использовать эти библиотеки?