实际上我们在加载某个程序的时候都自动带了虚拟串口,这个连接的就是我们的其中一个串口,主要是为了好调试,比如通过调试器打印的一些状态就是:
调试器的虚拟串口连接的是UART1,我们可以看到一些打印信息,就是通过这个串口出去的:
那么我们将通过这个串口接收数据,加入对LED模式的控制,我们先看一下调试的虚拟串口调试模式,在 BOARD_InitDebugConsole();中,可以看到调试串口的基本信息:
/* The UART to use for debug messages. */ #define BOARD_USE_LPUART #define BOARD_DEBUG_UART_TYPE kSerialPort_Uart #define BOARD_DEBUG_UART_BASEADDR (uint32_t) LPUART1 #define BOARD_DEBUG_UART_INSTANCE 1U #define BOARD_DEBUG_UART_CLK_FREQ (CLOCK_GetFreq(kCLOCK_ScgSircClk)) #ifndef BOARD_DEBUG_UART_BAUDRATE #define BOARD_DEBUG_UART_BAUDRATE (115200U) #endif /* BOARD_DEBUG_UART_BAUDRATE */
使用的就是LPUART1,波特率为115200.接下来我们看一下收到的数据如何处理,通过调试器的数据接收通过轮询的方式查看,并将数据回传:
LED_Mode = GETCHAR(); PUTCHAR(LED_Mode);
直接将收到的数据给到LED_Mode,然后定时器中进行处理,打印出来当前闪烁的灯,LED_Mode只能存储最后一个数:
void LPTMR0_IRQHANDLER(void) { uint32_t intStatus; /* Reading all interrupt flags of status register */ intStatus = LPTMR_GetStatusFlags(LPTMR0_PERIPHERAL); LPTMR_ClearStatusFlags(LPTMR0_PERIPHERAL, intStatus); /* Place your code here */ LED_TimeCnt++; if(LED_TimeCnt >= 50) { LED_TimeCnt = 0; if(LED_Mode != LED_Modeing){ GPIO_PortSet(BOARD_INITPINS_LED_GREEN_GPIO, 1U << BOARD_INITPINS_LED_GREEN_PIN); GPIO_PortSet(BOARD_INITPINS_LED_BLUE_GPIO, 1U << BOARD_INITPINS_LED_BLUE_PIN); GPIO_PortSet(BOARD_INITPINS_LED_RED_GPIO, 1U << BOARD_INITPINS_LED_RED_PIN); GPIO_PortSet(BOARD_INITPINS_LED_B_GPIO, 1U << BOARD_INITPINS_LED_B_PIN); LED_Modeing = LED_Mode; switch(LED_Modeing){ case 0: PRINTF("\r\n RGB_GREEN blinking\r\n"); break; case 1: PRINTF("\r\n RGB_BLUE blinking\r\n"); break; case 2: PRINTF("\r\n RGB_RED blinking\r\n"); break; case 3: PRINTF("\r\n LED_B blinking\r\n"); break; default: break; } } switch(LED_Modeing){ case 0: GPIO_PortToggle(BOARD_INITPINS_LED_GREEN_GPIO, 1U << BOARD_INITPINS_LED_GREEN_PIN); break; case 1: GPIO_PortToggle(BOARD_INITPINS_LED_BLUE_GPIO, 1U << BOARD_INITPINS_LED_BLUE_PIN); break; case 2: GPIO_PortToggle(BOARD_INITPINS_LED_RED_GPIO, 1U << BOARD_INITPINS_LED_RED_PIN); break; case 3: GPIO_PortToggle(BOARD_INITPINS_LED_B_GPIO, 1U << BOARD_INITPINS_LED_B_PIN); break; default: break; } } /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping exception return operation might vector to incorrect interrupt. */ #if defined __CORTEX_M && (__CORTEX_M == 4U) __DSB(); #endif }
可以看到下面的控制模式,灯是跟随着变化的:
变个装看一下:
这个里相当于偷懒了,直接用的调试虚拟串口进行的。