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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:55
单片机型号:STM32G030C8T6
* G& W" J: y% O8 p- i在初始化完串口后,开启串口接收中断,程序就一直在执行串口中断(此时串口无任何数据),通过在线查看串口外设的相关寄存器(如下图)发现RDR寄存器一直没有被清零,导致ISR寄存器的RXNE位一直有效,串口中断就一直处于触发的状态。( S0 j) M1 D" W0 U  d
1dd517aa2148450cb4f0731830a8d2e0.png
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 `
8e8cfae417af4d18b57e22bfdb6f5df0.png
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
  1. void Usart2_Init(u32 baudrate)3 q8 E  C& z8 S& b+ n. U. G: G
  2. {
    ) t4 r9 U/ }* i: P) C& c
  3.         LL_USART_DeInit(USART2);2 d/ {- r. ~$ t4 E5 a4 {& O+ I
  4.         LL_USART_InitTypeDef USART_InitStruct = {0};& P4 |! Q+ |! f/ p
  5.         LL_GPIO_InitTypeDef GPIO_InitStruct = {0};7 l' ^9 u) h+ I+ N; T0 M
  6.         
    + B9 D( |6 O2 Q" z+ F$ @5 ]' d, _
  7.         /* Peripheral clock enable */! o/ l& J) w( g9 S8 h; B4 }' Q
  8.         LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);: V+ f; ~6 Y; Z- n
  9.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);# B' I* g8 U2 U0 V& g  P$ w+ ?
  10.         . s. h; u* A/ \* o) ~- f9 i. U
  11.         GPIO_InitStruct.Pin = LL_GPIO_PIN_2;. L0 J& G# ]; v& d5 V" F" G- T: P
  12.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
    3 K- T7 E0 C( a% B
  13.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;- C( i; K* u: o6 t6 x& m: w' ^
  14.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
    6 g$ Z9 S9 Y. N# s9 m3 h; d
  15.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;7 i+ z5 F4 g, I# l" j, i- E1 j! ~
  16.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
    $ ?# V% f3 I% A  U5 |$ w
  17.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);/ O% f) o# t3 ]% p, A2 V% {; w
  18.         1 @* W( |8 {( s
  19.         GPIO_InitStruct.Pin = LL_GPIO_PIN_3;! w: f8 o# \% y5 D& [+ H: q, M* z5 G
  20.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
    . _7 x' @7 G  V4 r3 P# Y$ E
  21.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;! w* q5 i+ L+ L# ?9 b* _$ f: {7 ?
  22.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;3 A$ {1 u9 w. p- L2 K: E) l
  23.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
    1 U7 H2 a- e9 `- _3 k" v
  24.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
    + y/ I3 r* Q% D1 R
  25.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    1 x3 e% K4 R' u: @0 q! d7 [
  26.         
    2 m2 V( K8 j. u9 u/ k0 @
  27.         NVIC_SetPriority(USART2_IRQn, USART_PREPRIORITY);, A8 [( L2 e: {6 x# W; [
  28.         NVIC_EnableIRQ(USART2_IRQn);
    2 O9 }( t1 I& U1 s# H+ g1 O0 }
  29.         
    6 T- m# C( z. \% P4 W
  30.         USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;7 _6 r( c7 p* j* j* T+ F( S, h8 b
  31.         USART_InitStruct.BaudRate = baudrate;  //波特率% n3 [) j) a8 c2 C" K0 ?: g
  32.         USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //8位数据  O6 I; w5 W( W) }/ b, ^' _6 M
  33.         USART_InitStruct.StopBits = LL_USART_STOPBITS_2;  //2位停止位
    * I5 V5 g" s& J3 U+ ]# M4 \
  34.         USART_InitStruct.Parity = LL_USART_PARITY_NONE;  //无奇偶校验! S. }, H  H( i# A7 X! J
  35.         USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;3 L, F  ^% V* U: R$ S: {8 f
  36.         USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;8 i4 c1 J9 v* [/ K/ L8 Z' M
  37.         USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;* [$ T- {0 D7 Q+ d! _/ \& B
  38.         LL_USART_Init(USART2, &USART_InitStruct);
    ! z3 I' B/ }( s  |+ F" @1 O3 P' Q
  39.         7 i3 o# Z' X0 h7 R7 {) z- V
  40.         LL_USART_SetTXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8
    , ~+ r' c, x$ A# z% G4 o. [
  41.         LL_USART_SetRXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/87 r0 L- i" M: b
  42.         
    3 v% A4 s. X0 L" s: z9 q8 f
  43.         LL_USART_EnableIT_RXNE_RXFNE(USART2); //使能串口接收中断
    6 H8 J. O% `1 c$ T; `1 W$ I5 p
  44.         LL_USART_Enable(USART2);
    - G, ]& C  x+ T7 T5 T
  45. }
    + 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
赞 收藏 评论0 发布时间:2021-11-8 16:55

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版