RS485 — один из наиболее широко используемых стандартов связи в промышленных и встроенных системах, поскольку он обеспечивает надежную связь на большие расстояния и между несколькими устройствами. В отличие от UART, который ограничен связью «точка-точка» на коротких расстояниях, RS485 поддерживает дифференциальную передачу сигналов, что делает его устойчивым к помехам и позволяет работать по более длинным кабелям.
В этом руководстве мы продемонстрируем, как подключить модуль преобразователя RS485 в TTL к микроконтроллеру STM32. Для этой настройки будут использованы две платы STM32 — а именно STM32F103 и STM32F446. Эти платы будут взаимодействовать друг с другом через модули RS485, демонстрируя практическую реализацию полудуплексной последовательной связи.
Введение в связь по протоколу RS485
Что такое RS485 и зачем его использовать в проектах на базе STM32?
RS485 — это стандарт последовательной связи , использующий дифференциальную сигнализацию для передачи и приема данных. В отличие от простой связи по UART, которая лучше всего работает на коротких расстояниях и только между двумя устройствами, RS485 разработан для надежной связи на больших расстояниях с участием нескольких устройств . Он поддерживает кабели длиной до 1200 метров и позволяет нескольким устройствам (до 32 и более) совместно использовать одну и ту же шину связи.
В проектах на базе STM32 интерфейс RS485 часто используется в промышленной автоматизации, сенсорных сетях, контроллерах двигателей и интеллектуальных счетчиках электроэнергии, где необходимо надежно обмениваться данными между множеством устройств на больших расстояниях в условиях сильных электрических помех. Микроконтроллер STM32 в сочетании с внешним приемопередатчиком, таким как модуль MAX485 , позволяет легко реализовать связь по RS485, используя при этом привычный периферийный интерфейс UART .
Преимущества связи RS485 по сравнению с UART
Хотя UART прост и эффективен для связи на коротких расстояниях между двумя точками, он имеет ограничения по дальности, помехоустойчивости и количеству устройств . RS485 решает эти проблемы, предлагая:
- Связь на большие расстояния – RS485 поддерживает надежную передачу данных на расстояние до 1200 метров , в то время как UART обычно ограничен всего несколькими метрами.
- Возможность подключения нескольких устройств одновременно – В отличие от UART, который подключает только два устройства, RS485 позволяет нескольким устройствам (ведущему и ведомому или многомастерскому) использовать одну и ту же шину.
- Помехоустойчивость – RS485 использует дифференциальную передачу сигналов , то есть данные передаются в виде разности напряжений между двумя проводами (A и B). Это делает его очень устойчивым к помехам и идеально подходящим для промышленных условий.
- Повышенная целостность данных – благодаря устойчивости к помехам и дифференциальной передаче сигналов, RS485 обеспечивает меньшее количество ошибок при передаче данных по сравнению с UART, особенно в сложных электрических условиях.
Вкратце, RS485 расширяет возможности UART, обеспечивая связь на больших расстояниях, надежную и масштабируемую связь , поэтому он широко используется в промышленных и встроенных проектах на базе STM32 .
Обзор модуля RS485 MAX485
Преобразователь RS485 в TTL — это модуль интерфейса связи, позволяющий микроконтроллерам, таким как STM32, обмениваться данными на большие расстояния, используя протокол RS485. Он преобразует дифференциальные сигналы RS485 в стандартные последовательные данные уровня TTL, которые могут считываться периферийными устройствами UART на микроконтроллерах. RS485 известен своей надежностью, помехоустойчивостью и способностью поддерживать несколько устройств на одной шине, что делает этот преобразователь идеальным для применения в промышленных и встроенных системах.
В этих модулях часто используется микросхема приемопередатчика MAX485 , которая поддерживает полудуплексную связь и способна надежно работать с кабелями большой длины.
Важные особенности преобразователя RS485 в TTL:
- Дифференциальная сигнализация для дальней связи : она использует дифференциальную передачу сигнала, что снижает уровень шума и позволяет передавать данные на расстояния до 1200 метров.
- Поддержка нескольких устройств на шине : RS485 поддерживает до 32 устройств на одной линии связи, обеспечивая многоузловую связь в одной сети.
- Широкий диапазон совместимости по напряжению : работает от источника питания 5 В и обеспечивает выходной сигнал уровня TTL, совместимый с микроконтроллерами 3,3 В или 5 В.
- Контакты разрешения драйвера/приемника (DE/RE) : Контакты DE и RE обеспечивают точное управление направлением передачи данных, что крайне важно для реализации полудуплексной связи между устройствами.
Уровень сигнала, используемый в методе связи RS485, обычно находится в диапазоне от -7 В до +12 В. Выводы микроконтроллера, как правило, не рассчитаны на работу с такими уровнями. Именно поэтому эти сигналы необходимо преобразовывать в низкие напряжения, например, ±3 В. В модуле установлен чип MAX485, который выполняет большую часть работы по преобразованию.
Распиновка модуля RS485
Распиновка модуля показана ниже.

С левой стороны модуля контакт RO подключается к контакту RX интерфейса UART, а контакт DI — к контакту TX.
Контакты RE и DE отвечают за перевод модуля в режим приемника или передатчика .
- Когда вывод RE и вывод DE находятся в низком состоянии , модуль переходит в режим приемника .
- Когда контакт DE и контакт RE находятся в состоянии высокого уровня , модуль переходит в режим передатчика .
Контакты A и B являются выходными контактами, через которые передается сигнал.
Рассмотрим пример, где мы передаем модулю данные 0x95 (10010101). Если модуль питается от 5 В, выходные сигналы на контактах A и B будут выглядеть следующим образом (см. ниже).



- Поскольку вывод A является неинвертирующим , его выходное напряжение будет синхронизировано с входным. Оно изменяется в диапазоне от 0 до +5 В.
- B — это инвертирующий вывод, поэтому выходное напряжение инвертировано и изменяется от -5 В до 0 В.
- Когда второй модуль получает эти данные на входе, он декодирует их на основе разницы напряжений.
- Если разность напряжений максимальна, бит равен 1, а если разность равна 0, бит равен 0.
- Затем эти данные преобразуются в более низкие напряжения (от 0 до 3 В) в соответствии с требованиями микроконтроллера.
Подключение проводов STM32 и RS485
Ниже приведена схема подключения модуля к контроллеру STM32F103C8 . Схема подключения останется той же и для F446, поэтому здесь показан только один из вариантов.

Как показано выше, вывод RO (Receiver Output) модуля MAX485 подключен к PA10 , который служит в качестве UART1 RX на STM32. Вывод DI (Driver Input) подключен к PA9 и сконфигурирован как UART1 TX .
Контакты RE (разрешение приема) и DE (разрешение драйвера) соединены вместе и подключены к выводу PA8 , который на микроконтроллере STM32 настроен как цифровой выход . Такая схема позволяет микроконтроллеру управлять режимом работы модуля: прием или передача .
| MAX485 Pin | Функция | STM32 Pin | Примечания |
|---|---|---|---|
| РО | Выход приемника | ПА10 | UART1 RX |
| ДИ | Ввод данных драйвера | ПА9 | UART1 TX |
| РЕ | Включение приемника | ПА8 | Связано с DE, управление выходом |
| ДЕ | Включение драйвера | ПА8 | Связано с RE, управление выходом |
| ВЦК | Источник питания | 5 В/3,3 В | Согласно техническим характеристикам модуля |
| НД | Земля | НД | Общая основа |
Конфигурация STM32 CubeMX для RS485
Перед написанием кода для связи по протоколу RS485 необходимо правильно настроить периферийные устройства STM32 с помощью CubeMX .
Конфигурация UART в CubeMX показана ниже.

UART1 настроен с параметрами по умолчанию, используя скорость передачи данных 115200 бод и формат 8-N-1 (8 бит данных, без контроля четности, 1 стоповый бит). Кроме того, включено прерывание приема UART , позволяющее STM32 асинхронно принимать данные от второго контроллера.
В этом проекте использовались следующие контакты: [ссылка на изображение].

Вывод PA8 настроен как цифровой выход и переименован в TX_EN . Он управляет режимом работы модуля MAX485: высокий уровень для передачи и низкий для приема, что позволяет STM32 переключаться между отправкой и приемом данных по шине RS485.
Код связи RS485 для STM32
Как уже упоминалось, цель состоит в установлении связи между двумя микроконтроллерами. STM32F103 инициирует связь, передав сообщение, а после получения этого сообщения STM32F446 ответит соответствующим образом. Эта схема демонстрирует простой механизм запроса-ответа с использованием RS485.
Код для F103
uint8_t TxData[16];
uint8_t RxData[16];
int indx = 0;
int main ()
{
HAL_UARTEx_ReceiveToIdle_IT(&huart1, RxData, 16);
while (1)
{
sprintf(TxData, "F103 %d", indx++);
sendData (TxData);
HAL_Delay(1000);
}
}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
HAL_UARTEx_ReceiveToIdle_IT(&huart1, RxData, 16);
}
- В основной функции мы сначала настроим UART для приема данных.
- Функция ReceiveToIdle_ITбудет получать входящие данные и сохранять их в буфере RxData до тех пор, пока не будет обнаружена линия Idle.
- Если вывод RX некоторое время находится в режиме ожидания, он вызовет прерывание, которое в конечном итоге приведет к срабатыванию метода RxEventCallbak.
- Внутри этой функции обратного вызова мы просто включим прерывание приема в режиме ожидания. Это связано с тем, что HAL отключает прерывание после каждого вызова, поэтому нам нужно снова включать его после каждого срабатывания прерывания.
- В цикле while мы будем обновлять строку, которую хотим отправить, увеличивая значение переменной indx.
- И мы будем продолжать отправлять эту обновленную строку каждую секунду.
Функция sendData, использованная выше, показана ниже.
void sendData (uint8_t *data)
{
// Pull DE high to enable TX operation
HAL_GPIO_WritePin(TX_EN_GPIO_Port, TX_EN_Pin, GPIO_PIN_SET);
HAL_UART_Transmit(&huart1, data, strlen (data) , 1000);
// Pull RE Low to enable RX operation
HAL_GPIO_WritePin(TX_EN_GPIO_Port, TX_EN_Pin, GPIO_PIN_RESET);
}
- Перед передачей данных необходимо перевести модуль RS485 в режим передатчика.
- Для этого необходимо установить высокий уровень на выводе DE (разрешение драйвера).
- Затем мы отправим данные, используя эту HAL_UART_Transmitфункцию.
- После передачи данных мы включим режим приёмника, поместив вывод RE (Receive Enable) в низкий уровень.
Помните, что контакты DE и RE подключены к одному и тому же выводу (PA8, TX_EN), поэтому мы можем использовать один и тот же вывод для переключения модуля в режим передатчика или приемника.
Поскольку время поступления данных неизвестно, модуль всегда находится в режиме приема. Непосредственно перед отправкой данных мы переводим его в режим передатчика, а затем снова переводим в режим приема.
Переданные данные будут приняты устройством F446, после чего оно отправит ответ.
Код для F446
Как только F446 получит данные, будет вызвана функция RxEventCallback, и мы напишем свой код внутри неё.
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
RxData[0] = 'F';
RxData[1] = '4';
RxData[2] = '4';
RxData[3] = '6';
sendData(RxData);
HAL_UARTEx_ReceiveToIdle_IT(&huart1, RxData, 64);
// memset (RxData, '\0',64);
}
Здесь мы заменим первые 4 байта («F» '1» '0» '3» на «F» '4» '4» '6» и отправим данные обратно первому контроллеру.
Это всего лишь ответ, и таким образом мы сможем понять, что данные поступают непосредственно от F446.
Остальная часть кода аналогична той, что мы видели для F103.
Результат для связи по протоколу RS485 с использованием STM32
Ниже представлены изображения буферов TxData и RxData контроллера F103.
F103 Буфер данных приема
Как видите, данные, передаваемые и принимаемые устройством F103, практически идентичны, за исключением первых нескольких байтов.
Таким образом, мы передали «F103 46» с контроллера F103. Это сообщение было принято контроллером F446, который изменил первые несколько байтов и передал обратно контроллеру F103 «F446 46».
Связь по протоколу RS485 идеально подходит для сетей большой протяженности и многоточечных сетей , что делает его широко используемым в промышленной автоматизации, связи Modbus и сенсорных сетях . Как только вы поймете, как настроить периферийное устройство UART, управлять выводом разрешения передачи и обрабатывать прерывания по линии ожидания, вы сможете масштабировать эту систему для нескольких устройств на одной шине RS485.
Этот проект можно дополнительно улучшить, внедрив DMA для передачи данных , добавив обработку ошибок или расширив код для поддержки протокола Modbus RTU для реальных приложений.

