STM32中设置了许多中断,今天我们就来讲讲几个常用中断的使用细节及注意事项。首先,下面是各个中断代表的意义: USART_IT_PE :奇偶错误中断 USART_IT_TXE:写完成中断 (写寄存器DR清零),数据全部移出TDR寄存器就置一,产生中断; 8 x" `8 G$ q# F. O1 {9 p USART_IT_TC :整个数据接收完再写完产生中断,整个数据包接收完成再发送完成产生中断; USART_IT_RXNE :接收非空中断 ,接收到一个字符就产生一次中断 3 m' _& j$ l8 y. b- E: ^; \ USART_IT_ORE_RX :接收溢出中断 # n& B- H4 \- U( m/ Q: N1 l + V# m- J) `+ U$ n* j8 O USART_IT_IDLE :空闲中断,接收完所有字符产生一次中断(注意与RXNE的区别); USART_IT_LBD :中断检测中断 + _- x" r( c! r$ _3 X8 B6 Y USART_IT_CTS :CTS中断 (RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低,CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。) USART_IT_ERR :错误中断 $ a# [ }/ L0 B% @ USART_IT_NE :多缓冲区通信中的噪声标志 USART_IT_FE :帧错误中断;* P" R2 l+ Q4 t" [4 r' x 如果RXNE没有复位又接到下一个字符,则移位寄存器中的字符会丢失,直到RXNE复位,移位寄存器中的字符开始移到RDR中,则复位前的字符全部丢失。当该位置 1 时,RDR 寄存器的内容不会丢失,但移位寄存器会被覆盖。如果 EIE 位置 1, 则在进行多缓冲区通信时会对 ORE 标志生成一个中断。 " k% o# S/ ^ H; _' A( M# |: m 7 H; t* q3 ^; X ) a" F4 g" U3 ^ z) s! {( ^& j 4 x4 r. ^, x5 ?. g$ a5 w# @1 y 数据通过串口线一位一位传过来,先传到移位寄存器,“移位”就是形容一位一位bit传过来的过程,一个数据帧有起始位,数据位,校验位,停止位。当移位寄存器识别了这个数据帧之后,通过“并行通信”的方式“一次性”传递给RDR寄存器,就是把八个数据位一次性传给RDR寄存器,我们从内部总线向RDR寄存器写入数据的时候也是并行通信。 , ]1 A, l* G) H1 ?. k! B # \( \4 k5 V& f4 s( a 遇到的问题6 Z+ J9 B; y" A" r) U) m 1,程序一直在中断中,不进入while循环? 可能是使能了某个中断,但没有清除掉中断标志位(或清除不成功),另外使用USART_FLAG_TC中断标志位可以不用进行TC的中断使能。 & I3 u' T# x* a! x; B5 O. } 2,对于stm32中的串口中断中要慎用printf打印函数,printf极度耗时。且在keil中使用printf函数需要重新定义一下。具体操作如下: . \0 h# Q# n# o1 s% u2 ~ # N- U; J4 K, s8 i& h 3,中断服务函数尽可能的短,占用尽量少的时间,防止字符的丢失。在中断服务函数中,' m3 P, Z; K, H 4 ?0 W0 D' @9 P ~* _0 m a,不能返回值,因为中断服务函数的触发是随机的,不可调用,要是有返回值的话,就存在堆栈的问题,但是没有具体的一个内存来存放返回值,会造成混乱,所以不行;3 }" h; i$ [7 S$ I+ E - m, z8 P& J2 Q8 L b,不能在中断服务函数中进行浮点运算;8 F7 K S$ t' ]/ G# |4 [ c,不能在中断服务函数中调用不可重入函数如printf等;2 D1 b/ }2 q4 L # Q+ Z5 A$ @- R2 E d,不能传递参数; 8 S% N8 c& F! | ( u. o$ [$ B0 U4 G 附录:(各种中断的具体使用方法) # f5 W7 \" n1 t% s 0 n* n# q: _( Z, B5 L( r, Q9 s ) g b: F Q) v4 t, k ———————————————— 版权声明:jj198311如有侵权请联系删除, M2 c1 T+ X+ A. H : u& d/ C: J" c9 \+ J* k - N6 \8 @6 ?' C+ i% t |