单片机型号:STM32G030C8T6
* G& W" J: y% O8 p- i在初始化完串口后,开启串口接收中断,程序就一直在执行串口中断(此时串口无任何数据),通过在线查看串口外设的相关寄存器(如下图)发现RDR寄存器一直没有被清零,导致ISR寄存器的RXNE位一直有效,串口中断就一直处于触发的状态。( S0 j) M1 D" W0 U d
1 S# P( R& }( y! z& g! M
, | Y2 _7 o. S, h* e! D通过查看STM32G0x0 Datasheet章节 26.8.10 Bit5 RXNE位,数据收据里面说到可以通过读取RDR寄存器或者往RXFRQ寄存器写1来清除ISR寄存器的RXNE标志位。
! A9 q; h: K: l( s8 d$ P: b( ` }$ @! H$ ]9 B: `5 `
2 E' A5 Y C1 y1 |% W6 L
- e# p3 A0 U2 q: C, |* [8 @+ yLL库串口初始化及中断接收代码如下:
6 X; u: P1 a* {; |: e; q% [* f! ^( @" q' b! ]1 G" w1 p) k0 V# F/ o
- void Usart2_Init(u32 baudrate)3 q8 E C& z8 S& b+ n. U. G: G
- {
) t4 r9 U/ }* i: P) C& c - LL_USART_DeInit(USART2);2 d/ {- r. ~$ t4 E5 a4 {& O+ I
- LL_USART_InitTypeDef USART_InitStruct = {0};& P4 |! Q+ |! f/ p
- LL_GPIO_InitTypeDef GPIO_InitStruct = {0};7 l' ^9 u) h+ I+ N; T0 M
-
+ B9 D( |6 O2 Q" z+ F$ @5 ]' d, _ - /* Peripheral clock enable */! o/ l& J) w( g9 S8 h; B4 }' Q
- LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);: V+ f; ~6 Y; Z- n
- LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);# B' I* g8 U2 U0 V& g P$ w+ ?
- . s. h; u* A/ \* o) ~- f9 i. U
- GPIO_InitStruct.Pin = LL_GPIO_PIN_2;. L0 J& G# ]; v& d5 V" F" G- T: P
- GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
3 K- T7 E0 C( a% B - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;- C( i; K* u: o6 t6 x& m: w' ^
- GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
6 g$ Z9 S9 Y. N# s9 m3 h; d - GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;7 i+ z5 F4 g, I# l" j, i- E1 j! ~
- GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
$ ?# V% f3 I% A U5 |$ w - LL_GPIO_Init(GPIOA, &GPIO_InitStruct);/ O% f) o# t3 ]% p, A2 V% {; w
- 1 @* W( |8 {( s
- GPIO_InitStruct.Pin = LL_GPIO_PIN_3;! w: f8 o# \% y5 D& [+ H: q, M* z5 G
- GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
. _7 x' @7 G V4 r3 P# Y$ E - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;! w* q5 i+ L+ L# ?9 b* _$ f: {7 ?
- GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;3 A$ {1 u9 w. p- L2 K: E) l
- GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
1 U7 H2 a- e9 `- _3 k" v - GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
+ y/ I3 r* Q% D1 R - LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
1 x3 e% K4 R' u: @0 q! d7 [ -
2 m2 V( K8 j. u9 u/ k0 @ - NVIC_SetPriority(USART2_IRQn, USART_PREPRIORITY);, A8 [( L2 e: {6 x# W; [
- NVIC_EnableIRQ(USART2_IRQn);
2 O9 }( t1 I& U1 s# H+ g1 O0 } -
6 T- m# C( z. \% P4 W - USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;7 _6 r( c7 p* j* j* T+ F( S, h8 b
- USART_InitStruct.BaudRate = baudrate; //波特率% n3 [) j) a8 c2 C" K0 ?: g
- USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //8位数据 O6 I; w5 W( W) }/ b, ^' _6 M
- USART_InitStruct.StopBits = LL_USART_STOPBITS_2; //2位停止位
* I5 V5 g" s& J3 U+ ]# M4 \ - USART_InitStruct.Parity = LL_USART_PARITY_NONE; //无奇偶校验! S. }, H H( i# A7 X! J
- USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;3 L, F ^% V* U: R$ S: {8 f
- USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;8 i4 c1 J9 v* [/ K/ L8 Z' M
- USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;* [$ T- {0 D7 Q+ d! _/ \& B
- LL_USART_Init(USART2, &USART_InitStruct);
! z3 I' B/ }( s |+ F" @1 O3 P' Q - 7 i3 o# Z' X0 h7 R7 {) z- V
- LL_USART_SetTXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8
, ~+ r' c, x$ A# z% G4 o. [ - LL_USART_SetRXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/87 r0 L- i" M: b
-
3 v% A4 s. X0 L" s: z9 q8 f - LL_USART_EnableIT_RXNE_RXFNE(USART2); //使能串口接收中断
6 H8 J. O% `1 c$ T; `1 W$ I5 p - LL_USART_Enable(USART2);
- G, ]& C x+ T7 T5 T - }
+ W w9 a& q- D
复制代码
' N* M8 K$ E& l( O$ qvoid USART2_IRQHandler(void)
. I0 a9 g5 [# c4 H) Q{
5 V- x4 o. M! S, w% V u8 data;
H* n Y7 H Y, [. k3 |1 i if (LL_USART_IsActiveFlag_RXNE_RXFNE(USART2)) { //判断接收数据寄存器是否有数据
5 j) S% z; b9 U5 ^ //清除接收中断标志方式一:读取RDR寄存器以自动清除RXNE标志0 F( k* i8 `8 |! x
//清除接收中断标志方式二:往RXFRQ寄存器写1(刷新数据)以清除RXNE中断标志3 }3 f7 ^7 w# s, c% v! e
data = LL_USART_ReceiveData8(USART2); //读接收到的字节,同时相关标志自动清除- D9 y4 Y, N) o: n/ C0 _, i0 ?
LL_USART_RequestRxDataFlush(USART2);% T) {. ^- a& P" B8 ~/ o( |
}
* z" P) S& g7 c}8 a+ |- ?3 z" n
+ \, Y8 [; W6 z+ Z
! `( y8 s# c- O* p6 E* S
/ u- W" I- I: H- g4 F% i0 U( a |