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

基于STM32中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:20
     STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:
6 g2 b& v& ^2 K. W
9 U) O+ `. v/ K8 C% j, F% {USART_IT_PE  :奇偶错误中断                                                   , }5 z( z2 D' H. w/ Y  B, @
USART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断;                       " a& Z3 f/ E- F3 _  _: N3 c9 L
USART_IT_TC  :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断;    USART_IT_RXNE :接收非空中断  ,接收到一个字符就产生一次中断                     
4 H1 W+ S' h# p( |USART_IT_ORE_RX :接收溢出中断                                          
, w6 h. y9 i4 x: A; p3 A( d+ T2 p7 V6 x: o7 f$ Y! h
USART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别);                      + H4 U8 a* x6 ~% O7 ]! {' @- f
USART_IT_LBD  :中断检测中断                                                
$ ~% h3 o) O1 P) x$ J8 k9 S4 h3 m  q/ m. t# z
USART_IT_CTS   :CTS中断   (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。)7 ]. b! u9 K0 v( o

1 V. A5 R. `3 H" T7 ^ USART_IT_ERR :错误中断                                                                  
' \7 p: B+ q- g1 ` USART_IT_NE   :多缓冲区通信中的噪声标志                                                 0 a1 q! k  S- p$ C6 o3 A8 y& [
$ B' }# T: }8 Z) T( n
USART_IT_FE :帧错误中断;6 K+ C0 j# z2 t% [, m

* s" a6 E: C6 n. K
20170729232506459.jpg   e, J9 b( i8 |2 X4 d% n
      ! B( M, J2 _" _3 _& a1 P& V- V7 z
      如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。
: `5 k# N% d# u& L: \6 @4 K/ A8 G: Y4 d" w
5582434bb5194f4094ccc75a9bc8d3b8.png 4 u$ q6 R# ]1 c. W* _

/ M, P; q' b2 Y+ l. H8 B# g
dd3ac392dd3e4ec181c352a3b0df52b4.png - W# k+ G9 h1 @; H2 p
: E4 w# Z1 k6 v1 `# Q: h: M
9d9e89a3815f4c66b3047cf13055301e.png
+ Q1 l' g2 K% S- X2 |! V' J' D( F! B5 m8 S+ R6 w
       数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。9 A3 r3 K# q9 J. j% N6 M

7 s- N' d( J) {9 L
% b* W. O( W; r
遇到的问题; ^3 m8 J2 V' ]) `' s
1,程序一直在中断中,不进入while循环?
! S; k* e: Z4 W) c, y" U5 t. _     可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。
* H5 Z& [7 U* V! m  l2 @* _
* g0 d* x5 _/ E) ~/ Y7 ]8 \/ e
2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:. W+ X0 u, r* N

; H& ~2 [# f; @' y3 r
cace746bbce24c8ea4c6ca9fda9ab587.png 3 f- a  r, }& {
# o9 @- C0 U7 D7 ~; w; \5 I
; E" f; ?5 Z8 p: y. Q4 U( `9 y4 C" }
3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,
' z! t4 l* g8 J  U9 y. o
3 W. |3 ?- Z; V( b7 s
a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;
- y0 N8 e1 U, k; p' G( u. O
! h/ j/ K0 R! f3 g! W' E" g
b,不能在中断服务函数中进行浮点运算;  ~% o: v- N! p" s) o, f' o
" c. O2 f1 G( z( G% Y8 ]+ f
c,不能在中断服务函数中调用不可重入函数如printf等;" H; \0 w1 `# j# d, L, C5 L! M! n
& J. j# d9 K7 `- |0 Y9 f% J
d,不能传递参数;* v) g+ G* L6 {1 t( O0 {
) Q. f. W4 U) N5 r# P* w
" U' C; H1 ]) h
附录:(各种中断的具体使用方法)
: l5 n# s" Q, q" @$ s; H$ q9 F% P& R% R5 s5 k+ m) U6 P
a3fe1854d0414e57a0e55cb15caf8171.png - A' ?" i8 z: Z; `' Y2 }
9 a" O4 h: Q5 o
4c8f71f57c0649039ace9d44b510d4c6.png
+ G$ M7 T# V( ]  t( d5 ?( U. q) q3 o
5130686851fd4e9d810e609c6fd22012.png   ]( {# @6 r! Z2 ~* p

0 ^2 m8 ~. f' F+ \* o' t————————————————, p& J; n5 m* U. h/ k* S$ q/ T
版权声明:jj198311如有侵权请联系删除+ ?  X, `# [) ?
* [+ n  U9 \, w* H+ [( e3 s
7 q. H' R$ x6 O! _+ q
赞 收藏 评论0 发布时间:2023-3-26 15:20

举报

0个回答

所属标签

相似技术帖

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