пятница, 12 июля 2019 г.

printf() в SW4STM32

Стандартная библиотека stdio.h содержит процедуры и функции, помогающие организовать общение с юзером в консольном стиле. То есть, описывает стандартный ввод-вывод. Особенно полезна printf() как способ форматированного вывода.
Для доступа к эти возможностям нам всего-то нужно рассказать компилятору как нужно вывести в консоль один символ и как получить из консоли символ. Для этого уже есть "слабые" заглушки, которые мы перекроем своей реализацией.
К примеру, хотим консоль на USART1. Настраиваем порт на работу в асинхронном режиме и добавляем нужный ввод-вывод символа.

int __io_putchar(int ch) {
    // ждем пока буфер передатчика будет готов принять символ
    while ( !(LL_USART_IsActiveFlag_TXE(USART1)) );

    // отсылаем символ в передатчик
    LL_USART_TransmitData8(USART1, ch);
    return 0;
}


int __io_getchar(void) {
    // ждем прихода байта
    while ( !(LL_USART_IsActiveFlag_RXNE(USART1)) );
    return LL_USART_ReceiveData8(USART1);
}
 

Если же хотим дебажить через SWO (не забыть разрешить Trace Asynchronous SW), то вывод байта такой

int __io_putchar(int ch)  {
    ITM_SendChar(ch);
    return ch;
}
Вот и вся премудрость. Остальное уже все сделано до нас ;)


Комментариев нет:

Отправить комментарий