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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:55
单片机型号:STM32G030C8T6
7 R, Q! [4 i# R1 l* k4 w' N2 y在初始化完串口后,开启串口接收中断,程序就一直在执行串口中断(此时串口无任何数据),通过在线查看串口外设的相关寄存器(如下图)发现RDR寄存器一直没有被清零,导致ISR寄存器的RXNE位一直有效,串口中断就一直处于触发的状态。5 c  L5 C/ T6 D
1dd517aa2148450cb4f0731830a8d2e0.png

% ~- 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( \
8e8cfae417af4d18b57e22bfdb6f5df0.png
, 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 ]
  1. void Usart2_Init(u32 baudrate)
    : @: N) \& ]5 M. n+ ~% C
  2. {3 F- l( p: F8 R; h
  3.         LL_USART_DeInit(USART2);
    $ b; t! y9 u5 {0 n. s9 K! O
  4.         LL_USART_InitTypeDef USART_InitStruct = {0};& r5 g1 i! ~/ _
  5.         LL_GPIO_InitTypeDef GPIO_InitStruct = {0};% R' t, }1 J' ^' P
  6.         
    8 Q+ y; i+ }( R* r: E- D3 i6 X; e
  7.         /* Peripheral clock enable *// V0 g# H' O$ d; E5 Z
  8.         LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);- d5 q2 M, `, V, n2 W2 e
  9.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
    ( K( A  J: ^4 H2 f
  10.         / F  O; i2 ?3 G# w; `- c; z; U
  11.         GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
    % E. h2 W! {* A. p# |
  12.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;4 g( B. n- y% G2 b
  13.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
    9 v' _* O! y0 ^: T7 Q! }
  14.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;$ y+ U8 r( k, S! I+ F. z5 m- q
  15.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;/ p, ^/ P0 N# y. K
  16.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;+ y8 X( a: D) ]( i$ p
  17.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    ' B/ C( D* H; o1 k( l% i( Y" v$ r6 q
  18.         
    - Y9 U! `) Z9 V4 t3 d, U4 q
  19.         GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
    # }0 W4 O' U6 A7 d* ^4 D0 p$ h4 F
  20.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
      |9 d* c; K2 S9 C/ O( v' H
  21.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;. g8 [4 O* K% r0 w1 _+ w5 w/ S
  22.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
    8 h: v5 O$ w7 K) _% m. Q
  23.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
    & H% D( I  @; v7 d
  24.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;4 ]3 S; m8 \! P; W) d  {/ C
  25.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);4 s* k# z6 D8 I
  26.         
    2 B7 t$ s6 x. b+ I3 u# f
  27.         NVIC_SetPriority(USART2_IRQn, USART_PREPRIORITY);
    & l6 R2 m- d2 K# o8 q
  28.         NVIC_EnableIRQ(USART2_IRQn);* R* T5 z" `; ?7 v; {8 ]* e
  29.         6 o9 d% l: ?4 ?( U- U; Q- E6 S/ u  T
  30.         USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;2 B5 |% f# A* J
  31.         USART_InitStruct.BaudRate = baudrate;  //波特率
    * Q0 t2 O0 I" [& ^
  32.         USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //8位数据
    7 z% j0 M) K" Z; `: o
  33.         USART_InitStruct.StopBits = LL_USART_STOPBITS_2;  //2位停止位. k7 J. ^2 \4 Y1 ?
  34.         USART_InitStruct.Parity = LL_USART_PARITY_NONE;  //无奇偶校验* m+ L$ K% j! B
  35.         USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;* Q" U' V7 r- R. r
  36.         USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
    6 ^$ j) O9 C! d4 x7 _* ?
  37.         USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
    : a/ M6 [  o! n0 X1 L
  38.         LL_USART_Init(USART2, &USART_InitStruct);7 @  `9 j: L9 g' t& c6 _
  39.         ' P* r$ E; `- c8 f
  40.         LL_USART_SetTXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8
      W% W% O4 w) b2 n) j; g
  41.         LL_USART_SetRXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/8
    " B3 V6 Q/ P  C  k& _' F
  42.         
    7 j7 H7 I* b/ Z9 N7 E4 W
  43.         LL_USART_EnableIT_RXNE_RXFNE(USART2); //使能串口接收中断
    - K, q, Z/ w: O0 o9 i+ R1 U
  44.         LL_USART_Enable(USART2);
    * b% Z) c8 P- [$ ~: H
  45. }! 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
收藏 评论0 发布时间:2021-11-8 16:55

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版