work.c

Создадим переменную где мы будем хранить принятый байт:

    char byte = '\0';

Проинициализируем порт к которому подключен УСАПП

    /* enable usart port*/
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;

А также сам УСАПП1:

    /* enable usart1 */
    RCC->APB2ENR |= RCC_APB2ENR_USART1EN;

Зададим режим для линий порта - альтернативные функции:

    /* setup usart1 pins to af mode */
    GPIOB->MODER |= GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1;

Выберем тип периферии для альтернативных функций линий порта в/в:

    /* select af block usart1..3(af7 function) to usart pins */
    GPIOB->AFR[0] |= (GPIO_AF7_USART1_3 << GPIO_AFP6) | (GPIO_AF7_USART1_3 << GPIO_AFP7);

Настроим частоту приема/передачи и активизируем линиии приема/передачи, сам УСАПП:

    /* usart1 setup baudrate */ /** 115200 baud 16MHz/16/115200 = 8.68 */
    USART1->BRR = (8 << 4) + 5;
    /* usart1 enable block and enable tx,rx lines */
    USART1->CR1 |= USART_CR1_TE;
    USART1->CR1 |= USART_CR1_RE;
    USART1->CR1 |= USART_CR1_UE;

В бесконечном цикле происходит весь процесс:

    /* infinity loop */
    while (1) {
        /* put intro char */
        usart_sendb(USART1, '#');

Прием байта:

        byte = usart_receiveb(USART1);
        usart_sendb(USART1, '>');

Его передача:

        usart_sendb(USART1, byte);
        usart_sendb(USART1, '\r');
        usart_sendb(USART1, '\n');
    }