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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:55
单片机型号:STM32G030C8T6! m, T, e$ Y* }( L& B- y; s& C
在初始化完串口后,开启串口接收中断,程序就一直在执行串口中断(此时串口无任何数据),通过在线查看串口外设的相关寄存器(如下图)发现RDR寄存器一直没有被清零,导致ISR寄存器的RXNE位一直有效,串口中断就一直处于触发的状态。
6 ^1 Z6 n5 @: w' @+ S1 W
1dd517aa2148450cb4f0731830a8d2e0.png

+ 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+ [
8e8cfae417af4d18b57e22bfdb6f5df0.png
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
  1. void Usart2_Init(u32 baudrate)
    , T* T: d  V. H& o1 s+ G
  2. {
    ; v1 V* o2 N$ a& t" M6 b0 j# s; U
  3.         LL_USART_DeInit(USART2);
    9 X- Y4 y$ S5 Y8 ?/ ?/ Q" a
  4.         LL_USART_InitTypeDef USART_InitStruct = {0};
    7 f$ v; j& N1 x( O  c2 _3 |! C
  5.         LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
    9 Y3 N: p+ p- n/ F
  6.         + [' Q7 K( t6 L  ~" M( j
  7.         /* Peripheral clock enable */
    ( _; D3 {. W, ~3 j- o$ L
  8.         LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);
    . {5 H/ H/ Q3 V# v
  9.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);2 S( w& J8 H: L2 {/ M* y
  10.         
    9 |' Q2 h+ f% C" A2 o) V% m$ {# |
  11.         GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
    5 O; c9 b( K' ^6 b# u  G
  12.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
    ( G5 D# }' L/ B  a
  13.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
    3 ]3 I9 t5 D& T5 x
  14.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;' V5 I9 M. {) h) ?) T% B
  15.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
    7 K# B: |/ r! O9 I& ^
  16.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
    * z  Z3 d# E  r' i2 ]6 ?
  17.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);) J. j" B- w' X. z! A
  18.         . R" d! L' t; ]) Q( I0 G, [
  19.         GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
    - A3 W0 S" p5 ^4 R
  20.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
    : I, `' U4 o- T7 T! ]2 {6 Y/ W2 ]
  21.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
    ) |, k* ~9 w3 D& |: y
  22.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;. C( c6 w# H- O0 X5 g/ c- t
  23.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
    ; U- T  g1 B2 A4 l
  24.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;' C& ~8 x+ p2 O! K* |
  25.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);# i9 ]+ k! V, X) f7 d9 V; k2 x
  26.         
    ; J9 K, m5 A, O
  27.         NVIC_SetPriority(USART2_IRQn, USART_PREPRIORITY);
    3 j: m* Y( E1 N; f) D2 g
  28.         NVIC_EnableIRQ(USART2_IRQn);6 _# e0 r1 H8 p
  29.         
    0 X  p$ {) p: s0 T
  30.         USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;
    8 d: y# w! D+ t5 P$ }- `; b& W
  31.         USART_InitStruct.BaudRate = baudrate;  //波特率9 T+ \. \5 x& S8 O1 x6 K
  32.         USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //8位数据
      f" l" L, M6 O; H- f2 C( O& M0 \, r
  33.         USART_InitStruct.StopBits = LL_USART_STOPBITS_2;  //2位停止位
    ; Q# I6 E, c/ `& Z, h
  34.         USART_InitStruct.Parity = LL_USART_PARITY_NONE;  //无奇偶校验% M$ m/ N6 m/ W0 U% @; s
  35.         USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
    7 ^; M. |, b( ^3 }+ C
  36.         USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;* O% s. E' [( O" j# t8 M
  37.         USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;) R' K3 ^, q% `7 C6 X
  38.         LL_USART_Init(USART2, &USART_InitStruct);
    3 a+ M8 A! |& V6 q1 I( @
  39.         
    ; P4 c' h' B3 U& G. \- L
  40.         LL_USART_SetTXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8$ i3 h: l; v$ q1 I
  41.         LL_USART_SetRXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/8
    , u) t, N5 }! v5 h1 ^% ^% K
  42.         & y. c  q8 G% O1 J( r2 |
  43.         LL_USART_EnableIT_RXNE_RXFNE(USART2); //使能串口接收中断
    ) z* F  y! h& F, K+ @- D& V* I3 t
  44.         LL_USART_Enable(USART2);5 y4 R& k; V# ?$ ?
  45. }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
收藏 评论0 发布时间:2021-11-8 16:55

举报

0个回答

所属标签

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