реклама на сайте
подробности

 
 
> Прикрутить программный FIFO для UART LPC17XX, Как лаконично организовать?
kt368
сообщение Oct 11 2013, 21:11
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



Здравствуйте! Вывожу в UART с помощью printf(), предварительно подправив Retarget.c, в функцию fputc() внес следующее:
Код
int fputc(int c, FILE *f) {
    UART_SendByte(LPC_UART0, c);
    return (c);}
Когда я предаю по UART длинные строки при помощи printf, то реально передаётся только первая часть строки, это по-идее происходит из-за наличия в модуле UART 16-и байтового аппаратного FIFO. Хочу подправить функцию fputc(), введя в неё программный FIFO, дабы иметь возможность передавать одной командой printf() большие строки. Можно, конечно, ввести в fputc() проверку освобождения аппаратного FIFO, но тогда процессор будет тратить такты впустую, чего не хочется. Подскажите, как бы его так сделать, чтобы между printf() и модулем UART'a был программный FIFO, и в то же время этот FIFO со как-то освобождался, то-ли по прерыванию от таймера, то-ли ... Как правильнее это реализовать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kt368
сообщение Oct 11 2013, 21:30
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 454
Регистрация: 13-10-10
Из: Киев
Пользователь №: 60 135



Не до конца объяснил. printf действительно про фифо ничего не знает, вот и гонит в UART_SendByte() по байтику всю строку, а UART_SendByte() вот такая:
Код
void UART_SendByte(LPC_UART_TypeDef* UARTx, uint8_t Data)
{
    UARTx->THR = Data & UART_THR_MASKBIT;
}

То есть эта функция просто вносит в регистр передаваемых данных ещё один байт, не проверяя есть ли свободная ячейка в аппаратном фифо.
....Хм, пересмотрел код, у меня, кажется, аппаратный фифо был выключен. Попробую его включить, завтра получу доступ к железу - протестирую как теперь будет работать printf() с большими строками и отпишусь.
Go to the top of the page
 
+Quote Post
Lagman
сообщение Oct 11 2013, 21:36
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Цитата(kt368 @ Oct 12 2013, 01:30) *
Не до конца объяснил. printf действительно про фифо ничего не знает, вот и гонит в UART_SendByte() по байтику всю строку, а UART_SendByte() вот такая:
Код
void UART_SendByte(LPC_UART_TypeDef* UARTx, uint8_t Data)
{
    UARTx->THR = Data & UART_THR_MASKBIT;
}

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

Так в этом случае не то что длинные строки, любая строка должна выводиться абракадаброй т.к. THR постоянно перезаписывается новыми данными, а что в сдивговый регистр попадет никто не узнает пока не увидит результат вывода на экран. (общий рецепт может не иметь ничего общего с LPC17XX)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 22:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01392 секунд с 7
ELECTRONIX ©2004-2016