Для начала добавим функцию интерактивного меню, где собственно и будет разбор команд:
/* 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);
}
}