UART в STM32. Часть 2.
Теперь, когда мы познакомились с UART'ом довольно подробно, попробуем создать устройство которое возможно даже послужит для чего-то полезного. Одно я могу сказать точно - оно поможет еще лучше понять как работать с UARTом. Устройство не особо хитрое - есть 10 светодиодов, состоянием которых мы можем управлять с компьютера через UART. Когда мы отправляем с компьютера символ "1" у нас загорается первый светодиод, отправляем еще раз - светодиод гаснет. Отправляем символ "?" и контроллер выдает нам состояние всех светодиодов. Аппаратно ничего нового (кроме светодиодов) тут нет. Я использовал свою любимую STM32VL Discovery и беспаячную макетную платку, в результате был рождён этот монстр :)
Практическое применение данного устройства - управлять нагрузками с компьютера. Разумеется, придётся внести некоторые аппаратные изменения - вместо светодиодов поставить транзисторные ключи с реле. Ну а если практического использование не интересно, то поиграем со светодиодами
В схеме ничего интересного нет, 10 светодиодов, 10 резисторов и контроллер. Преобразователь интерфейсов USB-UART (или RS-232 - UART) на схеме не показан для простоты. Его можно собрать, например по схеме из самой первой статьи про UART. А вот на коде остановимся поподробнее. Во-первых в этом примере мы не только передаем что-то из устройства в компьютер, но и принимаем данные от компьютера. Вторая особенность - использование специализированной библиотеки для работы с UARTом. Код выглядит страшновато, но попробуем разобраться что к чему.
Для начала пару слов о настройке UARTa. Как я уже говорил, я использовал в этом примере специальную библиотеку, чего и вам рекомендую. Конечно, знать для чего нужны все эти регистры для управления UARTом надо, но напрямую настраивать UART через них это дольше и сложнее. Куда проще заполнить структуру и вызвать функцию для настройки и все готово к работе. Тем более код становится более читабельным. Теперь о передаче данных в компьютер. Я написал две функции send_to_uart и send_str. Первая передаёт байт в UART, вторая передаёт строку в UART. Передача строки представляет собой вызов send_to_uart для каждого её символа. Строка должна заканчиваться нульсимволом. Приём данных от компьютера реализован очень тупо и просто. В бесконечном цикле постоянно проверяется бит RXNE статусного регистра USART1. Если этот бит установился в единицу, значит что-то пришло и надо забрать данные и обработать их. После того как байт данных принят он проверяется на соответствие символам от 0 до 9 или знаку вопроса. Если в UART пришла цифра то мы просто меняем состояние соответствующей ноги на противоположное. Ну а если пришел знак вопроса то при помощи макроса get_led_state проверяем состояние каждого светодиода и печатаем соответствующую информацию в UART. Для экспериментов я использовал свой любимый терминал:
Ну собственно вот что у меня получилось после нажатия 012789?. Естественно при этом соответствующие светодиоды загорелись. Если у вас получился иной результат, пишите ниже. Попробуем разобраться.
P.S. На всякий случай выкладываю свой проект который у меня получился.