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

基于STM32中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:20
     STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:
  I3 B( I0 J+ i* \! y" F
, s) p3 d& a' o3 |$ YUSART_IT_PE  :奇偶错误中断                                                   
* n+ K9 c' d! E! g$ Y5 H' x8 sUSART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断;                       
( |4 t+ I3 c" wUSART_IT_TC  :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断;    USART_IT_RXNE :接收非空中断  ,接收到一个字符就产生一次中断                     9 S8 e  i( }  M2 H
USART_IT_ORE_RX :接收溢出中断                                           , n9 G: v5 F6 U
- G6 B3 l& i3 t4 U  v. S. \' `
USART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别);                      2 A" o, K5 D8 L) b% w4 b2 L8 x
USART_IT_LBD  :中断检测中断                                                   ?- T5 B* \2 A2 d( t, V( b

5 U+ |- ^  A  v. }# dUSART_IT_CTS   :CTS中断   (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。)
7 D# _" O" ?) z/ ^

$ P8 C3 M* }5 t  ^ USART_IT_ERR :错误中断                                                                  
! q9 a' o4 d% \ USART_IT_NE   :多缓冲区通信中的噪声标志                                                 : q# M) C& D2 a8 R# O

  k/ [- V8 v6 z! d USART_IT_FE :帧错误中断;
2 }5 g6 i8 d* h6 @
2 g4 n$ M+ K/ t, ~
20170729232506459.jpg 6 N* S9 P; ~" P4 x* ?) D
      
* y' N6 Z. e/ a5 @3 l, i/ k      如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。$ i  m) b0 t* s) G% A
% x7 s2 o! Y. O. m- O) n% I3 N8 l
5582434bb5194f4094ccc75a9bc8d3b8.png
3 R8 ^( x+ m% R3 d. P6 G5 D( l2 P) n0 h
dd3ac392dd3e4ec181c352a3b0df52b4.png
4 o$ P3 Q' _. p2 Z/ D/ `
/ W. [6 t! t4 M, w, C
9d9e89a3815f4c66b3047cf13055301e.png 5 z$ o7 Z; R9 f, x* l3 z  T
1 U5 p. I8 O1 L( {0 Q) N
       数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。
  N$ a$ R) K9 \# ?6 p# V" o' c; Y- w
/ p  I4 t6 F7 l  t" j- X7 s$ {
$ V( K, G4 e6 S5 Y9 b4 ], r& ^
遇到的问题
4 c2 H* a9 w2 n3 @! C1,程序一直在中断中,不进入while循环?# I  Q9 N5 B9 N  s, b
     可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。7 ]) p% j( W+ o2 z0 t

" K/ _( T$ p/ ?3 p' b
2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:
/ B: l3 F+ `- s
) q" H+ `+ O6 C
cace746bbce24c8ea4c6ca9fda9ab587.png
) X1 b5 y7 c2 O; D& L; a5 l( O
3 t8 @8 g8 X  C: P, v; T) H8 m& x

* P) ^" D- n3 t$ |" Q& U: d) Z3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,
& ^) F' D- |/ k. Q5 \6 T, S' N, }) ^+ ~6 @8 R
a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;
4 X# }5 \/ r7 I4 i' m  e  {: [; T' D% i2 i! {) }
b,不能在中断服务函数中进行浮点运算;
9 r- S, d0 e$ Q, v8 E& B: w
" u- L6 W* `5 l* t% a
c,不能在中断服务函数中调用不可重入函数如printf等;
3 H4 }( [4 ^, s1 ~
2 |* m( C7 M8 M2 X: g% K/ F6 ~
d,不能传递参数;  |' d& _! U$ M6 ~  f6 l5 P

$ y) ?0 N2 _! ]5 ^) F: S/ a
2 g1 s! l4 [% D4 a/ x
附录:(各种中断的具体使用方法)5 ~) o; a) l9 [4 C

5 x8 K) l/ {( S( L
a3fe1854d0414e57a0e55cb15caf8171.png # A* y$ y- n: O% `) `, a6 E& \( V9 S
: M  ]* ?, u( `, ~3 ~0 z; Z
4c8f71f57c0649039ace9d44b510d4c6.png
- L8 g8 i9 Y7 b9 t2 S1 V8 b# `+ v
2 f# L: J8 w& d: \4 W0 m
5130686851fd4e9d810e609c6fd22012.png
8 q3 m# H3 N$ B4 H+ _
  v6 d6 V7 l7 D2 ~" |! ~4 O————————————————" J) j+ e  C7 A9 x: n7 ?
版权声明:jj198311如有侵权请联系删除/ J; W( ^& ]$ R( a, L( I

! S1 d& [7 D6 U3 I' A+ Q+ M; d1 \6 ]0 ~& [. c
收藏 评论0 发布时间:2023-3-26 15:20

举报

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