2016-09-23 2 views
0

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

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

Любой может дать мне демо-код для printf, который хорошо работает?

Часть моего Makefile:

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 
+1

Что вы подразумеваете под "это не работает"? И это микроконтроллер, где вы ожидаете, что текст будет напечатан? Обычно при программировании для внедренной цели вы создаете свой собственный 'print' набор функций, который использует UART (или другие протоколы связи). Найдите некоторые библиотеки UART или, возможно, некоторые библиотеки отладки, которые используют ваш отладчик (например, Segger RTT с JLink Viewer на вашем ПК, если у вас есть отладчик Segger). – Tim

+0

Я использую не-eabi-comcom. Это проблема. Я знаю, как использовать printf в проекте keil. и я использую USART1 для вывода. пытаетесь ли вы использовать этот компилятор для создания файла bin. –

ответ

0

Look there. Это 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. Стандарт vsprintf очень тяжелый. Обычно используется небольшая часть функций vsprintf.

2

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

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

-PS

Скопировано из моего writings некоторое время назад.

1

Ссылка: How to retarget printf() on an STM32F10x?

Попробуйте угон функцию _write так:

#define STDOUT_FILENO 1 
#define STDERR_FILENO 2 

int _write(int file, char *ptr, int len) 
{ 
    switch (file) 
    { 
    case STDOUT_FILENO: /*stdout*/ 
     // Send the string somewhere 
     break; 
    case STDERR_FILENO: /* stderr */ 
     // Send the string somewhere 
     break; 
    default: 
     return -1; 
    } 
    return len; 
} 

оригинальный Printf будет проходить через эту функцию (в зависимости от того, что ЛИЭС вы используете, конечно).

+0

Я использую этот метод на STM32F072. Подробности здесь. http://electronics.stackexchange.com/questions/206113/how-do-i-use-the-printf-function-on-stm32/279945#279945 –

0

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

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

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

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

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

Поскольку вы используете OpenSource инструменты для разработки STM32 (Makefile и рука-ни-EABI), я предполагаю, что вы также используете OpenOCD для программирования микроконтроллера. OpenOCD требует, чтобы включить semihosting, а также с помощью следующей команды:

arm semihosting enable 

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

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

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

Смежные вопросы