- Последовательная связь на STM8S103F3P6
- Контакты последовательной связи на STM8S103F3P6
- Принципиальная схема последовательной связи STM8S
- Настройка STVD для последовательной связи
- Программирование STM8S для последовательной связи
- Управление светодиодом с последовательного монитора
- Более глубокий взгляд на последовательную библиотеку STM8S
Программирование нового микроконтроллера часто занимает больше времени из-за новых методов обработки регистров и незнания того, какой бит и что именно делает. То же самое можно сказать и об отладке. Вот почему программисты довольно часто используют точки останова в своем коде и проходят через него с помощью отладчика. Но для использования отладчика может потребоваться дополнительное оборудование (в большинстве случаев дорогое), а также дополнительное время. Будучи фанатом Arduino, мы все можем согласиться с тем, что использование операторов последовательной печати для отладки и понимания нашего кода значительно упрощает жизнь. Что мы можем воспроизвести на STM8 с космическим компилятором C и библиотеками SPL? Что ж, это очень возможно, и это именно то, что мы собираемся сделать в этом третьем уроке нашей серии руководств.Вы также можете проверить начало работы с STM8S (учебник 1) и управление STM8S GPIO (учебник 2), если вы здесь совершенно новичок. Кроме того, мы также изучили возможность программирования STM8S с Arduino для быстрого начала. Все, что было сказано, давайте перейдем к учебнику.
Последовательная связь на STM8S103F3P6
Из таблицы данных STM8S103F3P6 мы видим, что наш 8-битный контроллер поддерживает связь UART во многих различных режимах. Контроллер также имеет вывод тактового сигнала для синхронной связи UART, а также может поддерживать SmarCard, IrDA и LIN. Но мы не будем исследовать ничего из этого в этом уроке, просто чтобы не усложнять. Мы узнаем, как выполнять простые операции чтения и записи UART.
В руководстве также есть файл заголовка stm8s103 serial.h, с помощью которого вы можете выполнять простые команды UART, такие как начало последовательного порта , последовательное чтение, последовательная печать и т. Д. В принципе, вы сможете печатать символы char, int и string на последовательном мониторе. а также прочитать char с последовательного монитора. В конце этого руководства вы сможете управлять светодиодом с монитора последовательного порта и получать отзывы о состоянии светодиода. Упомянутый выше заголовочный файл зависит от библиотек SPL, поэтому убедитесь, что вы следовали руководству по началу работы.
Контакты последовательной связи на STM8S103F3P6
Начнем с аппаратной части. Бегло взглянув на распиновку микроконтроллера STM8S103F3P6, приведенную ниже, мы видим, что контакты 1, 2 и 3 будут использоваться для связи UART.
Среди этих трех вывод 1 - это вывод синхронизации UART, который будет использоваться только во время синхронной связи UART, поэтому здесь он нам не понадобится. Контакт 2 - это контакт передатчика UART, а контакт 3 - контакт приемника UART. Обратите внимание, что эти контакты также могут использоваться как аналоговый вывод или обычный вывод GPIO.
Принципиальная схема последовательной связи STM8S
Принципиальная схема здесь очень проста, нам нужно подключить наш ST-LINK 2 для программирования и преобразователь USB в TTL для чтения последовательных данных. Обратите внимание, что наш контроллер STM8S работает с логическим уровнем 3,3 В, поэтому убедитесь, что преобразователь USB в TTL также поддерживает логику 3,3 В. Полная принципиальная схема показана ниже.
Вам необходимо подключить ST-канал к одному USB-порту, а преобразователь USB в TTL - к другому USB-порту вашего ноутбука, чтобы вы могли одновременно программировать и контролировать данные. Подключение UART простое, просто подключите заземление и вывод Rx / Tx микроконтроллера STM8S к контактам Tx / Rx преобразователя USB в TTL. Здесь я запитал контроллер с помощью контакта Vcc ST-Link и оставил контакт vss преобразователя TTL открытым, вы также можете сделать это наоборот. На рынке существует множество типов преобразователей USB в TTL, просто убедитесь, что они могут работать с логическими сигналами 3,3 В, просто найдите контакты Tx, Rx и GND и выполните подключение, показанное выше. Настройка моего оборудования показана ниже.
Для обеспечения последовательной связи мы предоставили заголовочный файл STM8S_Serial.h . Используя этот файл заголовка, вы можете выполнять простые функции, подобные Arduino, для последовательной связи.
Вы можете найти все необходимые файлы для этого проекта на нашей странице STM8S103F3_SPL Github. Если вам нужен только этот конкретный файл заголовка, вы можете скачать его по ссылке ниже.
Скачать STM8S_Serial.h
Настройка STVD для последовательной связи
Для работы с последовательной связью мы будем использовать многие из функций заголовочного файла STM8S_Serial.h, которые мы обсуждали ранее. Но у библиотеки есть другие зависимости, многие из которых связаны с заголовками SPL UART и Clock, а также с файлами C. Поэтому с этого момента лучше включить в наш проект все файлы заголовков и C, чтобы избежать ошибки компиляции. Моя рабочая среда STVD выглядит так.
Убедитесь, что вы включили все исходные файлы SPL и файл Include, как мы это сделали в нашем первом руководстве. А также убедитесь, что вы добавили файл заголовка stm8s103_serial.h . Для этого заголовка нет файла C.
Программирование STM8S для последовательной связи
Как только настройка проекта STVD будет готова, мы можем приступить к написанию нашего кода в файле main.c. Полный код этого руководства можно найти внизу этой страницы. Объяснение таково.
Первый шаг - включить необходимые файлы заголовков, здесь я добавил основной файл заголовка (stm8s) и файл заголовка stm8s_103_serial, который мы только что загрузили.
// Обязательные заголовки #include "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
Затем мы используем макросы дизайна для указания входных и выходных контактов. Здесь мы будем управлять только встроенным светодиодом, который подключен к контакту 5 порта B, поэтому мы даем ему имя test_LED .
#define test_LED GPIOB, GPIO_PIN_5 // тестовый светодиод подключен к PB5
Переходя к основной функции, мы определим вывод как выход. Если вы не знакомы с основными функциями GPIO, вернитесь к руководству STM8S GPIO.
// Определение выводов // Объявить PB5 как двухтактный Выходной вывод GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
Затем мы инициализируем наши порты последовательной связи на скорости 9600 бод. Для новичков 9600 - это скорость, с которой биты данных будут передаваться во время связи. Если вы установите здесь 9600, вы также должны установить то же самое в программном обеспечении для мониторинга. Затем мы также печатаем строку «Введите команду» и переходим к следующей строке.
Serial_begin (9600); // Инициализируем последовательную связь со скоростью 9600 бод Serial_print_string ("Введите команду"); // выводим строку Serial_newline (); // перейти к следующей строке
Переходя к бесконечному циклу while, мы используем функцию Serial_available, чтобы проверить, есть ли какие-либо входящие последовательные данные. Если да, мы читаем и сохраняем его в переменной с именем ch, а также печатаем то же самое, используя Serial_print . Затем, если полученное значение равно 0, мы выключим светодиод, а если оно равно 1, мы включим светодиод.
if (Serial_available ()) {Serial_print_string ("Вы нажали:"); ch = Serial_read_char (); Serial_print_char (канал); Serial_newline (); если (ch == '0') GPIO_WriteHigh (test_LED); // Светодиод выключен if (ch == '1') GPIO_WriteLow (test_LED); // светодиод горит}
На этом программирование для этого руководства завершено, просто загрузите код, указанный внизу этой страницы, и вы сможете управлять светодиодом с монитора последовательного порта.
Управление светодиодом с последовательного монитора
После того, как вы загрузили код, вы можете открыть любой последовательный монитор со скоростью 9600 бод. Я использовал сам серийный монитор Arduino для простоты использования. Нажмите кнопку сброса, и вы должны увидеть сообщение «Введите команду». Затем, если вы введете 1 и нажмете Enter, на плате должен загореться светодиод, аналогично 0 он должен погаснуть.
Полную работу можно найти в видео по ссылке внизу этой страницы. Если у вас есть вопросы, оставьте их в комментариях. Вы также можете использовать наши форумы, чтобы задать другие технические вопросы.
Более глубокий взгляд на последовательную библиотеку STM8S
Для тех любопытных людей, которые хотят знать, что на самом деле происходит внутри заголовочного файла STM8S103F3_Serial, прочтите….
Этот файл заголовка хорошо подходит для программирования на начальном уровне, но если вы используете другую версию контроллера STM8S или ищете дополнительные параметры, вы можете немного настроить этот заголовок или напрямую работать с библиотеками SPL. Я написал этот файл заголовка, просто как вырванный из файла заголовка UART1, объяснение моего файла заголовка следующее.
Чтение символа из последовательного монитора
Эта функция помогает прочитать одиночный символ, который был отправлен в микроконтроллер с последовательного монитора.
char Serial_read_char (void) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET); UART1_ClearFlag (UART1_FLAG_RXNE); возврат (UART1_ReceiveData8 ()); }
Мы ждем, пока флаг RXE не будет установлен, чтобы завершить прием, а затем сбрасываем флаг, чтобы подтвердить прием. Наконец, мы отправляем полученные 8-битные данные в результате этой функции.
Печать символа на серийном мониторе
Эта функция передает одиночный символ от микроконтроллера к последовательному монитору.
void Serial_print_char (значение символа) {UART1_SendData8 (значение); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // ждем отправки}
Функция просто записывает 8-битное значение и ожидает завершения передачи, проверяя UART1_FLAG_TXE на SET.
Инициализация последовательной связи
Эта функция инициализирует последовательную связь с требуемой скоростью передачи.
void Serial_begin (uint32_t baud_rate) {GPIO_Init (GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init (GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); UART1_DeInit (); // Деинициализация периферийных устройств UART UART1_Init (скорость_бода, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); // (BaudRate, Wordlegth, StopBits, Parity, SyncMode, Mode) UART1_Cmd (ENABLE); }
Помимо скорости передачи, есть другие параметры, которые должны быть установлены для последовательной связи, такие как количество бит данных, количество стоповых бит, четность и т. Д. Наиболее распространенный (аналогично Arduino) - это 8-битные данные. с одним стоповым битом и без контроля четности, следовательно, это будет настройка по умолчанию. При необходимости его можно изменить.
Печать целого числа на последовательном мониторе
В большинстве случаев, если мы используем монитор последовательного порта для отладки или мониторинга, мы можем захотеть распечатать переменную типа int в мониторе последовательного порта. Эта функция делает именно то, что
void Serial_print_int (int number) // Функция для вывода значения int на серийный монитор {char count = 0; char digit = ""; while (number! = 0) // разбиваем int на массив char {digit = number% 10; count ++; число = число / 10; } while (count! = 0) // вывод массива символов в правильном направлении {UART1_SendData8 (digit + 0x30); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // ждем отправки count--; }}
Он принимает целочисленное значение и преобразует его в массив символов в первом цикле while, а затем во втором цикле while мы отправляем каждый из символов, аналогично нашей функции print char.
Печать новой строки
Это простая функция для печати новой строки. Для этого используется шестнадцатеричное значение «0x0a», мы просто отправляем его, используя 8-битную команду передачи.
void Serial_newline (void) {UART1_SendData8 (0x0a); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // ждем отправки}
Печать строки на последовательный монитор
Еще одна полезная функция - это фактическая печать строк на последовательном мониторе.
void Serial_print_string (строка символов) {. char i = 0; while (строка! = 0x00) {UART1_SendData8 (строка); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); i ++; }}
Опять же, эта функция также преобразует строку в массив символов и отправляет каждый символ. Как мы знаем, конец всех строк будет нулевым. Поэтому нам просто нужно продолжать обход и передачу символов, пока мы не достигнем нулевого значения 0x00.
Проверка доступности последовательных данных для чтения
Эта функция проверяет, есть ли в буфере последовательные данные, готовые к чтению.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) return TRUE; иначе верните ЛОЖЬ; }
Он проверяет флаг UART1_FLAG_RXNE , если он истинен, он возвращает истину, а если нет, возвращает ложь.