Последовательный порт очень полезен при отладке программ, а также может быть использован в различных устройствах

Программатор платы Mik32-V2 имеет встроенный USB-UART преобразователь, его можно отключить при помощи двух перемычек на части платы с программатором (обозначено CON13).

Этот последовательный порт выведен к UART_1 микроконтроллера и находится на GPIO 1.9 (TX) и 1.8 (RX)

Для вывода в последовательный порт компьютера, нужно будет немного исправить стандартную библиотеку:

Напечатайте в программе функцию xputc() и щелкните по ней правой кнопкой мыши. Выберите пункт "Go to definition"

Откроется исходный код этой функции

Замените функцию xputc и добавьте одну новую (в файле uart_lib.c)

UART_TypeDef* useUART = UART_1;

void setUART(UART_TypeDef* u) {  // Set UART used for xprintf command
    useUART = u;
}

void __attribute__((weak)) xputc(char c)
{
	UART_WriteByte(useUART, c);
	UART_WaitTransmission(useUART);
}

Продекларируйте функцию в файле uart_lib.h

void setUART(UART_TypeDef* uart);

Теперь можно выбирать, в какой из UART портов будет отправлено сообщение при помощи функции setUART()

Например: setUART(UART_0) или setUART(UART_1)

// Для использования языка C, удалите "extern..."

extern "C" {
    #include "mik32_hal_timer32.h"

    #include "xprintf.h"
    #include "uart_lib.h"
    #include "stdlib.h"
}

void SystemClock_Config(void)       // Функция настройки всех часов мироконтроллера
{
    PCC_InitTypeDef PCC_OscInit = {0};

    PCC_OscInit.OscillatorEnable = PCC_OSCILLATORTYPE_ALL;
    PCC_OscInit.FreqMon.OscillatorSystem = PCC_OSCILLATORTYPE_OSC32M;
    PCC_OscInit.FreqMon.ForceOscSys = PCC_FORCE_OSC_SYS_UNFIXED;
    PCC_OscInit.FreqMon.Force32KClk = PCC_FREQ_MONITOR_SOURCE_OSC32K;
    PCC_OscInit.AHBDivider = 0;
    PCC_OscInit.APBMDivider = 0;
    PCC_OscInit.APBPDivider = 0;
    PCC_OscInit.HSI32MCalibrationValue = 128;
    PCC_OscInit.LSI32KCalibrationValue = 128;
    PCC_OscInit.RTCClockSelection = PCC_RTC_CLOCK_SOURCE_AUTO;
    PCC_OscInit.RTCClockCPUSelection = PCC_CPU_RTC_CLOCK_SOURCE_OSC32K;
    HAL_PCC_Config(&PCC_OscInit);
}

int main() {
    SystemClock_Config(); // Настройка всех часов микроконтроллера

    // Параметр 1: номер UART, например UART_0 или UART_1
    // Параметр 2: Делитель частоты (делитель = 32`000`000 / скорость передачи)

    UART_Init(UART_1, 3333, UART_CONTROL1_TE_M | UART_CONTROL1_M_8BIT_M | UART_CONTROL1_RE_M, 0, 0);
    setUART(UART_1); // Указать UART_1 для печати при помощи xprintf

    xprintf("UART init\n"); // Функция печати
    xprintf("9*9 = %d\n", 9*9); // Может выводить числа в десятичном виде (%d)
    xprintf("hex(37) = %x\n", 37); // Может выводить числа в шестнадцатеричном формате (%x)
    xprintf("Hello, %s!!!\n\n", "world"); // Может выводить строки (%s)

    xprintf("Enter your name:\n");

    const uint32_t len = 32;      // Длина буфера для ввода

    char buffer[len];             // Создание буфера, куда будет созранено введенное сообщение
    int i = 0;  // Номер символа, который сейчас считывается
    char c;   // символ, считанный из UART

    while(c!='\n' and i < len - 1) {    // Пока не пришёл символ конца строки и буфер не переполнился
        UART_WaitReceiving(UART_1);  // Функция ждёт, пока не придет символ
        c = UART_ReadByte(UART_1);   // В переменную c записывается пришедший символ
        buffer[i] = c;  // Символ дописывается в конец буфера
        i++;  // Номер ячейки увеличивается на 1
    }

    buffer[i-1] = 0;  // В конце строки обязательно должен стоять символ '\0' = (int) 0

    xprintf("Hello, %s!\n", buffer);

}