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

基于STM32中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:20
     STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:; K1 A, @  m' Q1 E7 `/ X8 W

. M# C6 J- d7 ^. L2 _  p8 }/ hUSART_IT_PE  :奇偶错误中断                                                   : g5 z. v. H4 P
USART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断;                       
  m$ z& j1 F/ i; O, j" D9 X" CUSART_IT_TC  :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断;    USART_IT_RXNE :接收非空中断  ,接收到一个字符就产生一次中断                     
4 N2 j9 E$ S2 t9 ~9 m8 d2 oUSART_IT_ORE_RX :接收溢出中断                                          
/ g" S9 A* a* f! u, E7 ?) i. D9 }
/ ~- z- y+ X, m8 ]5 l$ @8 e/ VUSART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别);                     
- i% v4 x; J( N. X6 A& w( GUSART_IT_LBD  :中断检测中断                                                
/ u$ \! U- K6 g' u
5 ?0 C- ]' Z, t  e1 cUSART_IT_CTS   :CTS中断   (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。): o- n& ^+ J+ N% y, ~; A
0 q$ [+ l+ N3 ], p. x* W. n- C' _3 y
USART_IT_ERR :错误中断                                                                  % J, s$ o3 B  c6 ]7 n5 c+ S: Z6 Q
USART_IT_NE   :多缓冲区通信中的噪声标志                                                
4 _, C! f& c( s6 H7 u7 b  N8 s/ u. d. X7 ?9 ~
USART_IT_FE :帧错误中断;+ O9 I$ k6 o) o7 \/ R- i; ^7 ^
* r8 E; s7 }  U7 _
20170729232506459.jpg 0 G7 f4 [2 W5 G1 n
      
$ z4 n/ J5 _0 o9 l2 g! L" I  q      如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。
/ @  C: W% ^: n6 y% ?$ T% Y2 l- y" v6 ^4 j) k
5582434bb5194f4094ccc75a9bc8d3b8.png
/ Q# n, s* h; u0 I; |
7 B5 w$ h9 c' X* v9 V- T! `+ ]
dd3ac392dd3e4ec181c352a3b0df52b4.png . {* M5 D& f0 s9 l: ]$ Y

" Z5 V% O' P! H! e; B) K
9d9e89a3815f4c66b3047cf13055301e.png / G4 C1 o1 v0 m

& @4 d+ y9 k; v       数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。
7 v, q5 n( `( g# j
& I* w9 z' d) e1 h% k6 N# `
: Y  u# P- j6 q, ?( ]+ @
遇到的问题- k* l( T! m; W# x, a( Y2 c2 i$ d
1,程序一直在中断中,不进入while循环?- k( a/ e8 e  T2 t: `2 U
     可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。; N% J) y% j* J& r/ N

6 Q0 W# L8 h# r3 h3 x) z/ d
2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:+ o6 L( D7 N# n) Z# U' H' d6 j
5 i) y$ V9 P& e
cace746bbce24c8ea4c6ca9fda9ab587.png , J& [5 t8 t6 v: b  o5 C

- D. }' D' \( x& N
! d3 S0 J$ k( k7 G- J6 @: I) P
3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,2 w# Q% w3 j* m2 {, k' m& t
" x8 \6 r# q/ }5 e$ ~- T, J% {1 n
a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;
9 f0 R) {& R$ \# ?# @% E
) Z" {+ J) k9 x9 ]
b,不能在中断服务函数中进行浮点运算;
( z' k/ m/ L) }, G" G7 x" ^* Z# z- z' `0 p/ F
c,不能在中断服务函数中调用不可重入函数如printf等;+ S; ?; `5 F3 h8 p

7 m/ D7 u4 I1 {) M. ^
d,不能传递参数;% o; K3 N. f/ F8 v- t. ]
+ d8 i' h- K1 M2 ?1 f

" W; G) h$ e; o- s" k/ E) |附录:(各种中断的具体使用方法)8 w3 D& ~. y1 [
# I/ A$ L: s& Y% g0 q
a3fe1854d0414e57a0e55cb15caf8171.png 4 J" e' g+ y6 z$ F) {& @0 g
9 Z: V9 \2 q  l5 P: j7 R+ B
4c8f71f57c0649039ace9d44b510d4c6.png
' H- D% z" e+ r  m' p9 ^* L) Q5 v  E- a& I, b; J
5130686851fd4e9d810e609c6fd22012.png
6 f1 p9 q" h" @3 E; I& w ) I9 \3 e  p7 L7 Y
————————————————. Q1 F/ r1 a# j& A" d
版权声明:jj198311如有侵权请联系删除3 S$ ^  _, Q7 H8 `6 T9 H! |  E

% d3 X0 ?4 A; f1 Z! o7 E9 T
% h; N6 X+ I7 \& A  _
收藏 评论0 发布时间:2023-3-26 15:20

举报

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