47482

[i] Printf через UART

Дата последнего изменения: 30.10.2025 10:31:51
Материал из настоящей статьи, относящийся к микросхемам К1986ВЕ92QI и К1986ВЕ1QI, распространяется в том числе на микроконтроллеры К1986ВЕ92FI, К1986ВЕ92F1I, К1986ВЕ94GI и К1986ВЕ1FI, К1986ВЕ1GI

В статье Printf через ITM был рассмотрен способ вывода информации стандартного потока ввода/вывода stdio в ПК с помощью отладчика по интерфейсу ITM. Однако, такой подход применим только для МК с ядром Cortex-M0+, Cortex-M3 и выше.

МК К1986ВЕ1QI с RISC-ядром, функционально аналогичным Cortex-M1, блока отладки ITM нет, поэтому вывести отладочную информацию с помощью SWO нельзя. В данной статье будет рассмотрено, как реализовать ввод/вывод сообщений с помощью интерфейса UART. В качестве примера программы с использованием ввода/вывода через UART воспользуемся примером "UART\RetargetSTDIO", который входит в состав "Standard Peripherals Library", например, для МК К1986ВЕ1QI пример расположен по пути: "Examples\MDR32F1QI\UART\RetargetSTDIO". Дополнительная реализация retarget-функций не требуется, так как поддержка перенаправления стандартного ввода/вывода в интерфейс UART уже реализована в библиотеке SPL, драйвер MDR32FxQI_utils.

1. Стандартные функции ввода/вывода

Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле stdio.h. Эта библиотека содержит функции:

- printf() — для вывода информации;

- scanf() — для ввода информации.

Чтобы понять, как настроить ввод/вывод информации рассмотрим подробнее данные функции. Структура стандартных функций ввода/вывода в Keil показана на рисунке 1.

Рисунок 1 - Структура стандартных функций ввода/вывода в Keil

Функции, которые доступны пользователю, находятся в самом верху данной структуры и называются высокоуровневыми (High-Level Functions). К таким функциям как раз и относятся printf() и scanf(). При их вызове обработка вводимой информации реализуется с помощью вызова низкоуровневых функций (Low-Level Functions), к ним относятся такие функции как fputc() и fgetc(). Данные функции, в свою очередь, вызывают функции, которые напрямую работают с периферией МК (System I/O Functions), например, с UART или CAN, перенаправляя на них поток данных.

2. Реализация функций для работы с UART

Реализация функций fputc() и fgetc(), перенаправляющая стандартный поток ввода/вывода в UART, выполнена на уровне SPL, драйвер MDR32FxQI_utils. В данном драйвере также предусмотрена функция инициализации STDIO_Init(), которая настраивает контроллер UART и соответствующие ему выводы МК. Настройка параметров контроллера UART выполняется в конфигурационном файле SPL MDR32FxQI_config.h, которые активируются с помощью макроопределения _USE_DEBUG_UART_.

Для включения перенаправления стандартного потока ввода/вывода в UART необходимо в MDR32FxQI_config.h раскомментировать макроопределение _USE_DEBUG_UART_ и настроить параметры контроллера UART и соответствующих ему выводов. В основной программе после настройки тактирования и обновления переменной SystemCoreClock (функция SystemCoreClockUpdate()) необходимо вызвать функцию STDIO_Init() драйвера MDR32FxQI_utils. На этом настройка завершена, далее можно использовать функции printf()/scanf() - вывод/ввод будет перенаправляться в UART.

Работа примера "UART\RetargetSTDIO" с использованием терминала Putty приведена на рисунке 2.

Рисунок 2 - Вывод отладочной информации в терминал Putty через UART

Сохранить статью в PDF

Программное обеспечение

Software pack для Keil MDK 5 + Standard Peripherals Library
Software pack для Keil MDK 5 + Standard Peripherals Library

Теги

Была ли статья полезной?