工具与软件:
我目前正在使用 TM4C129ENCPDT 微控制器上的 FreeRTOS。 为了省电、我在空闲挂钩中使用深度睡眠、如下所示:
void vApplicationIdleHook( void ) { SysCtlDeepSleep(); }
我的 UART 配置为:波特57600、UART 时钟为16MHz 的 PIOSC。
SysCtlPeripheralEnable(UART0_BASE); UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); UARTConfigSetExpClk(UART0_BASE, 16000000, 57600, (UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE | UART_CONFIG_WLEN_8)); UARTEnable(UART0_BASE); IntEnable(INT_UART0); UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);
在 UART 中断处理程序中、我将复制接收到的字节到 FreeRTOS 队列中(另一个任务将处理该队列):
void UARTIntHandler(void) { // Get the interrupt status. uint32_t status = UARTIntStatus(UART0_BASE, true); // Clear the asserted interrupts. UARTIntClear(UART0_BASE, status); portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; while(UARTCharsAvail(UART0_BASE)) { char c = UARTCharGetNonBlocking(UART0_BASE); // Read the next character from the UART and write it into the UART buffer xQueueSendFromISR(UARTBytesQueue, &c, &xHigherPriorityTaskWoken); } portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); }
我的问题是:当我向 MCU 发送一条超过16个字节的消息时、只有前16个字节被正确接收。 我怀疑这是由于内部 UART FIFO 缓冲区是16个字节、并且我的代码从深度睡眠模式中唤醒需要太长的时间、因此 UART FIFO 缓冲区会填满并导致后续字节丢失。 如果我使用 SysCtlSleep ()而不是 SysCtlDeepSleep ()、则不会出现问题。
是否有办法增大 UART FIFO 缓冲区大小? 如果没有、如何解决该问题、以确保在 MCU 唤醒时从 UART 接收到的字节不会丢失? 我想在处理器空闲时进入深度睡眠模式、但似乎我无法在 UART FIFO 填满之前足够快地从深度睡眠模式中唤醒。