你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32串口接收硬件FIFO的实现

[复制链接]
wjandsq 发布时间:2017-1-23 13:29
本帖最后由 wjandsq 于 2017-1-25 12:59 编辑 8 N2 ?; w& j# n. b
; S) U9 e9 N7 J2 j
众所周知,STM32串口通讯,接收及发送都没有设计硬件FIFO,这对大部分程序员来说,算是一个硬伤。但实际上,由于STM32串口可以利用DMA收发,这样比固定16字节的FIFO更灵活。
; c0 z' S* c* A& m  G& Q. h' c7 ^6 u0 }  d- }
& }/ U9 s5 w) |4 s  a: d8 C
在编写串口接收的bsp层代码时,同时启动DMA接收和空闲中断,就可以实现一个硬件接收缓冲,在空闲中断中,
7 G! ]: q6 q" R& B, W实现数据从硬件接收缓冲的读取。" }# r  @3 k/ Q

# M, X, p& e# t3 g+ |! Z( n: K串口接收bsp层接收缓冲两层结构: R$ u6 A  B7 Z+ C7 v
--第一层FIFO硬件接收缓冲 (第一层硬件FIFO接收缓冲,利用DMA自动传输,不占用CPU时间,一般大小可设置为16-1024字节)
; S( ^$ u( z8 J# Q* q) f1 v2 ]7 n6 y--第二层FIFO软件接收缓冲 (第二层软件FIFO接收缓冲,在DMA传输完毕中断中处理,缓冲可设置的比较大,一般是1024~8192字节)
3 e9 d$ [4 z) d- n4 b" U0 c0 H( y5 c" v  k% i

! h- S7 a. Z' N5 p0 ~, q) t9 T+ s
+ A: z% N$ k8 I) @, Z1 ?$ s

评分

参与人数 1 ST金币 +10 收起 理由
zero99 + 10

查看全部评分

赞 收藏 1 评论16 发布时间:2017-1-23 13:29

举报

16个回答
wjandsq 回答时间:2017-1-25 17:02:41
HAL库串口空闲中断处理代码:3 M) U* h0 _/ y: h' l. Y0 f; P
4 o7 A8 b4 `  Q& a' F
  /* UART in mode Transmitter end --------------------------------------------*/
3 ^+ s  E2 C) M" k$ T2 f  if(((isrflag & USART_SR_TC) != RESET) && ((crlits & USART_CR1_TCIE) != RESET))
2 c- G9 Q3 {# O1 M. m: m1 d  s  {
7 Q# C6 Q9 m3 E9 y: f    UART_EndTransmit_IT(huart);: [  u: j% w! {6 J* y  R, V
    return;( H6 S5 e, m: I  L4 y3 F
  }
7 d3 I, G" b+ \  /* UART in mode Receiver end -----------------------------------------------*// p& R) ?3 n; |: N
  if(((isrflags & USART_SR_IDLE) != RESET) && ((crlits & USART_CR1_IDLEIE) != RESET))
& ~$ V; Y5 a4 z9 _9 d3 F  {* B" Q: H+ e% A' O( b+ M
    /* Clear the UART IDLE pending flag */
8 P8 [2 ~& b- k0 j- S8 d    __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
}
, q9 G* v6 H, N
wjandsq 回答时间:2017-1-23 14:01:37
发送一般没有问题,这里主要说接收。波特率低的话,中断可以。波特率高的话,如果是5Mbps,2.2微秒需要接收一个11位串口字符,中断方式显然不现实。
zoomdy 回答时间:2017-1-23 16:04:32
wjandsq 发表于 2017-1-23 14:11/ I3 Z1 B0 A; U% a+ \2 o
HAL库的串口中断函数,并没有认真考虑DMA和空闲中断,非常不专业。
2 M* @3 l, B4 L, b+ F9 \: |% B
没有空闲中断确实很棘手
zero99 回答时间:2017-1-23 13:32:45
这是个讨论帖?
wjandsq 回答时间:2017-1-23 13:33:26
但实际上,由于STM32串口可以利用DMA收发,这样比固定16字节的FIFO更灵活。
wjandsq 回答时间:2017-1-23 13:34:03
说的是实现思路
wjandsq 回答时间:2017-1-23 13:38:45
同时启动DMA接收和空闲中断,就可以实现一个硬件接收缓冲,空闲中断中,实现数据从硬件接收缓冲的读取。
wjandsq 回答时间:2017-1-23 13:42:42
在3至10Mbps串口通讯的情况下,只有这一个办法。逐个字符中断式接收来不及。
jcx0324 回答时间:2017-1-23 13:54:19
数据流大用DMA比较舒服的,比如发送DMX512的数据
wjandsq 回答时间:2017-1-23 14:11:53
HAL库的串口中断函数,并没有认真考虑DMA和空闲中断,非常不专业。
wjandsq 回答时间:2017-1-23 14:17:21
中断函数应该展开(高速收发仅打开发送完成中断和空闲中断),DMA中断应该跟根据用户定义存在别名。
jtc_88 回答时间:2017-1-23 16:09:26
hal 的 bug 是 没有 带DMA 的 空闲中断配置  都需要 后期 改
zbber 回答时间:2017-1-23 22:49:34
说的是实现思路
wjandsq 回答时间:2017-1-24 22:47:05
没有空闲中断,应该算是HAL库不完善。
& \! f: \6 w$ r, y0 h+ Q另外,接收完数据,不应该自以为是的关闭串口,应该由用户决定是否关闭。
any012 回答时间:2017-1-25 13:31:42
请教,第二层软件FIFO缓冲是什么意思?实现什么功能?
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版