STM32串口使用DMA方式接收数据可以减小CPU的开销。对于接收定长数据,可以将DMA接收缓冲区的长度设定为待接收数据的长度,这样利用DMA的传输完成中断DMAx_IT_TCy就可以知道已经接收了一帧数据。对于接收不定长数据,如何知道意见完成了数据的接收呢?可以结合串口的空闲中断来实现。
空闲中断是在检测到在数据收受后,总线上在一个字节的时间内没有再接收到数据时发生。即串口的RXNE位被置位之后才开始检测,检测到空闲之后,串口的CR1寄存器的IDLE位被硬件置1,必须采用软件将IDLE位清零才能避免反复进入空闲中断。具体的做法是先读取USART_SR,再读取USART_DR。需要注意的是,不能采用库函数USART_ClearFlag()或者USART_ClearItPending()来清除IDEL标注,因为这两个函数接收的中断标志位仅包括:
USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5)。
USART_FLAG_LBD: LIN Break detection flag.
USART_FLAG_TC: Transmission Complete flag.
USART_FLAG_RXNE: Receive data register not empty flag.
STM32串口使用DMA方式接收数据可以减小CPU的开销。对于接收定长数据,可以将DMA接收缓冲区的长度设定为待接收数据的长度,这样利用DMA的传输完成中断DMAx_IT_TCy就可以知道已经接收了一帧数据。对于接收不定长数据,如何知道意见完成了数据的接收呢?可以结合串口的空闲中断来实现。
空闲中断是在检测到在数据收受后,总线上在一个字节的时间内没有再接收到数据时发生。即串口的RXNE位被置位之后才开始检测,检测到空闲之后,串口的CR1寄存器的IDLE位被硬件置1,必须采用软件将IDLE位清零才能避免反复进入空闲中断。具体的做法是先读取USART_SR,再读取USART_DR。需要注意的是,不能采用库函数USART_ClearFlag()或者USART_ClearItPending()来清除IDEL标注,因为这两个函数接收的中断标志位仅包括:
USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5)。
USART_FLAG_LBD: LIN Break detection flag.
USART_FLAG_TC: Transmission Complete flag.
USART_FLAG_RXNE: Receive data register not empty flag.
举报