单片机型号:STM32G030C8T6
7 R, Q! [4 i# R1 l* k4 w' N2 y在初始化完串口后,开启串口接收中断,程序就一直在执行串口中断(此时串口无任何数据),通过在线查看串口外设的相关寄存器(如下图)发现RDR寄存器一直没有被清零,导致ISR寄存器的RXNE位一直有效,串口中断就一直处于触发的状态。5 c L5 C/ T6 D
% ~- I/ p2 L$ |$ w5 s5 V" E: n4 C" F! O* |! o5 w
通过查看STM32G0x0 Datasheet章节 26.8.10 Bit5 RXNE位,数据收据里面说到可以通过读取RDR寄存器或者往RXFRQ寄存器写1来清除ISR寄存器的RXNE标志位。/ B) Y! ?8 ?0 U. _8 L
( z3 F& F( {: u3 x( \, S+ z/ E( i3 k3 ?
$ J# u8 V. ?8 K5 h% O
LL库串口初始化及中断接收代码如下:9 K6 g# k; Z, k1 A' p* q/ ]5 I
* o I' v1 n6 r0 ]
- void Usart2_Init(u32 baudrate)
: @: N) \& ]5 M. n+ ~% C - {3 F- l( p: F8 R; h
- LL_USART_DeInit(USART2);
$ b; t! y9 u5 {0 n. s9 K! O - LL_USART_InitTypeDef USART_InitStruct = {0};& r5 g1 i! ~/ _
- LL_GPIO_InitTypeDef GPIO_InitStruct = {0};% R' t, }1 J' ^' P
-
8 Q+ y; i+ }( R* r: E- D3 i6 X; e - /* Peripheral clock enable *// V0 g# H' O$ d; E5 Z
- LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);- d5 q2 M, `, V, n2 W2 e
- LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
( K( A J: ^4 H2 f - / F O; i2 ?3 G# w; `- c; z; U
- GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
% E. h2 W! {* A. p# | - GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;4 g( B. n- y% G2 b
- GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
9 v' _* O! y0 ^: T7 Q! } - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;$ y+ U8 r( k, S! I+ F. z5 m- q
- GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;/ p, ^/ P0 N# y. K
- GPIO_InitStruct.Alternate = LL_GPIO_AF_1;+ y8 X( a: D) ]( i$ p
- LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
' B/ C( D* H; o1 k( l% i( Y" v$ r6 q -
- Y9 U! `) Z9 V4 t3 d, U4 q - GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
# }0 W4 O' U6 A7 d* ^4 D0 p$ h4 F - GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
|9 d* c; K2 S9 C/ O( v' H - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;. g8 [4 O* K% r0 w1 _+ w5 w/ S
- GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
8 h: v5 O$ w7 K) _% m. Q - GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
& H% D( I @; v7 d - GPIO_InitStruct.Alternate = LL_GPIO_AF_1;4 ]3 S; m8 \! P; W) d {/ C
- LL_GPIO_Init(GPIOA, &GPIO_InitStruct);4 s* k# z6 D8 I
-
2 B7 t$ s6 x. b+ I3 u# f - NVIC_SetPriority(USART2_IRQn, USART_PREPRIORITY);
& l6 R2 m- d2 K# o8 q - NVIC_EnableIRQ(USART2_IRQn);* R* T5 z" `; ?7 v; {8 ]* e
- 6 o9 d% l: ?4 ?( U- U; Q- E6 S/ u T
- USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;2 B5 |% f# A* J
- USART_InitStruct.BaudRate = baudrate; //波特率
* Q0 t2 O0 I" [& ^ - USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //8位数据
7 z% j0 M) K" Z; `: o - USART_InitStruct.StopBits = LL_USART_STOPBITS_2; //2位停止位. k7 J. ^2 \4 Y1 ?
- USART_InitStruct.Parity = LL_USART_PARITY_NONE; //无奇偶校验* m+ L$ K% j! B
- USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;* Q" U' V7 r- R. r
- USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
6 ^$ j) O9 C! d4 x7 _* ? - USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
: a/ M6 [ o! n0 X1 L - LL_USART_Init(USART2, &USART_InitStruct);7 @ `9 j: L9 g' t& c6 _
- ' P* r$ E; `- c8 f
- LL_USART_SetTXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8
W% W% O4 w) b2 n) j; g - LL_USART_SetRXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/8
" B3 V6 Q/ P C k& _' F -
7 j7 H7 I* b/ Z9 N7 E4 W - LL_USART_EnableIT_RXNE_RXFNE(USART2); //使能串口接收中断
- K, q, Z/ w: O0 o9 i+ R1 U - LL_USART_Enable(USART2);
* b% Z) c8 P- [$ ~: H - }! Z2 {* o$ \9 M- Z" L/ F% \
复制代码
3 S. t& d r6 B" D fvoid USART2_IRQHandler(void)$ ]8 v. l. `7 l. S( c
{% u7 D1 c3 E* T, t
u8 data;7 p$ }' t4 M; G5 F2 |. {: H
if (LL_USART_IsActiveFlag_RXNE_RXFNE(USART2)) { //判断接收数据寄存器是否有数据
1 D* O1 v& J* n //清除接收中断标志方式一:读取RDR寄存器以自动清除RXNE标志
; @% `' p# Z! }# r* t# P" f: ~ //清除接收中断标志方式二:往RXFRQ寄存器写1(刷新数据)以清除RXNE中断标志
, Y5 O$ D8 v" t0 B# u data = LL_USART_ReceiveData8(USART2); //读接收到的字节,同时相关标志自动清除+ I9 t7 r8 `, u8 e( j! g- B& W2 o$ |
LL_USART_RequestRxDataFlush(USART2);. [8 s; e- C2 _
}/ d8 L" P( D% L. V2 l
}5 O$ }) `7 K/ b! V, v: U
, j0 a7 F5 K4 W2 z+ X" }7 `+ C% `$ K' L- S1 g1 W4 v
3 K: k6 H$ U+ K, A
|