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

基于STM32中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:20
     STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:& u- _7 I4 B) U' [

6 {0 g+ X+ U2 e3 G- bUSART_IT_PE  :奇偶错误中断                                                   
5 s! l" q6 ]: F- R- g* _$ b% x1 lUSART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断;                       & q6 r0 u; z0 K- E" c% ~# n
USART_IT_TC  :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断;    USART_IT_RXNE :接收非空中断  ,接收到一个字符就产生一次中断                     0 M8 L% C% v% `* s9 Z- a9 Q8 w
USART_IT_ORE_RX :接收溢出中断                                          
* ~1 X$ U0 i* }' X9 T
. B1 o; a0 E! r7 [$ bUSART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别);                     
7 M$ R- q' E* [/ K% b3 YUSART_IT_LBD  :中断检测中断                                                
# A) g; i/ _# M  u
; \1 e9 q! j' I* K( DUSART_IT_CTS   :CTS中断   (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。)
$ [, L* l6 }* e! g) C- {- _7 g

. I8 ~. r- x$ V' S2 l: i USART_IT_ERR :错误中断                                                                  
- l! d3 |! n* _ USART_IT_NE   :多缓冲区通信中的噪声标志                                                 / z$ O( y4 B) S6 ~
! {1 a+ J5 R! t$ T/ L
USART_IT_FE :帧错误中断;% }" Q1 `+ x( U" g* V
: @. }$ ^$ S0 x$ M1 E
20170729232506459.jpg , N, t, @) f& h
      + O9 _' Z8 i$ \+ x
      如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。9 J* N( ~* K2 ^1 a* C, z, H

- m+ V7 e$ I% l$ `- N
5582434bb5194f4094ccc75a9bc8d3b8.png
8 x9 `/ P# Y9 r0 J1 r9 m
- C9 |7 n4 ~+ {2 \
dd3ac392dd3e4ec181c352a3b0df52b4.png
3 p) L  s- }! M% r0 B: [) \( E( }4 N0 L6 k; F( X
9d9e89a3815f4c66b3047cf13055301e.png ! r4 {4 K; ~/ D
  m* |/ D0 j9 _. y1 j) t: T
       数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。
- R7 K. S. d: |! @+ _! P% ?8 ?( }4 r, ^( d6 `+ x( j) r8 E

- f+ ~+ |! }. \遇到的问题
  Y: R5 k$ s% b1,程序一直在中断中,不进入while循环?/ r3 Q9 t$ U% o! w
     可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。- [4 h) m9 j) U4 z& W5 {% G

- x9 K( w% L# k; h) n2 Q
2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:! A8 F6 i, U+ @8 T$ T
3 `1 M! u& }* g) {8 x3 Q$ r
cace746bbce24c8ea4c6ca9fda9ab587.png
- {1 d& ?4 \' l* E' ]3 \% N8 M( ?( ?8 p- _1 P6 n! P3 k

; W+ f1 M2 ~% a( C0 b: @# x% S3 w3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,
- F$ ?0 O) \% O6 s6 K4 ?; n& @" _  U) Y, _
a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;4 d4 S1 p* B* Q, b

6 w2 {( H3 `( g6 O7 \
b,不能在中断服务函数中进行浮点运算;& N9 L  c9 t# k) ?7 ]

% |% ~2 {2 U9 S0 x) K
c,不能在中断服务函数中调用不可重入函数如printf等;
, f; ^5 v4 I0 g- p. m- y3 `% @* w" O2 K) P
d,不能传递参数;6 D; Y( r' w1 ?" A( a6 b* ^8 d

, o2 t+ E: A; S: v* X
+ ~, W- ?3 D3 b3 k* z$ m" l
附录:(各种中断的具体使用方法)5 _3 B7 N# |2 @1 [/ R) _& M8 A. g

; w8 f( a2 S" Z, Z
a3fe1854d0414e57a0e55cb15caf8171.png " Q4 s) e: W7 A* y! \' A7 Y  x

. b' o1 N2 v& k) |+ q7 D
4c8f71f57c0649039ace9d44b510d4c6.png
/ P. H5 R7 W8 q) V$ o
6 j! T" T' B. r, N8 X4 L
5130686851fd4e9d810e609c6fd22012.png
0 ?. e9 l1 F+ K  K
4 t0 X, Q2 `4 [3 G7 ^' z! {————————————————) m( N8 `& @: D
版权声明:jj198311如有侵权请联系删除
2 S2 q  f, T3 V& K
5 g5 R( U# Y9 R5 s. z' p  m
* z0 F3 k/ I) `2 |5 l5 r( N
收藏 评论0 发布时间:2023-3-26 15:20

举报

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