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

基于STM32中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:20
     STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:
. _+ `7 ~& T3 ~2 d' O
, k6 r1 M1 {  t/ I4 IUSART_IT_PE  :奇偶错误中断                                                   
. F0 U+ l/ @& p4 QUSART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断;                       8 x" `8 G$ q# F. O1 {9 p
USART_IT_TC  :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断;    USART_IT_RXNE :接收非空中断  ,接收到一个字符就产生一次中断                     3 m' _& j$ l8 y. b- E: ^; \
USART_IT_ORE_RX :接收溢出中断                                           # n& B- H4 \- U( m/ Q: N1 l
+ V# m- J) `+ U$ n* j8 O
USART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别);                     
' e0 I! |6 R, |( Q/ f. A( fUSART_IT_LBD  :中断检测中断                                                 + _- x" r( c! r$ _3 X8 B6 Y

. ~" h* f+ G0 D/ j- q( r% hUSART_IT_CTS   :CTS中断   (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。)
! \- u& ~& l% o' A: v

5 `/ i  z7 T& L' q- M# I/ a USART_IT_ERR :错误中断                                                                  $ a# [  }/ L0 B% @
USART_IT_NE   :多缓冲区通信中的噪声标志                                                
6 |4 h; Q; k7 G. v/ x2 M5 |
* ~: q% ^2 [$ l5 q, v" `1 S$ \: p USART_IT_FE :帧错误中断;* P" R2 l+ Q4 t" [4 r' x

: Y1 Y' ?3 j, M% I
20170729232506459.jpg 4 P' l7 G! |; S; K1 Q: [: Y9 d8 ^
      
( F: n# H; l5 O" F( y/ n4 U      如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。
0 l3 a- Z" }, V" k% o# S/ ^  H; _' A( M# |: m
5582434bb5194f4094ccc75a9bc8d3b8.png
" F# O! }5 e  k9 s7 H; t* q3 ^; X
dd3ac392dd3e4ec181c352a3b0df52b4.png
3 M1 B: @8 r: |! ]8 h) a" F4 g" U3 ^  z) s! {( ^& j
9d9e89a3815f4c66b3047cf13055301e.png ! g7 J6 d. o( F! W/ J0 x2 y
4 x4 r. ^, x5 ?. g$ a5 w# @1 y
       数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。
4 m2 K$ x1 \5 O; R6 B) z, ]1 A, l* G) H1 ?. k! B
# \( \4 k5 V& f4 s( a
遇到的问题6 Z+ J9 B; y" A" r) U) m
1,程序一直在中断中,不进入while循环?
3 A, l  b. K* t. E' m2 ?: W     可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。
% ~4 }6 u( m: r7 r& D& I3 u' T# x* a! x; B5 O. }
2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:
+ Y  S' N& }+ A) N+ {. Z! C9 x. \0 h# Q# n# o1 s% u2 ~
cace746bbce24c8ea4c6ca9fda9ab587.png 6 R  P0 `! `% n( m( U% _
# N- U; J4 K, s8 i& h

/ o, j4 B) h& @3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,' m3 P, Z; K, H
4 ?0 W0 D' @9 P  ~* _0 m
a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;3 }" h; i$ [7 S$ I+ E
- m, z8 P& J2 Q8 L
b,不能在中断服务函数中进行浮点运算;8 F7 K  S$ t' ]/ G# |4 [

6 F; B% `& d4 _+ X. ]% A$ N
c,不能在中断服务函数中调用不可重入函数如printf等;2 D1 b/ }2 q4 L
# Q+ Z5 A$ @- R2 E
d,不能传递参数;
/ K" O' @0 i  {; a( p7 Y3 L8 S% N8 c& F! |
( u. o$ [$ B0 U4 G
附录:(各种中断的具体使用方法)
# Y! T/ ~  y; @, \) ^- B) O4 ?1 D# f5 W7 \" n1 t% s
a3fe1854d0414e57a0e55cb15caf8171.png
+ o, s! P  Q& v: _0 n* n# q: _( Z, B5 L( r, Q9 s
4c8f71f57c0649039ace9d44b510d4c6.png ' b0 b9 I& L8 y% c; y0 N3 A4 t( I. G
) g  b: F  Q) v4 t, k
5130686851fd4e9d810e609c6fd22012.png 1 q' H' I, n( f3 Z2 {

' V% W/ q* y! A# B, K6 V————————————————
: Q- O' p2 s" O  h( t( |版权声明:jj198311如有侵权请联系删除, M2 c1 T+ X+ A. H
: u& d/ C: J" c9 \+ J* k
- N6 \8 @6 ?' C+ i% t
收藏 评论0 发布时间:2023-3-26 15:20

举报

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