|
本帖最后由 wjandsq 于 2017-1-25 12:59 编辑 9 R( R. f) o1 K1 f$ _ 众所周知,STM32串口通讯,接收及发送都没有设计硬件FIFO,这对大部分程序员来说,算是一个硬伤。但实际上,由于STM32串口可以利用DMA收发,这样比固定16字节的FIFO更灵活。2 K7 d& x3 S( K6 s* v: H ' ^! E# D/ v( ]9 Q1 C2 M9 i5 I 3 O2 X$ ^( {. j 在编写串口接收的bsp层代码时,同时启动DMA接收和空闲中断,就可以实现一个硬件接收缓冲,在空闲中断中,3 g. U/ ?; o' C# c0 _ 实现数据从硬件接收缓冲的读取。 串口接收bsp层接收缓冲两层结构 --第一层FIFO硬件接收缓冲 (第一层硬件FIFO接收缓冲,利用DMA自动传输,不占用CPU时间,一般大小可设置为16-1024字节)1 o: {% f! ]2 ^+ ~8 S- J7 b, B --第二层FIFO软件接收缓冲 (第二层软件FIFO接收缓冲,在DMA传输完毕中断中处理,缓冲可设置的比较大,一般是1024~8192字节) |
微信公众号
手机版
/* UART in mode Transmitter end --------------------------------------------*/% ^( ~7 D! N8 b$ W! v
if(((isrflag & USART_SR_TC) != RESET) && ((crlits & USART_CR1_TCIE) != RESET))
{- O# ^: E, d- o% \) G/ i0 H# b
UART_EndTransmit_IT(huart);
return;
} M! h8 F% S0 Q" Y
/* UART in mode Receiver end -----------------------------------------------*/, s# ~3 R" D% J9 N' M/ F' z
if(((isrflags & USART_SR_IDLE) != RESET) && ((crlits & USART_CR1_IDLEIE) != RESET))% _) C; s) O1 W+ U2 f
{( T* i; ^/ S9 k z) {6 g
/* Clear the UART IDLE pending flag */& C( A3 }; J6 U R4 ^$ \
__HAL_UART_CLEAR_IDLEFLAG(huart);1 g O/ K4 `# p4 z3 ]+ [
return;8 q+ _5 H2 e0 c/ a, x
}$ I' R: v* |) x( J" d. d
}! H8 A% h, r# M+ N
没有空闲中断确实很棘手
另外,接收完数据,不应该自以为是的关闭串口,应该由用户决定是否关闭。