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

【经验分享】STM32网络之中断

[复制链接]
STMCU小助手 发布时间:2022-4-16 21:00
之前的推文已经将STM32网络的三大件讲完了
$ Y  I1 G. n7 H8 o! \) f) T4 K; T$ l
800b6b599e12e4c4e990a98c97f83a29.jpg : f/ L+ F) w2 L, d: n
) Y! C8 L! D+ q# e0 }7 c
本文将聚焦STM32网络的中断系统,简单聊一下中断系统和用法。
" [- m/ V2 H* \. C/ @: Q$ F" V+ T( {& p7 b) w/ M% M* Y
01、简介, N4 R. H0 _( v
网络中断向量:一个用于正常的网络操作,另一个当它映射到EXIT线路19的时候,用于以太网唤醒事件(带有唤醒帧或魔术数据包检测)) f/ J! ~" c! W

4 L$ x/ K) [$ O$ d- P& o第一个网络中断保留为MAC和DMA产生的中断,正如在MAC中断和DMA中断部分。
0 ?" y* H) d8 h  |7 }/ E
. T9 M9 g8 M6 G. W第二个中断保留为唤醒事件时PMT产生的中断。唤醒事件对EXIT线路19的映射是造成STM32F20X和STM32F21X退出低功耗模式,并且产生中断。
4 T1 }4 ~7 P, o0 H
4 i. T# W3 v/ {$ m3 U% E8 p当映射到EXIT线路19的以太网唤醒事件发生和,MACPMT中断使能并且有一个上升沿的EXIT线路19中断也被使能,他们都能唤醒中断。4 R% u6 S! W9 Z8 j% c: f; y: c

; o1 H; x2 C$ A5 O( I可使用看门狗定时器(请参见ETH_DMARSWTR 寄存器)灵活控制RS 位(ETH_DMASR寄存器)。当此看门狗定时器使用非零值编程时,看门狗定时器激活,只要RXDMA完成发送一个接收的数据帧到系统存储,在没有触发接收状态,因为它不是使能的在相应的接收描述符(RDES1[31])(也就是:未在相应接收描述符(RDES1[31])使能接收状态)。当定时器按照编程值运行时,RS位被置1并且中断发生,如果ETH_DMAIER寄存器中相应位使能。看门狗定时失效在运行前,当数据帧被发送到内存,并且RS置1,因为定时器被使能为描述符。4 ~, k% \% s8 C, Q* M
" |* X4 L% L9 ~$ R. j. U/ e# B
注意:
$ h% O* x% t0 R( T
$ U  E, L, g6 Z" ]读取PMT 控制和状态寄存器会自动将接收的唤醒帧和接收的魔术数据包PMT 中断标志清零。但是,由于用于这些标志的寄存器位于 CLK_RX域,因此在固件能发现此更新前可能有显著的延迟。当 RX 时钟很慢(在10 Mbit 模式)和当AHB 总线为高频时,该延迟会特别长。8 M: P; h# M( |+ y" j5 d
. e4 l9 s' @2 b% Y6 ?' M$ Q% J. S7 L
由于从PMT 到CPU 的中断请求基于CLK_RX 域中的相同寄存器,所以即使在读取PMT_CSR 之后,CPU也可能错误地第二次调用中断例程。因此,可能需要固件轮询接收的唤醒帧和接收的魔术数据包位,并仅在发现它们都为‘0’时退出中断服务程序。: `7 N7 [0 W7 I7 U2 U* x( U
& A. B/ O4 \' a/ U
02、代码  O, g3 j; h) F3 P1 X( R7 K8 Q
STM32的网络中断,其实准确来说应该是网络专用的DMA的中断,网络中的数据包符合1518规则,也就是说是1460字节,MAC接收的数据包是2K字节,网络上每一个数据包MAC接收完都会产生中断。
) e; [1 z* R" E; @! I# ?! Z
/ W( v0 l" A. o, F7 _3 o官方代码是这样的
) o) x- [( a8 ?! N9 e; Y0 { c2fa744ba0d17d81d5b5f2937689d1f3.png
" O3 \2 H, x3 R0 M% _% x) ^' {  j
明显是使用查询的方式,没有使用到中断。
+ c  }/ V  u* m) W9 s
# J+ g* N3 E+ ~; S, }4 |. z: F中断的使用方式如下:
: n! ~; ]2 s% `  W
0 y- k5 N1 S6 }配置网络中断
+ Z) R8 t2 T6 U; d# ^8 V9 U
' M& ?5 L8 n) B3 V" T1 a$ b9 [5 L 7ac4a64147e78f084c88b2b3bb5c89a0.png
. L3 E6 W% r5 T+ l  D/ q; u3 Q
. f6 z9 x( [2 V$ z  h9 d! C& M注释掉官方提供的查询部分的代码。- @3 }0 d5 v+ O$ G
: W% L+ D, b6 E& v1 u! ]0 s2 p4 N
649db7896387adab6007f4c7dcb2499c.png
! ^/ P( r; _( t3 t
" T- I! Q+ ?6 D3 B我们使用中断形式之后,代码是( Q: I+ @/ I8 _, ?$ E0 t1 V
- M9 ~. |* O2 s8 n0 N7 A/ {' S
ee76df5ad3c9876a87d5cdfae313c129.png
' B$ E# N9 L( B+ T) T  c6 I* e2 E3 P" C0 A- ^* b
这样的代码,我们在接收小于一个DMA描述符数据大小的数据没有问题,很流畅。
% c) a  k: p, Q7 R
8 v/ A5 t5 U8 B  T  ?5 F  `* C) J; }7 q# h) d4 ~* g# w% @+ Y
在接收大量数据的时候就会出现错误,接收的会缓慢,接收的过多会死机/ L/ F! |7 A. L$ ~# ?0 ^
* J( }4 G3 \& @* E" h* @
解决办法是:/ v( F& Q  Q, h1 b$ T' A6 }0 I7 \
; Y3 G! m9 j, B% }3 S
把if修改成while
# n/ D0 a# s4 f; w; x2 }6 g" t( C! V4 a$ \
2523cab531339225dbbd1707b4875f5a.png
! J- ]% g2 c" `* ?9 D3 O
" O5 W. q) c; |, r3 W# c/ z这样就把整个数据包接收完之后再跳出中断,这样就解决了这个问题。
, V! Q8 m: T$ J, J  ~% f) q+ A- \: A, R: f! [) E& r3 Y, N3 a
; ~  D: p# M* m# Z1 I* U
赞 收藏 评论0 发布时间:2022-4-16 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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