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

基于STM32中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:20
     STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:4 e3 ]/ `2 ~' J3 [6 i

1 I  R. B  J& a+ e% W) k: xUSART_IT_PE  :奇偶错误中断                                                   
; u5 g0 w  v/ b5 I" Z9 D$ V' CUSART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断;                       3 N' R0 A& c( q- X) k$ ~" O
USART_IT_TC  :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断;    USART_IT_RXNE :接收非空中断  ,接收到一个字符就产生一次中断                     0 k' e/ F8 B' V/ U3 W0 o
USART_IT_ORE_RX :接收溢出中断                                          
, v: g- C, G0 f8 }0 J- V5 H
0 F* ]* W  f$ S. B9 y& T( kUSART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别);                     
) b# e8 C4 V8 l7 d" ]' S7 IUSART_IT_LBD  :中断检测中断                                                
9 e9 x6 c6 z8 R! C9 `" Z) i7 n& P- A
USART_IT_CTS   :CTS中断   (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。)$ m" S0 V. L, t) M% @, m) O
4 ]3 G: B3 x5 P. {- @: d
USART_IT_ERR :错误中断                                                                  
4 t6 f  }" q' V; h! w7 Z; s; U2 s7 x USART_IT_NE   :多缓冲区通信中的噪声标志                                                
2 S) C' Z8 ~$ x0 j( m/ n, I- _! R) j$ Z5 V3 y$ c0 t6 ^2 F3 D
USART_IT_FE :帧错误中断;
; D7 o/ g) I' f; a. }" z7 N
$ e" n3 U3 z/ J5 B/ O+ x9 ]5 `, G
20170729232506459.jpg
+ a% I: G% F0 L# |! q+ v/ `9 h) S8 {      
4 G% ]" e9 P8 w! V4 r      如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。% h2 q6 P" {/ p$ p" K% W+ `- O3 ?
  m( j0 H; K0 I+ b( V+ B2 N
5582434bb5194f4094ccc75a9bc8d3b8.png . N' s6 r- K& l0 C

: Q6 x4 m% P/ N. B' o
dd3ac392dd3e4ec181c352a3b0df52b4.png 7 W9 V# D3 N5 p! p; ^
/ B( X' [- W7 ]: l) t" E' v
9d9e89a3815f4c66b3047cf13055301e.png
+ d  h2 {. M% A& M
, ~  [5 ~7 I0 @       数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。  I1 L7 K/ i( S) P( _9 ?
' U) _9 Z" j, l% Q0 R  l* `2 S

+ ]+ Z5 _6 i9 d$ U1 F  M遇到的问题' j. [1 h4 t# E7 Q9 k4 b5 i
1,程序一直在中断中,不进入while循环?
' L+ W& _; }# q+ q/ e& L     可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。/ l" ~, U4 u  e5 P! L2 j

" m6 H/ x! y+ {
2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:
, S% N3 ?( m( f- D' g3 x8 J# V; u4 N' r$ Q, Y8 r5 l( }
cace746bbce24c8ea4c6ca9fda9ab587.png
& E. [2 K/ v; [' E% Z: G! E/ c8 |1 D  G. p" L! r/ A0 [
  Q: m, ]7 u$ j3 @0 c1 K8 w2 P
3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,8 U8 x% s. b9 f' P
1 _( j& K! ~" _6 E$ \
a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;( Z! Y9 E& b# V& W0 m7 y+ X% S

- a- s  ?, O+ `/ v
b,不能在中断服务函数中进行浮点运算;
, s( w) ]  f, W" O6 v: X
& J* T2 E7 T% j: Z6 b: Y. m2 T3 @
c,不能在中断服务函数中调用不可重入函数如printf等;
) A( u; i5 \5 A! \$ {# N6 t5 r3 \1 H* x* i/ ?, h, A: V
d,不能传递参数;0 [# j* v, Z4 g
9 d- l0 e  {3 r: {- a
2 Z; Z& h) ^& }1 c3 q
附录:(各种中断的具体使用方法), G7 t- y& _$ r, W

/ \5 S5 l7 l0 |: n4 p8 y
a3fe1854d0414e57a0e55cb15caf8171.png
8 L. j* ^+ J: w8 D' M
/ P4 @1 |* Z5 M# X
4c8f71f57c0649039ace9d44b510d4c6.png % P  q5 q; Q$ P/ j# C" O2 y& a

3 Y; V) A6 z0 u, X6 Y8 q  d, p! o
5130686851fd4e9d810e609c6fd22012.png
9 o  F' }/ D/ x1 T0 I1 K- | ' ^# x4 c- q: c: V5 h
————————————————' Z/ P! w* Q. Z  U7 a. g; y) B
版权声明:jj198311如有侵权请联系删除6 G& a* Q* F5 k: y) ^0 @
, a$ T( E2 m" q: F0 M, B% ~, y# C

6 B( I! Z9 u! }2 U6 ^* g
赞 收藏 评论0 发布时间:2023-3-26 15:20

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版