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

基于STM32中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:20
     STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:% t, s' i0 r! t$ I7 ?2 r8 d
1 S* Q+ w8 Q! a2 C: w9 U
USART_IT_PE  :奇偶错误中断                                                   / x* }- x  i* o+ ^4 n7 Y
USART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断;                       , b8 g# u( X7 h4 g( e
USART_IT_TC  :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断;    USART_IT_RXNE :接收非空中断  ,接收到一个字符就产生一次中断                     + _6 C1 v0 n* T: u. h! f2 }& b
USART_IT_ORE_RX :接收溢出中断                                          
0 C7 Q) b4 A) A* t- m0 I& z& T0 ~2 j! h4 x* E
USART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别);                     
3 k3 c3 D, |5 ?+ D1 cUSART_IT_LBD  :中断检测中断                                                
3 z4 P# O4 ?6 B+ \2 s: a4 X
/ q% v. P, W# ~+ x& |USART_IT_CTS   :CTS中断   (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。)! |3 Z5 \) N) B) W
, u% Z1 M: M2 @/ }9 ~
USART_IT_ERR :错误中断                                                                  
- c' }3 V8 x& [3 E USART_IT_NE   :多缓冲区通信中的噪声标志                                                
* V: H$ a' o1 R7 e' G& B
7 @9 {) m0 [  ]8 E/ [7 X/ w: [3 ? USART_IT_FE :帧错误中断;3 N, L( I! {7 O! H9 X( U

- Y/ P  Z! `1 a( G/ ]7 g. r! a  |  }
20170729232506459.jpg
/ \" Y4 Q  T3 B' O* B5 S# \1 t! {0 V      : `8 B/ s& m/ U
      如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。
  A- y$ p- I2 x7 M0 N+ @; z' D
( y4 x  H6 v9 p( y* u/ ?) f
5582434bb5194f4094ccc75a9bc8d3b8.png + L+ a( ]: k+ c; u6 {& `9 U
5 E: h% ^- F0 ]. g* p! J
dd3ac392dd3e4ec181c352a3b0df52b4.png 6 K1 i# \; f! y! P8 d9 C6 h' O

! Q" u" _3 N; e5 G5 i/ O
9d9e89a3815f4c66b3047cf13055301e.png % ]- S, r. t; m6 c

3 Z7 w- ^, t; w4 J5 H5 i3 `       数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。
+ |4 `. e7 Y' {4 t" `" ]" ^; c4 @' K, h( Y* ?4 s8 X

+ ]& c! _. x) X, m4 h遇到的问题
' i4 ?& P  S) u2 [1,程序一直在中断中,不进入while循环?1 Y9 c" S5 r( ?8 R9 X# P
     可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。/ N6 D! e1 @! {

/ M: E5 j6 C. C3 H4 @( N' v
2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:
& ~7 }3 h8 u" }* d( g  ^0 ^7 x& }! t+ t. F
cace746bbce24c8ea4c6ca9fda9ab587.png
8 |: s' K7 n! B# i' Y: G) j
- K% D: H! t2 m3 G/ X6 k

/ k0 E6 K5 u  C2 D7 ~: [/ l- P3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,
( ~$ r) P  f" x1 v3 _# T  I
# D8 p5 ^, P& N& R2 e
a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;
$ W* i' D- y+ F% O
2 v+ a6 |% I- N5 n. |4 [
b,不能在中断服务函数中进行浮点运算;. D1 i9 [& M/ w. I  d% a. W

) N9 }$ x6 S: T$ y& q9 s  ^; Y
c,不能在中断服务函数中调用不可重入函数如printf等;6 r* K9 B$ K  U8 H6 [3 B" h8 Y* s

. l1 k3 @- C, R' ^  e
d,不能传递参数;! W* I, |- ^4 }! I; J! X, g
4 y- n2 S2 z$ j' Z$ W8 h
  l2 V: T+ |/ G3 M5 f
附录:(各种中断的具体使用方法)
5 e8 f5 G+ {. h* f7 z; f# `5 i1 I5 j- B! Q; E  i  S$ S  R2 X
a3fe1854d0414e57a0e55cb15caf8171.png # C- T' {! F/ b. H2 f

5 C1 G+ L1 p- v* ^5 p+ l) q3 i! F1 ~
4c8f71f57c0649039ace9d44b510d4c6.png   p1 P5 e, ?+ E  w+ `! c" V

3 r5 W) Z4 r: u! H3 h+ W2 [
5130686851fd4e9d810e609c6fd22012.png
! s& J: C2 f& F$ S& u' L
) E% h# F* I. f9 V( P* m1 K0 `, V————————————————+ e( d9 U) Z3 c7 c4 `
版权声明:jj198311如有侵权请联系删除
3 |8 X" e  d5 {3 v5 `2 _0 M( j! `; ?" z4 k& Q4 ?; V

# a! [$ m+ q& |1 t; ?  }
收藏 评论0 发布时间:2023-3-26 15:20

举报

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