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

基于STM32中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:20
     STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:
. E6 e. k- B; l% L7 N- b1 R' x/ v: f
USART_IT_PE  :奇偶错误中断                                                   7 A% P3 o8 |( s; R9 |" n
USART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断;                       * T; Z  `2 q2 _9 g( H, ]( X: b
USART_IT_TC  :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断;    USART_IT_RXNE :接收非空中断  ,接收到一个字符就产生一次中断                     $ j) Z* b# B5 s6 H/ |
USART_IT_ORE_RX :接收溢出中断                                           2 @0 {. _3 H, v4 ]* Y$ L5 ^

, a) j. s. v' \  LUSART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别);                     
, d& X5 [8 v7 U* |9 gUSART_IT_LBD  :中断检测中断                                                
5 L; W+ ?; |! v0 O% C. f6 K
0 e, H+ A/ N9 T3 v" VUSART_IT_CTS   :CTS中断   (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。)7 ]: K( \. }5 x( Y3 R

) G8 |6 a" [1 ?* w% w USART_IT_ERR :错误中断                                                                  3 F( E, c" n  m( t. _! t  H, {- o
USART_IT_NE   :多缓冲区通信中的噪声标志                                                 ; n. y6 s; A- f9 }" L
5 D! z- J( ?9 Q2 H% o. \- J
USART_IT_FE :帧错误中断;
2 W* z8 R$ h  u' f7 x' @3 k0 J: o1 c% ]4 S
20170729232506459.jpg
! H: u  ~6 P- V* H( ]; G      
5 w' ^4 {( i( w+ _3 e' _      如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。
3 h$ `. @/ ~+ R5 \% p6 s3 v/ c* }: o9 q- k# u2 V0 v; g) q
5582434bb5194f4094ccc75a9bc8d3b8.png ' D# W4 N! Y8 W( f# y  _

: z8 ?1 @  C6 q/ \; E( _, U
dd3ac392dd3e4ec181c352a3b0df52b4.png
6 b2 M9 d+ k0 ]4 e+ I: t5 X; Q5 O: V) S" B0 e* s
9d9e89a3815f4c66b3047cf13055301e.png 9 z6 }6 D, ~: [# e% k+ j/ ~) O9 v+ p

3 [& f5 V. ?- P+ R       数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。
$ x4 m1 m$ L0 S5 I8 R0 R+ h% [) L+ c
' A  w9 C. o7 l
遇到的问题
( Q: t9 t2 |: ]% b: |1,程序一直在中断中,不进入while循环?  v. V, J/ C7 {/ s5 g
     可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。
- k/ @3 O6 G1 L, [5 |. j5 L/ {/ l! n. K$ f) T
2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:
1 _9 |# E! j6 z  U) x, L' l' L! I7 [' {2 s
cace746bbce24c8ea4c6ca9fda9ab587.png $ k  M5 M9 [% |1 t
7 m( o2 c6 X+ s& k9 \" ?
$ c& ?. b4 O( N1 e6 P1 H8 h4 q6 A
3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,
0 W# S* G0 f8 g# U! o/ ]/ R8 b' Q
a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;8 o( o5 a" P5 ]

7 W0 ]; T9 b0 u1 k1 h  R- u! Z2 e. ~
b,不能在中断服务函数中进行浮点运算;( ^# Z& Y, ^: m6 x0 M% c2 c

0 X" m/ I5 |8 O
c,不能在中断服务函数中调用不可重入函数如printf等;" r5 `& F. j) N2 [, t% `

! b: ~/ m! u- [
d,不能传递参数;( J. v8 m3 t% Z

# T, @3 v" u! @

  B3 {2 @& |3 p0 Q附录:(各种中断的具体使用方法)
4 i: T+ h& ~. v( E! ^9 F6 \
  ]4 n9 s; N" f4 S+ P% P/ z
a3fe1854d0414e57a0e55cb15caf8171.png   e5 i( E0 D3 T/ p& R
8 @' q% q+ b& B# b  u
4c8f71f57c0649039ace9d44b510d4c6.png
, J2 E  v5 `' \6 T/ ]
/ p* P$ ^6 q3 n1 d
5130686851fd4e9d810e609c6fd22012.png ' f. B' `) `- J4 P0 z
4 n5 U; j7 t* U4 W5 G8 C& I
————————————————/ K; k+ o7 O# I5 h# x/ i  ^6 G. f
版权声明:jj198311如有侵权请联系删除
% c2 |4 g! v8 B$ [2 s# ~+ P9 N% w2 [- d3 ?* {! I

* D) G4 c& d( l3 Z4 \
收藏 评论0 发布时间:2023-3-26 15:20

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版