STM Урок 212. LL. STM32F4. USART

 

 

 

В данном уроке мы попробуем с помощью библиотеки LL поработать с интерфейсом USART (Universal synchronous asynchronous receiver transmitter) контроллера STM32F4.

Модуль USART у контроллера линейки STM32F4 практически ничем не отличается от аналогичного в контроллере STM32F1, поэтому изучать нам аппаратную составляющую не придётся и инициализация происходит таким же образом.

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

В регистре SR бит NE (Noise error flag) изменил свою аббревиатуру на NF (Noise detected flag), сохранив при этом весь функционал

 

 

Также в регистре CR3 добавился бит ONEBIT (One sample bit method enable), который даёт возможность отключать шумовой фильтр

 

 

ONEBIT (One sample bit method enable): Бит метода выборки. Включает метод с одним битом выборки, в этом случае флаг обнаружения шума (NF) отключается

0 – метод с тремя битами выборки. Флаг обнаружения шума (NF) включен.

1 – метод с одним битом выборки. Флаг обнаружения шума (NF) отключен.

 

Вот и вся, в принципе разница.

Также нам значительно облегчает работу с шиной UART то, что нам не потребуется переходник на USB, ибо возможность передачи данных по USART в USB в нашей плате STM32F429I-Discovery поддерживается через ST-Link. Хотя говорят, что в старых версиях такой платы данной возможности нет, так что уточняйте, какая именно у вас плата.

С модулем USART контроллера STM32 мы также работали и с применением библиотеки LL, правда это было с серией STM32F1, но как выяснилась, данная шина у серии F1 работает точно так же и программируется тоже. Поэтому, раз уж мы так много всего знаем, то мы сразу объединим знания трёх уроков начиная с урока 161, и будем через USART не только передавать данные, но и принимать, и, мало того, используя при этом механизм прерываний.

А теперь мы смело можем перейти к проекту, который был сделан из проекта урока 209 с именем LL_SPI_ILI9341_DMA и получил новое имя – LL_USART.

Откроем наш проект в Cube MX и включим наш USART, предварительно ознакомившись со схемой

 

 

У нас включились необходимые ножки

 

 

Включим прерывания на USART1

 

 

Изменим приоритет данных прерываний на 1

 

 

Настроим также использование для USART библиотеки LL

 

 

Сгенерируем наш проект, открыв его затем в Cube IDE, затем откроем файл main.c и сначала подключим библиотеку для работы со строками, которая нам нужна будет для работы с функцией memset

 

 

Объявим глобальный символьный массив и целочисленную переменную для флага приёма

 

 

Также добавим функцию передачи строки через USART, которую возьмём из проекта урока 209

 

 

В функции main() удалим объявление переменной j, которая нам не будет нужна

 

uint16_t i,j;

 

А переменную i сразу проинициализируем нулём

 

uint16_t i=0;

 

Объявим также символьный массив, который нужен будет для формирования строки для передачи через USART в терминальную программу

 

 

Из бесконечного цикла удалим весь пользовательский код.

Настроим цвет текста и фона, а также ориентацию экрана дисплея

 

 

 

Разрешим прерывания от USART1 по событию приёма байта и ошибки

 

 

После функции DMA1_Stream4_TransferComplete добавим функцию для обработки события окончания приёма байта из шины, в которой примем байт и запишем его в переменную, если это не перевод строки, то запишем его также в наш массив, проинкрементировав затем переменную позиции. А если это всё-таки перевод строки, то заполним пробелами последующие байты массива до 19-го и в 20-й запишем ноль, чтобы функциям работы со строками было понятно, что это окончание строки, обнулим счётчик и установим пользовательский флаг

 

 

Добавим на данную функцию прототип в файле stm32f4xx_it.c

 

 

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

 

 

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

Вернёмся в функцию main() файла main.c и в бесконечном цикле в случае установленного пользовательского флага отобразим на дисплее принятый текст и сбросим флаг. Мы не будем ждать установленного флага, так как у нас циклы будут следовать друг за другом довольно часто

 

 

Затем передадим строку со счётчиком, который будет считать от 0 до 1023 циклически и добавим задержку в 100 милисекунд

 

 

Запустим терминальную программу, настроим также и передачу данных оттуда, благо, это делать мы давно умеем, соберём код, прошьём контроллер и увидим, что в терминальную программу благополучно приходят строки от нашего контроллера

 

Попробуем также передать из терминальной программы строку нашем контроллеру

 

 

На дисплее нашей платы строка успешно отобразилась

 

 

Попробуем передать строку покороче, чтобы проверить, что лишние символы на дисплее успешно забиваются пробелами

 

 

Всё отлично работает

 

 

Итак, на данном уроке, мы, объединив наши знания предыдущих уроков, смогли по шине USART контроллера STM32F1 передать данные, а также их принять, используя при этом механизм прерываний, с применением библиотеки LL.

Всем спасибо за внимание!

 

Предыдущий урок Программирование МК STM32 Следующий урок

 

Исходный код

 

 

Отладочную плату можно приобрести здесь STM32F429I-DISCO

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM LL. STM32F4. USART. Передача данных

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*