|
本帖最后由 wjandsq 于 2017-1-25 12:59 编辑 8 N2 ?; w& j# n. b ; S) U9 e9 N7 J2 j 众所周知,STM32串口通讯,接收及发送都没有设计硬件FIFO,这对大部分程序员来说,算是一个硬伤。但实际上,由于STM32串口可以利用DMA收发,这样比固定16字节的FIFO更灵活。 & Q. h' c7 ^6 u0 } d- } & }/ U9 s5 w) |4 s a: d8 C 在编写串口接收的bsp层代码时,同时启动DMA接收和空闲中断,就可以实现一个硬件接收缓冲,在空闲中断中, 实现数据从硬件接收缓冲的读取。" }# r @3 k/ Q 串口接收bsp层接收缓冲两层结构: R$ u6 A B7 Z+ C7 v --第一层FIFO硬件接收缓冲 (第一层硬件FIFO接收缓冲,利用DMA自动传输,不占用CPU时间,一般大小可设置为16-1024字节) --第二层FIFO软件接收缓冲 (第二层软件FIFO接收缓冲,在DMA传输完毕中断中处理,缓冲可设置的比较大,一般是1024~8192字节) 0 c0 H( y5 c" v k% i |
微信公众号
手机版
4 o7 A8 b4 ` Q& a' F
/* UART in mode Transmitter end --------------------------------------------*/
if(((isrflag & USART_SR_TC) != RESET) && ((crlits & USART_CR1_TCIE) != RESET))
{
UART_EndTransmit_IT(huart);: [ u: j% w! {6 J* y R, V
return;( H6 S5 e, m: I L4 y3 F
}
/* UART in mode Receiver end -----------------------------------------------*// p& R) ?3 n; |: N
if(((isrflags & USART_SR_IDLE) != RESET) && ((crlits & USART_CR1_IDLEIE) != RESET))
{* B" Q: H+ e% A' O( b+ M
/* Clear the UART IDLE pending flag */
__HAL_UART_CLEAR_IDLEFLAG(huart);$ `; S ^9 ?) o& m
return;+ c9 R; E; V3 ]9 t+ z4 V
}# e% ]& f- H+ w7 d6 I% d) o% e
}
没有空闲中断确实很棘手
另外,接收完数据,不应该自以为是的关闭串口,应该由用户决定是否关闭。