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

基于STM32中断经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:20
     STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:5 m# ], c, C2 [
8 Y$ N( U/ w( _! W1 W: T4 y: ^( o
USART_IT_PE  :奇偶错误中断                                                   
- x4 H: f! X6 z$ |! L! a. dUSART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断;                         `" j3 y7 A5 R6 h+ O
USART_IT_TC  :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断;    USART_IT_RXNE :接收非空中断  ,接收到一个字符就产生一次中断                     
& Q# J. e4 n5 F$ ~USART_IT_ORE_RX :接收溢出中断                                           ) N4 F3 k- L& _
" T9 ?; u9 J1 Z/ p
USART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别);                     
4 z" O% E9 j/ d) s3 o+ hUSART_IT_LBD  :中断检测中断                                                
+ R  _+ @$ ]2 U( @1 Y' }. y9 f! Q) o6 ?" T% }! X
USART_IT_CTS   :CTS中断   (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。)
" S/ Q# [6 E: l/ n  s

# m* ~; y4 r  ~ USART_IT_ERR :错误中断                                                                  
. Q% ]) e% s/ d1 Q- e/ ?# s. i* h7 l1 p USART_IT_NE   :多缓冲区通信中的噪声标志                                                 ) U7 r$ u7 @- p/ i
; N+ O6 u" B' f( [) @' L2 S, g+ Y
USART_IT_FE :帧错误中断;
4 s/ m% C4 x/ ]9 V+ X! S8 u  z2 ^7 l4 L0 ]/ i0 d9 u
20170729232506459.jpg
: l% _! m7 Y, j8 T      
& N$ j) L$ V# R& R1 ^  D8 {      如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。* s( X: y1 \( b! p  O0 E6 \, i: Q( k* ~

; m* Z- g' t: n2 H4 }( I
5582434bb5194f4094ccc75a9bc8d3b8.png ) u  `" X, i( u1 f: [  J0 g: p
- ?( u8 [. \6 A9 U
dd3ac392dd3e4ec181c352a3b0df52b4.png 6 Z4 U: }( S* v6 R  e) s! f
) E2 z, M( F7 p/ D% z  G. }! l
9d9e89a3815f4c66b3047cf13055301e.png
6 o* L* B6 e4 S, b# m$ o- j# G8 C/ v+ X* U. ^. n8 O- x6 X
       数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。) }( P# S4 P# r" t: P
4 x8 R9 Q# }4 a+ G5 o- D
2 s1 X3 @/ c  U1 f3 Z' ]0 K
遇到的问题' H5 N* g* n0 p# }) M! Q
1,程序一直在中断中,不进入while循环?
& w9 s+ k, ]: N& i- N8 H& \     可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。
; f6 \+ c. h( p6 X! C3 O, S& ?& ]. k4 P- w5 Q
2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:
% C9 o. C& C4 c+ C7 ?
2 Z: d+ b+ [" Z" e0 h4 \6 \
cace746bbce24c8ea4c6ca9fda9ab587.png ) S  H1 M) H. E0 e  z' `
9 }9 T5 V3 z* z$ k* G
% j/ r  P& d* J+ q5 W  S
3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,) X. _8 B4 k) D5 \/ \. R

5 ?2 @! B0 r+ D) d" p+ ?& T  S' i
a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;
# `% J% i% O1 a% r2 Q5 |2 y3 G2 C1 z9 Y- ?$ j9 O) v2 k- A
b,不能在中断服务函数中进行浮点运算;4 G) d. t% F$ m9 B8 v% G# g" H

0 I0 d; f/ F1 U, X$ F6 a* p" J6 |
c,不能在中断服务函数中调用不可重入函数如printf等;
) I( {6 U2 W3 V
+ {/ |1 `8 |( B! H- [; h
d,不能传递参数;
+ }  D: R2 d; V% w# S3 e
3 u# g" X/ v& a

9 y6 a9 e; t9 t2 Z2 h( c附录:(各种中断的具体使用方法)3 ^! p9 q' E/ ~* Z, s- s
% S# X2 z. u. s
a3fe1854d0414e57a0e55cb15caf8171.png 4 z4 U# J9 R+ G  I  h/ G

3 K8 {& j' g2 V6 J; S8 `9 t
4c8f71f57c0649039ace9d44b510d4c6.png
3 q3 V- @- o7 e# K
- T8 w; C6 H& @1 R: \
5130686851fd4e9d810e609c6fd22012.png 3 r, |: ?1 }( L) h4 h8 L  y
/ O+ ~' A/ b9 _7 B( s
————————————————
6 c( k0 L( [0 p- m& m版权声明:jj198311如有侵权请联系删除' T6 s# R  @5 Z& ~
* U! S/ |. R6 c$ ?" G

1 Z) U  G0 w5 R! q; Y2 g
赞 收藏 评论0 发布时间:2023-3-26 15:20

举报

0个回答

所属标签

相似技术帖

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