УСАПП - универсальный синхронно-асинхронный приемо-передатчик(USART Universal synchronous asynchronous receiver transmitter). Также известный как последовательный порт. Но в отличие от того последовательного порта с которым мы привыкли сталкиваться в компьютере или в платах подобных этой, УСАПП только функциями последовательного асинхронного порта (УАПП, UART) в stm32 не ограничивается.
Полный функционал УСАПП включает в себя - синхронный однопроводной и полудуплексный способ коммуникации. Также можно использовать его для образования LIN (локальная межмодульная сеть), работы с СМАРТ-картами, инфракрасным приемо-передатчиком (IrDA Infrared data association) SIR ENDEC спецификации, а также операций с модемом (CTS/RTS). Также можно применять при многопроцессорных (многомастерных) коммуникациях.
блок-схема УСАПП:
У УСАППа большое количество флагов настройки которые позволяют гибко настроить его под текущую задачу. Также предделитель (а без него не возможно задать частоту для приемника и передатчика) имеет помимо целой части делителя еще и дробную, что позволяет настраивать его при любой системной тактовой частоте.
Также существует возможность загрузки данных напрямую с памяти при помощи ПДП. Регистр данных имеет две теневых копии - одна для чтения, другая для записи.
Присутствует аппаратный контроль потока, позволяющий образовывать стабильный канал связи, а также работать с модемами и другим аппаратными блоками использующими последовательный интерфейс.
И как обычно в УСАППе присутствует контроллер прерываний/событий позволяющий строить гибкую систему.
Начинаем мы как обычно с создания директории проектов:
nis@jane ~/stm32/f4examples $ mkdir 06-usart
nis@jane ~/stm32/f4examples $ cd 06-usart/
Также создадим базовый проект:
nis@jane ~/stm32/f4examples/06-usart $ cp -a ../05-timers/00-base/ .
Заодно, скопируем заголовочный файл альтернативных функций портов в/в:
nis@jane ~/stm32/f4examples/06-usart $ cp ../05-timers/03-ccr-pwm-mode/gpio_af.h 00-base/
Для начала создадим достаточно простой проект - передача байта.
Усложним проект, добавив прием - прием байта.
Передовать байты по одному не так удобно как строки поэтому следующий пример это - передача строки.
Далее сделаем помимо передачи строки и прием строки.
Т.к. просто передавать и принимать байты неинтересно, сделаем реакцию периферии МК на ввод пользователя - интерактивное меню.
Более эффективно будет разгрузить основной цикл программы поэтому перейдем к прерываниям - прерывание по приему.
Также рассмотрим дополнения для ввода-вывода строк - форматированный вывод и ввод чисел.