Solution of exercise 5.1 from> https://forbot.pl/blog/kurs-stm32-5-komunikacja-z-komputerem-uart-id8439

#include "stm32f10x.h"

int main(void)
{
    GPIO_InitTypeDef gpio;
    USART_InitTypeDef uart;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
            | RCC_APB2Periph_GPIOC, ENABLE);
//    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

    GPIO_StructInit(&gpio);
    gpio.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
    gpio.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &gpio);

    gpio.GPIO_Pin = GPIO_Pin_3;
    gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &gpio);

    USART_StructInit(&uart);
    uart.USART_BaudRate = 115200;
    USART_Init(USART2, &uart);

    USART_Cmd(USART2, ENABLE);

    while(1) {
        if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE)) {
            char c = USART_ReceiveData(USART2);
            switch(c) {
            case 'A':
                GPIO_SetBits(GPIOC, GPIO_Pin_0);
                break;
            case 'a':
                GPIO_ResetBits(GPIOC, GPIO_Pin_0);
                break;
            case 'B':
                GPIO_SetBits(GPIOC, GPIO_Pin_1);
                break;
            case 'b':
                GPIO_ResetBits(GPIOC, GPIO_Pin_1);
                break;
            }
        }
    }
}