请选择 进入手机版 | 继续访问电脑版

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

基于STM32中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:20
     STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:: O- H# b! q& L6 I3 ?  }) X8 H& O

* t0 N. `/ \- U6 l; IUSART_IT_PE  :奇偶错误中断                                                   
& ~1 x+ X* O; ^8 A2 j5 nUSART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断;                       
# [  X/ j. v# t: kUSART_IT_TC  :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断;    USART_IT_RXNE :接收非空中断  ,接收到一个字符就产生一次中断                     + ~8 `% @8 h1 e( }0 @
USART_IT_ORE_RX :接收溢出中断                                          
& S7 M7 _6 l% X& j5 F+ a
  L4 Q( ^( L- M$ O- V& z$ @USART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别);                     
# S7 @7 T8 M* y- e+ J" @, mUSART_IT_LBD  :中断检测中断                                                 , q& F  T6 d. H6 S& C
3 z: o0 b7 i5 ?- \
USART_IT_CTS   :CTS中断   (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。)
6 o/ S9 M5 D5 |- X0 P
! V: s; W* a0 O8 p
USART_IT_ERR :错误中断                                                                  
2 [/ H- h3 o+ @- l9 M6 i1 H USART_IT_NE   :多缓冲区通信中的噪声标志                                                
, i# D' H4 G3 y# a# p
4 j: d/ A) o2 E' C( V( o! X USART_IT_FE :帧错误中断;
( I4 c: Q( B8 Z9 X8 g: J' K  I
( b1 G, |1 [* V' k8 W
20170729232506459.jpg
6 l. K3 a1 R9 v, n7 l. O& P      4 X2 K+ A8 u* t3 S- J
      如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。. N* z6 D0 ]" q  H. ?3 a/ F9 t% `

* e5 `; U; k9 b! v% I6 d) v" b. z
5582434bb5194f4094ccc75a9bc8d3b8.png # K0 Y/ J/ ]) d: H0 L, n
' G3 ]; J5 B, t5 d3 O; `; Z
dd3ac392dd3e4ec181c352a3b0df52b4.png
! P6 n* t5 j3 }6 |3 a/ S4 \
& f7 I7 Y+ `2 A% k+ ?2 j
9d9e89a3815f4c66b3047cf13055301e.png 6 e% \) ]3 y8 w& R8 c5 h

2 ^! B9 F/ o$ @. y+ m, G+ O2 u+ C. {       数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。
( h( _  j( B+ T* q: {
$ W! B! c5 ^' u" N
4 ^9 \  i6 ^/ h
遇到的问题5 u. p$ |( v; X: c
1,程序一直在中断中,不进入while循环?2 {3 v  s1 M# F
     可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。$ n  V: T$ S" r/ e# q
  P$ e5 Z& |7 Q! t' ~( ~2 y
2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:8 j9 {. y$ x. f+ k( f6 d

# C& W9 }+ {- t1 {1 j
cace746bbce24c8ea4c6ca9fda9ab587.png
$ r( V1 A8 Z; P/ U! @3 u4 N4 _( D4 T" _

) d2 x+ x" c# b4 F8 I# Q3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,
" J* }$ N. Z$ R0 W* Q8 s2 J( d% T' l6 u3 l
a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;$ g3 M1 S/ C) V8 C& U8 N
' l- Y* \) S* M" |$ `; L
b,不能在中断服务函数中进行浮点运算;
! V6 c) d2 b" W  t) Y
) A1 u1 P8 F6 C
c,不能在中断服务函数中调用不可重入函数如printf等;" x2 G$ s6 U6 J
6 W5 }/ v- {. x# [  u5 h6 \
d,不能传递参数;5 D) H' E5 q1 ?! t. a' M* F

% W! S) D* w/ \" Q3 }

5 b. h/ }; O! G4 l附录:(各种中断的具体使用方法)* `% U0 C( k! D5 O8 U! _4 j% I
* Z! l3 I; g8 h# I6 i
a3fe1854d0414e57a0e55cb15caf8171.png ' s2 y3 o( {; E2 d

! g0 l9 \% p3 c* k8 E
4c8f71f57c0649039ace9d44b510d4c6.png $ k0 u. `' {5 I$ b7 V' l0 t
; @7 _8 M: }1 r1 I. m2 A6 `8 p
5130686851fd4e9d810e609c6fd22012.png
2 q9 P; q4 E0 u- ~# p+ N
1 S1 N9 p2 p6 E. F  K9 J1 z* y; K————————————————
; g# _5 N& l  i% z5 H7 w+ v版权声明:jj198311如有侵权请联系删除
$ F* p5 W  S. J. ], y, P* b
2 Y; R& Q0 h( u/ g: }6 s
% r0 @9 L5 ?( d, N, P& E' j
收藏 评论0 发布时间:2023-3-26 15:20

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版