Как заставить printf работать на STM32F103?

Я новичок в мире STM32F103. У меня есть демонстрационный код для STM32F103, и я использую arm-none-eabi для его компиляции.

Я пробовал все, что мог найти в Google, но пока ничего не помогло. Я уже три дня потратил на эту проблему.

Кто-нибудь может дать мне демонстрационный код для printf, который хорошо работает?

Часть моего make-файла:

CFLAG   = -mcpu=$(CPU) -mthumb -Wall -fdump-rtl-expand -specs=nano.specs --specs=rdimon.specs   -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group
LDFLAG  = -mcpu=$(CPU) -T ./stm32_flash.ld -specs=nano.specs --specs=rdimon.specs   -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group

person Kotliner    schedule 23.09.2016    source источник
comment
Что вы имеете в виду под этим? А это микроконтроллер, где ты хочешь печатать текст? Обычно при программировании встроенной цели вы создаете свой собственный print набор функций, который использует UART (или другие протоколы связи). Найдите некоторые библиотеки UART или, возможно, некоторые библиотеки отладки, которые используют ваш отладчик (например, Segger RTT с JLink Viewer на вашем ПК, если у вас есть отладчик Segger)   -  person Tim    schedule 23.09.2016
comment
Я использую arm-none-eabi- для комбинирования. Это проблема. Я знаю, как использовать printf в проекте keil. и я использую USART1 для вывода. вы пытаетесь использовать этот компилятор для создания файла bin.   -  person Kotliner    schedule 24.09.2016


Ответы (4)


Включив следующие флаги компоновщика:

LDFLAGS   += --specs=rdimon.specs -lc -lrdimon

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

Полухостинг - это механизм, который позволяет коду, выполняющемуся на цели ARM, обмениваться данными и использовать средства ввода / вывода на главном компьютере, на котором запущен отладчик.

Примеры этих средств включают ввод с клавиатуры, вывод на экран и дисковый ввод-вывод. Например, вы можете использовать этот механизм, чтобы разрешить функциям библиотеки C, таким как printf () и scanf (), использовать экран и клавиатуру хоста вместо того, чтобы иметь экран и клавиатуру в целевой системе.

Поскольку вы используете инструменты с открытым исходным кодом для разработки STM32 (Makefile и arm-none-eabi), я предполагаю, что вы также используете openOCD для программирования своего микроконтроллера. openOCD требует, чтобы вы также включили полухостинг, используя следующую команду:

arm semihosting enable

Вы можете выполнить команду вашего скрипта openOCD, убедившись, что вы завершили стадию конфигурации и перешли на стадию выполнения с помощью команды init. Ниже приведен пример скрипта openOCD (адаптированного для STM32F103):

 source [find target/stm32f1x.cfg]
 init
 arm semihosting enable

Другие упомянутые здесь решения, в которых вы перенаправляете функцию fputc() на интерфейс UART, также будут работать и могут. Полухостинг будет работать на всех последних версиях ARM Cortex-M, но для этого потребуется некоторая конфигурация компилятора и отладчика (см. Выше). Перенацеливание функции fputc() на интерфейс UART будет работать с любым компилятором, но вам нужно будет проверить конфигурацию контактов для каждой платы.

person Guillaume Legrain    schedule 19.12.2016

Написание собственной printf реализации - это вариант и, на мой взгляд, наиболее рекомендуемый вариант. Вдохновляйтесь реализацией стандартной библиотеки и напишите свою версию только для удовлетворения ваших требований. В общем, что вам нужно сделать, это сначала перенацелить функцию putc для отправки char через ваш последовательный интерфейс. Затем переопределите метод printf, используя пользовательскую реализацию putc. Возможно, очень простой подход - посимвольная посылка строки рекурсивными вызовами функции putc.

И последнее, но не менее важное: вы можете найти несколько легких printf реализаций. Размер кода и набор функций, предлагаемых этими облегченными реализациями, находятся между написанной пользователем функцией printf и стандартной функцией printf (также известной как зверь). Недавно я попробовал этот Tiny Printf и очень доволен его производительностью на ядре ARM с точки зрения объема памяти и количества требуемых циклов выполнения.

-PS

Скопировано из моих собственных писем когда-то назад.

person SamR    schedule 26.09.2016

Посмотрите здесь. Это printf из glib. Но у вас есть микроконтроллер. Итак, вы должны написать собственный printf, где vfprintf вернет результат в буфер, а затем вы отправите данные из буфера в UART. Вид

void printf( const char * format, ... )
{
  char buffer[256];
  va_list args;
  va_start (args, format);
  vsprintf (buffer,format, args);
  send_via_USART1 (buffer);
  va_end (args);
}

Также вы можете написать собственный vsprintf. Standart vsprintf очень тяжелый. Обычно используется небольшая часть vsprintf функций.

person Stephen Plyaskin    schedule 25.09.2016