单片机型号:STM32G030C8T6! m, T, e$ Y* }( L& B- y; s& C
在初始化完串口后,开启串口接收中断,程序就一直在执行串口中断(此时串口无任何数据),通过在线查看串口外设的相关寄存器(如下图)发现RDR寄存器一直没有被清零,导致ISR寄存器的RXNE位一直有效,串口中断就一直处于触发的状态。
6 ^1 Z6 n5 @: w' @+ S1 W
+ U, n* s# T8 }8 B& \( T/ o4 D2 t
% H5 H* B, A+ \( r1 D) D通过查看STM32G0x0 Datasheet章节 26.8.10 Bit5 RXNE位,数据收据里面说到可以通过读取RDR寄存器或者往RXFRQ寄存器写1来清除ISR寄存器的RXNE标志位。: w" i) w- v' n; @
- L: }/ k9 D+ [6 }: _! o, N% R7 I
% V, B% q8 J" V9 ]8 d' F
LL库串口初始化及中断接收代码如下:; ^: u0 z4 ~# M4 [: }
+ _7 B4 ^/ J' {6 ]1 Q9 G, F- void Usart2_Init(u32 baudrate)
, T* T: d V. H& o1 s+ G - {
; v1 V* o2 N$ a& t" M6 b0 j# s; U - LL_USART_DeInit(USART2);
9 X- Y4 y$ S5 Y8 ?/ ?/ Q" a - LL_USART_InitTypeDef USART_InitStruct = {0};
7 f$ v; j& N1 x( O c2 _3 |! C - LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
9 Y3 N: p+ p- n/ F - + [' Q7 K( t6 L ~" M( j
- /* Peripheral clock enable */
( _; D3 {. W, ~3 j- o$ L - LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);
. {5 H/ H/ Q3 V# v - LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);2 S( w& J8 H: L2 {/ M* y
-
9 |' Q2 h+ f% C" A2 o) V% m$ {# | - GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
5 O; c9 b( K' ^6 b# u G - GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
( G5 D# }' L/ B a - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
3 ]3 I9 t5 D& T5 x - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;' V5 I9 M. {) h) ?) T% B
- GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
7 K# B: |/ r! O9 I& ^ - GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
* z Z3 d# E r' i2 ]6 ? - LL_GPIO_Init(GPIOA, &GPIO_InitStruct);) J. j" B- w' X. z! A
- . R" d! L' t; ]) Q( I0 G, [
- GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
- A3 W0 S" p5 ^4 R - GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
: I, `' U4 o- T7 T! ]2 {6 Y/ W2 ] - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
) |, k* ~9 w3 D& |: y - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;. C( c6 w# H- O0 X5 g/ c- t
- GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
; U- T g1 B2 A4 l - GPIO_InitStruct.Alternate = LL_GPIO_AF_1;' C& ~8 x+ p2 O! K* |
- LL_GPIO_Init(GPIOA, &GPIO_InitStruct);# i9 ]+ k! V, X) f7 d9 V; k2 x
-
; J9 K, m5 A, O - NVIC_SetPriority(USART2_IRQn, USART_PREPRIORITY);
3 j: m* Y( E1 N; f) D2 g - NVIC_EnableIRQ(USART2_IRQn);6 _# e0 r1 H8 p
-
0 X p$ {) p: s0 T - USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;
8 d: y# w! D+ t5 P$ }- `; b& W - USART_InitStruct.BaudRate = baudrate; //波特率9 T+ \. \5 x& S8 O1 x6 K
- USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //8位数据
f" l" L, M6 O; H- f2 C( O& M0 \, r - USART_InitStruct.StopBits = LL_USART_STOPBITS_2; //2位停止位
; Q# I6 E, c/ `& Z, h - USART_InitStruct.Parity = LL_USART_PARITY_NONE; //无奇偶校验% M$ m/ N6 m/ W0 U% @; s
- USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
7 ^; M. |, b( ^3 }+ C - USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;* O% s. E' [( O" j# t8 M
- USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;) R' K3 ^, q% `7 C6 X
- LL_USART_Init(USART2, &USART_InitStruct);
3 a+ M8 A! |& V6 q1 I( @ -
; P4 c' h' B3 U& G. \- L - LL_USART_SetTXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8$ i3 h: l; v$ q1 I
- LL_USART_SetRXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/8
, u) t, N5 }! v5 h1 ^% ^% K - & y. c q8 G% O1 J( r2 |
- LL_USART_EnableIT_RXNE_RXFNE(USART2); //使能串口接收中断
) z* F y! h& F, K+ @- D& V* I3 t - LL_USART_Enable(USART2);5 y4 R& k; V# ?$ ?
- }9 [8 u. Y! @2 O4 G+ R7 Q
复制代码
; ?5 |7 N' `# @2 r% \9 cvoid USART2_IRQHandler(void)7 q- @0 `2 C7 ]) |3 [
{
: a* D- X* ? t3 l u8 data;
" [7 O; O' [) c if (LL_USART_IsActiveFlag_RXNE_RXFNE(USART2)) { //判断接收数据寄存器是否有数据
9 N. n# h( o. ?) z" E3 M9 z //清除接收中断标志方式一:读取RDR寄存器以自动清除RXNE标志
% t/ P5 d) L8 R0 ]; Y5 Y //清除接收中断标志方式二:往RXFRQ寄存器写1(刷新数据)以清除RXNE中断标志
$ X! ]' F: O5 z) c o4 y" m data = LL_USART_ReceiveData8(USART2); //读接收到的字节,同时相关标志自动清除. c: L- N( o/ g$ I8 j8 t1 j/ f. }
LL_USART_RequestRxDataFlush(USART2);
: e6 J9 s: y6 f, ?! P2 L, s$ M }
|9 Z8 W0 `7 ~1 [" ]8 O. g}4 D1 ~1 `. j2 Z, z: N) e- [1 u
; |7 _+ {% l& V9 Z6 o
. @# {' [. v' A5 w8 w4 q4 W7 t
) [. M6 ?3 x# Y* H# c; q |