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

基于STM32中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:20
     STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:" l) k: S7 I1 P8 }

8 O( Q3 c% t' U6 c, t& vUSART_IT_PE  :奇偶错误中断                                                   & ~3 M. N& c' b: X. l
USART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断;                       ! S$ ?! w' |2 }. q. r$ c& K7 w( p0 z
USART_IT_TC  :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断;    USART_IT_RXNE :接收非空中断  ,接收到一个字符就产生一次中断                     
/ h4 M6 L' y1 @3 y5 N) L# _USART_IT_ORE_RX :接收溢出中断                                           0 s* R; q0 ~9 C7 A0 A. m: t
2 m* {# d- r  K# Q; e, E0 M# }8 w
USART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别);                      2 e' W( `$ G3 J, ^1 ]6 l' ~
USART_IT_LBD  :中断检测中断                                                 ( {$ U( ]6 d  u. D" z$ b
# ~) ?7 N6 K& `$ U
USART_IT_CTS   :CTS中断   (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。)% P) Y  F1 O! M4 Y

( E. L3 }- s, g USART_IT_ERR :错误中断                                                                  . }& a$ y6 v: |6 w% {
USART_IT_NE   :多缓冲区通信中的噪声标志                                                   ]( E" l- j, W$ B6 Q, h4 t' e
3 R9 t7 \# F& W6 p8 T0 i/ t9 Z; v
USART_IT_FE :帧错误中断;
2 o9 U' Y8 e  k( g+ w
( s, ?( c$ z% C! l1 i7 y$ a1 ^- j; P
20170729232506459.jpg ' y' N" N0 P) |8 X/ ]
      & P2 L# W* w6 Q3 O& T4 E6 U
      如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。
! z$ G8 T# q3 @8 F% H$ S* z2 W  K4 P+ {
5582434bb5194f4094ccc75a9bc8d3b8.png
. L5 V! e4 S: w% O' b, h: i4 p1 G' r5 K* V
; ]) ?$ D8 M8 o9 f: _, C0 ?3 ^
dd3ac392dd3e4ec181c352a3b0df52b4.png * N4 r. |8 A. f1 a- a

2 S2 m( H, g! K7 q
9d9e89a3815f4c66b3047cf13055301e.png
* Z& Q5 |! \; n- o! y4 v$ s" E' w  H$ ~  K
       数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。
5 v1 i: b) q0 M' ]2 \8 H1 Y' e5 k8 s6 E1 g
( `+ y/ r: }  r0 M
遇到的问题9 m7 ~  [( K8 Y; q4 }7 ^9 ^. K
1,程序一直在中断中,不进入while循环?5 w  }  g" F0 n, W, N/ ~+ _
     可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。
% c3 }$ K/ G! g2 X4 g3 `: ~
7 W, }5 e# k2 c# e* N
2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:
* _  A' T# s( r" S  Y' ?5 `) z; |: e% f2 @
cace746bbce24c8ea4c6ca9fda9ab587.png
8 x2 G7 E7 f) p6 `) I, T
( u/ C/ t4 T) x8 K
6 I( v' i% Y& e; h, S5 u9 O
3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,1 [/ a/ M5 r/ D; z
: w! y+ h, O9 A+ m; ^1 Q: ?9 t
a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;
- H) L- D1 E7 q3 h3 J, y5 ]7 O
5 L3 ]5 k% G) v! m' z0 W8 Z
b,不能在中断服务函数中进行浮点运算;
2 D( h& K8 l% N( T5 v; t2 o+ S" e  ^7 A& _& [
c,不能在中断服务函数中调用不可重入函数如printf等;
! i9 I- S& g4 @% X  F" Y6 t" Z$ M5 c$ s* i1 A; s
d,不能传递参数;
) `% f. ]& X9 s- x% G! T; F0 T/ |+ V1 I% J2 k# b4 m7 |

; x' b) h9 }) N, ~7 `附录:(各种中断的具体使用方法)& g' E- G2 G, |8 ]
- p" H  |* Y" r
a3fe1854d0414e57a0e55cb15caf8171.png
% P$ c' i7 c! `- b  ?# v. O( Q
9 ~- R! T1 p  Q& ]. [) z! @0 _# ]7 a
4c8f71f57c0649039ace9d44b510d4c6.png
! j: f7 d% K2 z+ M2 S3 V0 |+ o. r$ R1 s" z' C4 x& D
5130686851fd4e9d810e609c6fd22012.png
4 _/ D$ T, u3 ^  y* D
* c8 I% J0 E' [& G# M! p. R- M. n————————————————: |' V, ?/ R: Q: }; s% u2 c7 f9 M
版权声明:jj198311如有侵权请联系删除
  C% j( w4 c( s: [* Y" T, j, `
+ j8 C5 v# S' n3 M; Y# C* M' @2 l; v7 s7 R5 H9 }% m$ |7 r8 K
收藏 评论0 发布时间:2023-3-26 15:20

举报

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