本帖最后由 旮旯旭 于 2020-11-21 11:15 编辑
06_STM32V6_UART_RX_TIMEOUT_Timer.rar
(3.31 MB, 下载次数: 61)
除了空闲中断接收超时方式还可以使用定时器来协同处理超时接收,空闲中断的超时是由硬件完成的超时判断,时间为一个数据的传输时间(和波特率校验位和停止位相关)。
定时器完成的超时判断的原理是使用开启串口单数据接收,每接收到一个数据,给超时计数器装载超时值 默认10ms,在定时器里面对这个值递减,当递减到0时,接收完成
为何不直接使用HAL_UART_Receive_IT,HAL_UART_Receive_DMA。 因为接收完成在进入callback之前如果是DMA接收完成是先进入的UART_DMAReceiveCplt, 在这个函数里面会清除USART_CR3_DMAR,所以我们无法知道上一次是什么接收模式, 因此在BspUart_t结构体里面加入了 rxDma变量,使用BSP_UART_Receive_IT或BSP_UART_Receive_DMA开启接收。
在接收到一个数据之后会进入串口接收完成
HAL_UART_RxCpltCallback
接收到一个数据后g_tBspUart.rxTimeCount= 10; 这个计数器放在定时器中断里面处理 每1ms执行一次递减, 如果在递减为0之前有接收到新的数据,重新重装为10,当递减到0时,说明2个字节接收超过了10ms,接收完成标志 rxFlag = 1; 接收到的数据长度 rxLen = rxDataCount;并且清除计数器,由于是单数据接收,开启是在接收完成中断里打开的,在这里并不需要再开启接收。 单数据接收到一个数据就接收完成了和IDLE方式不一样。
|