Использование Printf для отображения на последовательном порту микроконтроллера ARM

StackOverflow https://stackoverflow.com/questions/1699763

Вопрос

Я хотел бы использовать printf для отображения текста на последовательном порту микроконтроллера ARM.Я не могу этого сделать.Любая помощь приветствуется.

Мой init_serial выглядит так

void init_serial (void)
{
PINSEL0 = 0x00050000; /* Enable RXD1 TxD1 */
U1LCR = 0x00000083; /*8 bits, 1 Stop bit */
U1DLL = 0x000000C2; /*9600 Baud Rate @12MHz VPB Clock */
U1LCR = 0x00000003; /* DLAB=0*/
}

что явно неправильно.

Это было полезно?

Решение

Для микроконтроллеров обычно приходится определять свои собственные putc функция для отправки байтов в любой UART, который вы используете. print тогда позвоню твоему putc.

Проверьте документацию по библиотекам, поставляемым с вашим компилятором.

Обратите внимание, что это совершенно не связано с тем, как вы инициализируете свой UART.Все, что имеет значение, это который UART, который вы используете.

(По несвязанному вопросу, вместо того, чтобы сказать:

PINSEL0 = 0x00050000; /* Enable RXD1 TxD1 */
U1LCR   = 0x00000083; /*8 bits, 1 Stop bit */

обычно есть #defines для регистров, которые (обычно) улучшают читаемость, предоставляют ссылки на имена битов в документации и уменьшают необходимость добавления и поддержки комментариев в каждой строке, подобной этой.Например:

PINSEL0 = PICSEL0_RXD1EN | PICSEL0_TXD1EN;
U1LCR   = U1LCR_8BITS | U1LCR_1STOPBIT;

..и так далее.)

Другие советы

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

С точки зрения библиотеки C, putc() функция будет выполняться до завершения, поэтому вам решать, реализовать ли ее как простую блокирующую функцию (ожидание освобождения последовательного порта и отправку символа) или неблокирующую функцию (помещение ее в буфер для быть отправлено задачей фонового прерывания;но буфер может заполниться, если вы выведете достаточно байтов достаточно быстро, и тогда вам придется либо блокировать, либо отбрасывать символы).Вы также можете заставить его правильно работать с вашей RTOS, если она у вас есть, реализовав блокирующую запись, которая находится в режиме ожидания на семафоре до тех пор, пока последовательный порт не станет доступен.

Итак, вкратце, прочтите документацию к вашему компилятору и его библиотеке C, и она расскажет вам, что вам нужно сделать, чтобы printf() работа.

Примеры ссылок для AVR micro с компилятором GCC:

Компилятор ARM GCC с использованием библиотеки newlib C:

Я не уверен насчет ARM в частности...

Для некоторых чипов в IDE вам необходимо указать, что вам нужна куча для использования printf и насколько она должна быть большой.Программист не включит его автоматически.

Загляните в меню вашего программатора/IDE и посмотрите, есть ли место для указания размера кучи.

И я согласен со Стивом, это только в том случае, если вы действительно можете использовать printf, в противном случае напишите свой собственный небольшой фрагмент.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top