请选择 进入手机版 | 继续访问电脑版

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

基于STM32中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:20
     STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:
, W& I7 M/ s# x' C+ d) @' {# v4 {3 A
USART_IT_PE  :奇偶错误中断                                                   
  Q( T& i) E) g5 T1 @$ t$ _1 BUSART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断;                       
8 M1 p! a1 T( f' yUSART_IT_TC  :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断;    USART_IT_RXNE :接收非空中断  ,接收到一个字符就产生一次中断                     * Q5 p0 ?/ b  P* ^7 C; P
USART_IT_ORE_RX :接收溢出中断                                          
$ [; Z, [. ~& w& B, e6 L5 Y' T  F( I
USART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别);                      ' N9 i$ ?6 V9 B# U
USART_IT_LBD  :中断检测中断                                                 / O6 ]' o4 [$ x+ n

: v5 ^% o- h* [; vUSART_IT_CTS   :CTS中断   (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。)% r+ s8 h9 _4 d. U7 N6 g: ^

$ ?, `0 [& {. T% v( R USART_IT_ERR :错误中断                                                                  / P4 b4 l" t3 q1 Z8 U! Q
USART_IT_NE   :多缓冲区通信中的噪声标志                                                
' V$ q% K9 P4 `' {( L
& U7 y/ C. b" C USART_IT_FE :帧错误中断;( r' d, @. j3 p2 h
& R* ]) ]: e/ Z1 q% b' r
20170729232506459.jpg
) U6 B# s; {- I& C: N      
, u- K( G0 {$ h1 @/ A      如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。4 r" o, h) S& O3 L
$ ~+ a( b  e: ^2 M1 u/ i
5582434bb5194f4094ccc75a9bc8d3b8.png
& n: A7 s) }( y( J% e1 z. E: l: W
. H# {1 V  D+ u1 u8 A
dd3ac392dd3e4ec181c352a3b0df52b4.png : K& D6 T2 F  Q( E$ p- p/ ^  B

! S) D$ i& q( D! v: r4 m
9d9e89a3815f4c66b3047cf13055301e.png
, j5 P3 {7 q) l+ W$ d& M( T: ?2 _- z1 F  ?! f% X) l5 q& n
       数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。
7 y) W4 M; l% R) q2 J, {8 V0 q
8 ]# l4 C: e* i" }
4 C; E3 y& w/ i$ ~) r
遇到的问题
1 N  p9 b) W9 f  @% C1 J* J( h9 e1,程序一直在中断中,不进入while循环?
  a/ E, F. R4 {% |     可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。
2 ]( e" S8 S' j2 x5 H( b8 r, S
+ E0 B# c3 j: u; s1 `) i- R" Q
2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:  j- Q# Q/ b9 T1 |

. B) Q& g" }: F5 O, d& }$ ~; c
cace746bbce24c8ea4c6ca9fda9ab587.png # E; [/ x8 `4 }1 K
" w' U0 p0 X0 O+ ]; Q

8 ?$ }( Y3 @, [1 h8 n) J8 ^3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,3 U) l% D' B% Z8 i$ d  t
% S3 }0 a  y& c
a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;
4 N) Z' ^5 c" i1 m! d8 X- P" ?, M/ H' I) N/ y9 Q
b,不能在中断服务函数中进行浮点运算;
, o' H* E9 t$ I- S( v! C. B. r* N6 q. A8 n
c,不能在中断服务函数中调用不可重入函数如printf等;
: J. t. b& P1 V6 O6 ^( L0 h' w
, h9 S3 f7 Q' U
d,不能传递参数;
  D/ T: s' T+ z3 Z, w( f5 p) ]* C! e5 B
9 S  \3 z/ F$ K3 \% m& T0 {" c* p( P
附录:(各种中断的具体使用方法)
7 ^: {' T  j' Q$ {) [2 B- d
. u8 y5 K! c: W4 ?3 F2 t: A2 g
a3fe1854d0414e57a0e55cb15caf8171.png " J( ~  S, p) U) e$ g! V7 B

% ?, X; ?6 i+ L7 `
4c8f71f57c0649039ace9d44b510d4c6.png & N/ v2 ~3 G4 L% ~- n% q+ t

% _6 Q7 P9 D7 p/ T, B  v- I
5130686851fd4e9d810e609c6fd22012.png * @: K" y+ L8 X( e+ y

. p( D) ~; L9 p4 |2 U& K————————————————
( D( O6 E6 n7 P( r5 c/ H版权声明:jj198311如有侵权请联系删除7 O0 C; \% P$ F0 g& T8 N
  s. ^; b) N6 P! w; A
1 ~& m5 {5 L, s
收藏 评论0 发布时间:2023-3-26 15:20

举报

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