你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】探究STM32G0串口(LL库)接收中断一直触发的原因

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:55
单片机型号:STM32G030C8T6# i' A4 b" p0 H- U6 h* P
在初始化完串口后,开启串口接收中断,程序就一直在执行串口中断(此时串口无任何数据),通过在线查看串口外设的相关寄存器(如下图)发现RDR寄存器一直没有被清零,导致ISR寄存器的RXNE位一直有效,串口中断就一直处于触发的状态。: m1 a# X) W6 {* c
1dd517aa2148450cb4f0731830a8d2e0.png
5 O0 a5 C+ d" @8 |3 n4 n

9 U! W9 p# g+ Y7 t( o) s+ @通过查看STM32G0x0 Datasheet章节 26.8.10 Bit5 RXNE位,数据收据里面说到可以通过读取RDR寄存器或者往RXFRQ寄存器写1来清除ISR寄存器的RXNE标志位。
3 T7 x! E" Y0 n3 a8 L
* d8 ?6 J& s$ {& W+ V+ Z
8e8cfae417af4d18b57e22bfdb6f5df0.png

7 V' \- U" J: A% Y# m' J3 o4 f" o9 S9 K( ]( m3 K
LL库串口初始化及中断接收代码如下:* ]% i" P5 W: x9 h! T7 A! R

* Z7 S3 N2 M3 S
  1. void Usart2_Init(u32 baudrate)
    ) z9 I& n: B' u
  2. {4 Y. c$ P% P/ L
  3.         LL_USART_DeInit(USART2);
    ( Z( W' S* K; g5 C  a
  4.         LL_USART_InitTypeDef USART_InitStruct = {0};: z4 B0 ~" d$ ^1 f  k4 V
  5.         LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
    1 q2 @3 ]! A- r6 O# @
  6.         
    2 z  U7 o- e" X5 W% P
  7.         /* Peripheral clock enable */
    9 a6 x" F+ E0 w+ u
  8.         LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);' X( e% {1 z7 J2 z
  9.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);  b% y. u" ?6 q5 m% P/ ]' e3 d( c
  10.         $ p! I$ G, H8 \% O; Q+ B
  11.         GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
    + O0 W% d. J$ \+ u; q
  12.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
    * F9 T' l: K! K5 e$ T
  13.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;, X2 x1 q7 Z6 U) Z  s0 H/ o
  14.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;% w0 S$ L& P  s4 p; Z! h5 V# L
  15.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;" K: [: O8 D7 N: ?, N$ J
  16.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;" f# q& H5 _: K/ I
  17.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    5 p$ J1 h7 Y  C( B! I1 b
  18.         
      K4 A# d- f* h0 y! z+ ^/ c# X
  19.         GPIO_InitStruct.Pin = LL_GPIO_PIN_3;* W' c' W% Z: L% s+ X5 R
  20.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;, [/ _! m& T* Z( U% @$ r
  21.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
    9 Y  B4 T( N% T% c8 u
  22.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
    5 [; C8 C. g: P7 ^
  23.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;1 W, v: u3 O' {: ~1 }. e; l
  24.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;& j4 E: E; j/ S' A; u4 W, ~6 ^
  25.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    " Q) ?1 v) D2 [& P6 L( q6 s, Q. c
  26.         ' v. t% N$ i: X% U( D; q+ o
  27.         NVIC_SetPriority(USART2_IRQn, USART_PREPRIORITY);5 H& i. K4 ]: @( e+ H
  28.         NVIC_EnableIRQ(USART2_IRQn);. C! m1 A4 y+ m$ q4 b
  29.         / X8 p) j$ ^" d( p0 _- r; z% K
  30.         USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;
    - z9 b" V( J* `
  31.         USART_InitStruct.BaudRate = baudrate;  //波特率. s7 l1 J8 k, n
  32.         USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //8位数据
    ; ]& y2 P1 n( W2 Y/ a4 u
  33.         USART_InitStruct.StopBits = LL_USART_STOPBITS_2;  //2位停止位, O6 _- I7 j$ I3 ^4 c, a2 b
  34.         USART_InitStruct.Parity = LL_USART_PARITY_NONE;  //无奇偶校验
    " Z: e1 W9 y7 ?" j
  35.         USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;6 f1 C$ o5 J2 K# t2 W) I
  36.         USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;: ]" f% d: e- u8 u
  37.         USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;8 n4 F% w, w1 d. W+ R: {! q
  38.         LL_USART_Init(USART2, &USART_InitStruct);0 {" t; K- W. B: J2 P& P3 u2 Q& \
  39.         ! o/ q6 b4 d% o4 R
  40.         LL_USART_SetTXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8
    5 S0 R" p' p  s8 @" \
  41.         LL_USART_SetRXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/80 Q9 a7 A  F3 [4 w" Q
  42.         
    4 m0 P! U9 ~0 Z( ?
  43.         LL_USART_EnableIT_RXNE_RXFNE(USART2); //使能串口接收中断7 x$ e, [2 d& m4 }6 x; _6 ^
  44.         LL_USART_Enable(USART2);; L7 Y. R% n: |1 f
  45. }
    & P7 n9 y9 H! F4 G, u1 w
复制代码
- K7 M/ Q. i8 n* g$ q8 o1 M
void USART2_IRQHandler(void)1 W3 u$ }+ s' H2 e* [1 \# w
{
3 I  e; i% C4 b) I/ }    u8 data;
7 R( v9 B2 ~2 y& z7 L) l& o* Q+ N    if (LL_USART_IsActiveFlag_RXNE_RXFNE(USART2)) { //判断接收数据寄存器是否有数据
; O- {$ `4 d- o6 s4 X+ ], d                    //清除接收中断标志方式一:读取RDR寄存器以自动清除RXNE标志8 r# `( o1 R/ k- E3 @
                //清除接收中断标志方式二:往RXFRQ寄存器写1(刷新数据)以清除RXNE中断标志
( C: x# X* q9 m' R& U- Z! g; m( _        data = LL_USART_ReceiveData8(USART2); //读接收到的字节,同时相关标志自动清除
8 }& N8 P) s, F6 x        LL_USART_RequestRxDataFlush(USART2);
. |1 h: l% P# f) O  m    }
5 G8 _9 R- f! L}% Z% F' F+ p: B) D; U6 n+ \

! o& w9 a% c* j) p; d
; {1 A. H* N9 `: Z+ Q  S# U& S$ k" f4 g5 P, k8 B  F( j1 N3 v& z4 p
收藏 评论0 发布时间:2021-11-8 16:55

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版