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

基于STM32中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:20
     STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:) E. f/ [4 L" s
/ O, d; H4 z, m* U
USART_IT_PE  :奇偶错误中断                                                   
4 x/ L0 H" v; W3 A0 t+ g! P5 z: y2 f+ o1 QUSART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断;                       $ R! `' c" u2 y1 |- q  i
USART_IT_TC  :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断;    USART_IT_RXNE :接收非空中断  ,接收到一个字符就产生一次中断                     ' d2 z+ w7 ?# v. T: K" j/ L+ K2 ]
USART_IT_ORE_RX :接收溢出中断                                          
% M) P& B5 N1 Z3 C
& R- {- m9 Y7 G! D$ g$ gUSART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别);                     
3 `6 Z, d3 \! l+ y% [) E$ aUSART_IT_LBD  :中断检测中断                                                
% O% ^! u, E3 X3 d8 k5 W
9 d, r9 |% @  Y; I; M5 pUSART_IT_CTS   :CTS中断   (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。)
8 R& v# s9 o- u% E. r  S

/ B6 G, P! y4 k# c9 a0 }( f" s0 f USART_IT_ERR :错误中断                                                                  
) q# N5 L* I7 f" A USART_IT_NE   :多缓冲区通信中的噪声标志                                                
" ]7 }4 a  p+ h. [: K+ I
* q2 K  @# r6 g1 P! h4 i* B USART_IT_FE :帧错误中断;- G0 L: Z4 y5 D) M! Y) a

- O% o8 P- f/ I2 X- W$ e
20170729232506459.jpg
+ A6 \& Q+ j" [; J+ g      
( T$ B- W" _+ i2 ]      如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。
! h' K+ a* x: g; x1 S
  V/ k8 E! w6 t8 h6 x% V. q; k
5582434bb5194f4094ccc75a9bc8d3b8.png 0 j; {( e7 i4 e+ D# q
% |1 s: `5 M/ s8 ]" B9 K1 U
dd3ac392dd3e4ec181c352a3b0df52b4.png
/ P; _; Y& R- @1 g
- n1 ^  p  k7 b* Q' \9 l9 r, p
9d9e89a3815f4c66b3047cf13055301e.png + E. }* g) S" h8 p+ f/ s
% V; Z6 J2 p" h1 U/ l% h0 O/ h+ w* q* k
       数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。) z7 q/ E% \' b! @* i
! Z" g: p" q9 E- u# h. k+ }
( `/ D  L  D% G. `6 X
遇到的问题% ~8 n  x2 c6 v" M9 ^% r3 ~( [* L6 L
1,程序一直在中断中,不进入while循环?( \. [, O# d( y' r0 @$ E. D
     可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。
# E. o; V/ K+ X7 I2 j
5 v( w& i5 p) H* z$ ~1 K: W
2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:. \1 b, r1 N5 r0 F6 n3 q
; G3 W- c2 ?( r- y# b/ u0 t
cace746bbce24c8ea4c6ca9fda9ab587.png
% X1 m, l* z. C) u+ l) |7 D. j) I' }

/ e1 z9 B7 r! X& j3 {% y3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,& V2 H+ ^+ a" L

* @! @! k! U1 n2 p  A$ m
a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;5 o$ u. H& V6 i9 R- ~! M. M/ N

- S) g% ~  c9 N% w0 S
b,不能在中断服务函数中进行浮点运算;
( Z& s  U4 f+ r' ~* B" G4 D  y8 F9 l
c,不能在中断服务函数中调用不可重入函数如printf等;9 X4 k8 |( W: f& _; W

, ?' Z  S' \9 A5 t5 P& B
d,不能传递参数;
' r: o5 b5 }9 d  z& w- l4 U3 C" ^) M1 o  H
; b/ ~% T1 u6 t7 L* @( k
附录:(各种中断的具体使用方法)
( m/ f$ O2 c; s
2 k6 b3 z" h/ @, i0 ]
a3fe1854d0414e57a0e55cb15caf8171.png : ^& G% k" w. q9 M0 x% t

8 E+ M. _0 C3 Q4 k& u' c
4c8f71f57c0649039ace9d44b510d4c6.png
4 K) m- w* k- ?. C! v, s; W
7 h8 a6 _% O; N
5130686851fd4e9d810e609c6fd22012.png 7 z2 G; `" Q0 |+ ?# u/ {* a2 O
! U& M5 T! [" `- L( {0 K# ^
————————————————
9 v" {9 }/ w2 b5 g7 h版权声明:jj198311如有侵权请联系删除# B1 t4 t$ A+ K4 @! |& s: r
( G6 C; K" W0 D* w3 v

) r* J! p+ F  h; J  U
收藏 评论0 发布时间:2023-3-26 15:20

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版