Использование Printf для отображения на последовательном порту микроконтроллера ARM
-
19-09-2019 - |
Вопрос
Я хотел бы использовать 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 */
обычно есть #define
s для регистров, которые (обычно) улучшают читаемость, предоставляют ссылки на имена битов в документации и уменьшают необходимость добавления и поддержки комментариев в каждой строке, подобной этой.Например:
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, в противном случае напишите свой собственный небольшой фрагмент.