work.c

Для начала добавим функцию интерактивного меню, где собственно и будет разбор команд:

/* interactive menu */
void inter_menu(char command) {
    usart_sendb(USART1, command);
    switch (command) {
        case 'a':
            /* enable leds */
            LED_PORT->ODR |= ALL_LEDS;
            break;
        case 'r':
            /* switch state to red led */
            LED_PORT->ODR  ^= RED_LED;
            break;
        case 'g':
            /* switch state to green led */
            LED_PORT->ODR  ^= GREEN_LED;
            break;
        case 'b':
            /* switch state to blue led */
            LED_PORT->ODR  ^= BLUE_LED;
            break;
        case 'o':
            /* switch state to orange led */
            LED_PORT->ODR  ^= ORANGE_LED;
            break;
        case 'n':
            /* disable leds */
            LED_PORT->ODR  &= ~ALL_LEDS;
            break;
        default :
            /* undefined command */
            command = 'u';
            break;
    }
    usart_sendb(USART1, '>');
    usart_sendb(USART1, command);
    usart_sendb(USART1, '\r');
    usart_sendb(USART1, '\n');
}

В основной фунции work(), мы добавим включение порта светодиодов, а также их начальную инициализацию, в бесконечный цикл добавим вызов функции интерактивного меню:

/* work */
void work() {
    char byte = '\0';
    /* enable usart & led ports*/
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIODEN;
    /* enable usart1 */
    RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
    /* setup led pins to output mode */
    LED_PORT->MODER |=
        GPIO_MODER_MODER12_0 | GPIO_MODER_MODER13_0 |
        GPIO_MODER_MODER14_0 | GPIO_MODER_MODER15_0;
    /* 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);
        inter_menu(byte);
    }
}