[i] Printf через UART
В статье 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
Программное обеспечение