|
STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义:5 m# ], c, C2 [ 8 Y$ N( U/ w( _! W1 W: T4 y: ^( o USART_IT_PE :奇偶错误中断 USART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断; `" j3 y7 A5 R6 h+ O USART_IT_TC :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断; USART_IT_RXNE :接收非空中断 ,接收到一个字符就产生一次中断 USART_IT_ORE_RX :接收溢出中断 ) N4 F3 k- L& _ " T9 ?; u9 J1 Z/ p USART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别); USART_IT_LBD :中断检测中断 ' }. y9 f! Q) o6 ?" T% }! X USART_IT_CTS :CTS中断 (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。) USART_IT_ERR :错误中断 USART_IT_NE :多缓冲区通信中的噪声标志 ) U7 r$ u7 @- p/ i ; N+ O6 u" B' f( [) @' L2 S, g+ Y USART_IT_FE :帧错误中断; 8 u z2 ^7 l4 L0 ]/ i0 d9 u
如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。* s( X: y1 \( b! p O0 E6 \, i: Q( k* ~
- ?( u8 [. \6 A9 U
) E2 z, M( F7 p/ D% z G. }! l
- 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循环? 可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。 & ?& ]. k4 P- w5 Q 2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下:
9 }9 T5 V3 z* z$ k* G % j/ r P& d* J+ q5 W S 3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,) X. _8 B4 k) D5 \/ \. R a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行; 5 |2 y3 G2 C1 z9 Y- ?$ j9 O) v2 k- A b,不能在中断服务函数中进行浮点运算;4 G) d. t% F$ m9 B8 v% G# g" H c,不能在中断服务函数中调用不可重入函数如printf等; d,不能传递参数; 附录:(各种中断的具体使用方法)3 ^! p9 q' E/ ~* Z, s- s % S# X2 z. u. s
/ O+ ~' A/ b9 _7 B( s ———————————————— 版权声明:jj198311如有侵权请联系删除' T6 s# R @5 Z& ~ * U! S/ |. R6 c$ ?" G |
【福利三:雨露均沾·逢7狂欢】之一:STM32F1外部中断异常故障的解决办法
STM32中断响应延迟优化:从NVIC配置到DMA加速的极致性能调优
基于STM32串口中断之缓存区溢出卡死经验分享
基于STM32数组越界异常中断经验分享
基于STM32之数组越界异常中断经验分享
基于STM32连接参数更新进程后导致断连的问题分析
基于STM32连接参数更新进程后导致断连的问题分析
基于STM32的定时器不按设定超时产生中断
基于STM32利用TIMER事件和栈帧体验中断响应经验分享
基于STM32外部中断原理和配置代码经验分享
微信公众号
手机版