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

基于STM32中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:20
     STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:
( \" @% H8 H% Z
! G: B. C  f. K$ o: xUSART_IT_PE  :奇偶错误中断                                                   
6 S. v1 _$ d6 ]% SUSART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断;                       
" ~3 }' i6 |% C( \# sUSART_IT_TC  :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断;    USART_IT_RXNE :接收非空中断  ,接收到一个字符就产生一次中断                     & x) J% X) u' e3 s5 ?3 i3 I/ b
USART_IT_ORE_RX :接收溢出中断                                          
9 k; Y: o+ u6 r1 {7 H6 }8 A3 R+ w. M2 Q9 C) K' n) b0 P8 K
USART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别);                      . ]7 |# Z1 A, Z4 Z6 s/ |2 e
USART_IT_LBD  :中断检测中断                                                
* Q& H# R  Y) e7 k0 j# [
; d3 a! [" n; f. rUSART_IT_CTS   :CTS中断   (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。)" r; w% t1 O9 a& q+ ]) _5 M
$ g$ Q! p+ o* S% L
USART_IT_ERR :错误中断                                                                  : @9 d/ G2 d5 j) W% P) [6 ?5 p# Q
USART_IT_NE   :多缓冲区通信中的噪声标志                                                 1 T5 ]$ E3 e( U$ B1 _

; j  u3 E3 [9 M USART_IT_FE :帧错误中断;
6 ^* D4 `% p% {) m$ i3 N
0 ?- r) h/ B$ D. O
20170729232506459.jpg 6 b0 }3 T4 y8 y# h0 x
      
2 e6 U0 y, P; M4 d5 z8 f$ t      如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。8 c/ K! m9 T. s( }
$ s$ k, c0 A3 N% b' O$ H
5582434bb5194f4094ccc75a9bc8d3b8.png " b: w  l+ R) N' p: Y

5 E8 `4 l# f# X) b0 ]; C
dd3ac392dd3e4ec181c352a3b0df52b4.png ; J. q- Q/ O9 d9 d0 r3 A" c' m" u

: X! A5 O( X8 x
9d9e89a3815f4c66b3047cf13055301e.png
# T2 y% X* U$ i+ x! k5 ^0 `7 v. @
2 @5 m9 ^6 R" K/ w7 Y       数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。. \6 O% e1 ?# p/ ^/ J8 l% Z

6 A. `- }% X4 k* @8 b! f- a
$ v9 ~! [. I0 A9 |$ n5 Z
遇到的问题" v. H, s, U/ @" H5 b$ G8 H
1,程序一直在中断中,不进入while循环?) _9 N$ [2 |' i3 S5 C
     可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。
' f- ^$ c- k/ K* E  n2 B" m8 C* h" _0 {0 [# P, S. P: v
2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:
5 a$ C- s* O) k9 ~% r# K; T0 O
# `" b  ?: W: j4 j) S. X' t5 E
cace746bbce24c8ea4c6ca9fda9ab587.png 3 d7 x9 H) k2 S: O. Q2 M0 F5 m# a6 `  o

) R7 y3 h% c$ E! {% i

. p4 O( R) ^( ~! J; q3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,8 @- u  G) W% c" X6 J

2 z$ G  l, r; N( J. v) _
a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;
" R, g5 A5 s# p1 }' t  q7 U# I1 V5 z/ q3 \/ W
b,不能在中断服务函数中进行浮点运算;
: D9 I2 S" e$ h2 E% X! C* t: ^! t' ]) ?- k; d4 W5 J
c,不能在中断服务函数中调用不可重入函数如printf等;
0 X( e) t2 K  ?' A+ Q3 Y# X, N3 z4 S' k+ ?; B$ X
d,不能传递参数;
( y7 k, l: `' |7 C5 T  K! [( s  q- f) [% {! W5 \9 g4 C
- N' ]& k0 c# B; f; {* w
附录:(各种中断的具体使用方法)4 |+ C3 F5 j! q

  \* ~. k3 d. I9 H1 C3 p/ E
a3fe1854d0414e57a0e55cb15caf8171.png
8 {: T$ F# O$ L3 l( W
. ]! M) t9 {0 M6 w. `' [1 u
4c8f71f57c0649039ace9d44b510d4c6.png 5 K1 D* S& Z8 s' N" D7 e0 t& \

$ S- l- v8 Q5 V
5130686851fd4e9d810e609c6fd22012.png " B4 C8 c# l5 ~

* W0 G; w* x5 R$ `  a————————————————
" D. X+ p; i# Z3 u2 }4 s版权声明:jj198311如有侵权请联系删除- V" z& ]4 m6 Y# v  g7 `

! |, k+ w/ D* v( y  d" s0 \1 j: R* w, |' L( N1 Q' m5 F
收藏 评论0 发布时间:2023-3-26 15:20

举报

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