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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:55
单片机型号:STM32G030C8T69 N4 Q7 g4 Z! X+ j: Y# p- H7 Z7 r) v
在初始化完串口后,开启串口接收中断,程序就一直在执行串口中断(此时串口无任何数据),通过在线查看串口外设的相关寄存器(如下图)发现RDR寄存器一直没有被清零,导致ISR寄存器的RXNE位一直有效,串口中断就一直处于触发的状态。
( v: N- g5 A9 F8 X
1dd517aa2148450cb4f0731830a8d2e0.png
, |% {3 D+ f& E' I" y! f  [2 [

( f: e: D' @5 N) b" t- s# H3 y- W; s通过查看STM32G0x0 Datasheet章节 26.8.10 Bit5 RXNE位,数据收据里面说到可以通过读取RDR寄存器或者往RXFRQ寄存器写1来清除ISR寄存器的RXNE标志位。
5 c7 G% U9 }' {3 A4 N3 B% M8 S$ f# ^' K! B1 x, K9 P4 S
8e8cfae417af4d18b57e22bfdb6f5df0.png
* X1 Y  ~5 m. b

2 e: K5 ~% I! Y/ v" s. W; q# dLL库串口初始化及中断接收代码如下:
8 r- z6 W( R8 C0 B% f7 h% d& ?6 l& Z. P
  1. void Usart2_Init(u32 baudrate)
    : A& Q8 {$ p* H- d
  2. {
    # z! h4 k. K* }/ e2 M% ~0 @
  3.         LL_USART_DeInit(USART2);
    / g* V. l/ X& n4 A
  4.         LL_USART_InitTypeDef USART_InitStruct = {0};
    ' C# T9 P9 \. @- l
  5.         LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
    * ?/ t/ [% Y0 A* c: @0 v$ S
  6.         
    6 X' a, U9 h& {6 ]7 d
  7.         /* Peripheral clock enable */
    3 d; J$ R6 U8 @/ ^! K" z8 g
  8.         LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);
    . [3 v1 u3 }. \1 K9 O5 b6 q  v
  9.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);) i4 K* d0 q# p) M$ }2 V6 @- s
  10.         
    ( ^: m5 b: X+ D& n
  11.         GPIO_InitStruct.Pin = LL_GPIO_PIN_2;0 Q; @* \8 X4 J6 O, P
  12.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;( a$ H4 m1 _, E( b, R
  13.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
    : D, a7 z4 `4 ]2 ^6 y" W0 g
  14.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;' {% }  x' ?* c1 g/ V! ~4 @
  15.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
    % w, Z8 s4 E8 _$ Q' z
  16.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;% v4 ?* g2 X  n9 ?( @5 a
  17.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    ' c3 U  _" O; b
  18.         6 w. z! T1 P! R$ M8 I1 t
  19.         GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
    0 A8 A, T* V6 }5 t; m" h& C. N7 T
  20.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;& |# z, Q% P; p- B) }. g; t
  21.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;4 Z( Z' K/ y3 I8 \+ w
  22.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;( ]# n( ?$ }5 `) z3 r8 q9 Q
  23.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;7 _: Y5 A+ U. k# W1 s( D
  24.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
    ! z1 ]% M. t, j+ D$ S% ?3 Y' P' D
  25.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);1 V" i/ O% X* r: Q
  26.         6 n6 Z1 J$ o. W% ~& ]( j/ I$ Y
  27.         NVIC_SetPriority(USART2_IRQn, USART_PREPRIORITY);5 ?, z3 A4 X; {* M/ k
  28.         NVIC_EnableIRQ(USART2_IRQn);
    / ~5 a# C6 I/ y: D" V! x! E5 U
  29.         
    ) e0 o, V4 I7 L3 D
  30.         USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;# G2 a6 H/ s! [2 d
  31.         USART_InitStruct.BaudRate = baudrate;  //波特率
    / \+ v5 m% w/ h
  32.         USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //8位数据
    , t$ A8 L+ Z; k; H+ ]$ I3 B& Q
  33.         USART_InitStruct.StopBits = LL_USART_STOPBITS_2;  //2位停止位
    $ q9 l* F8 a$ A* F7 ~
  34.         USART_InitStruct.Parity = LL_USART_PARITY_NONE;  //无奇偶校验
    ) t4 B' ?' j3 e  b* ]
  35.         USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;$ s7 I) Z" Y- ^
  36.         USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;9 d/ u3 U8 C& j$ S3 z  G! M
  37.         USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;" h& e+ B- Y! J
  38.         LL_USART_Init(USART2, &USART_InitStruct);0 Z2 E! Z0 F3 B' }$ s! W0 L
  39.         
    4 Y8 b/ r: U1 K& q" @; L
  40.         LL_USART_SetTXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8
    ; ]0 k: D3 }& e$ |: y; M* F
  41.         LL_USART_SetRXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/8
    1 z/ r# U! X/ e! h
  42.         ( G, b" a' x5 n3 m
  43.         LL_USART_EnableIT_RXNE_RXFNE(USART2); //使能串口接收中断
    ; u. O9 H( B+ C
  44.         LL_USART_Enable(USART2);# K, }5 f. C% e5 Z; N4 T4 g
  45. }, M: g' e6 r7 j
复制代码
/ q- P9 B7 X; ?$ B4 {
void USART2_IRQHandler(void)
. N& D: l+ N" O9 w" r& [{
. X3 o6 Y7 R% F/ _& p2 N/ F    u8 data;
( Z% |- k6 d. A* Q) u1 C" [    if (LL_USART_IsActiveFlag_RXNE_RXFNE(USART2)) { //判断接收数据寄存器是否有数据
! `9 F0 _# ]% _% i4 I                    //清除接收中断标志方式一:读取RDR寄存器以自动清除RXNE标志
1 p, A4 ?1 Z/ ~. c  I/ p                //清除接收中断标志方式二:往RXFRQ寄存器写1(刷新数据)以清除RXNE中断标志
* T1 R. B9 Y$ h  f+ Y3 r        data = LL_USART_ReceiveData8(USART2); //读接收到的字节,同时相关标志自动清除+ P8 u% M6 v$ ?) p
        LL_USART_RequestRxDataFlush(USART2);
; G8 N8 g6 U3 j0 D( o0 d" s/ l- r5 @: Q    }- Q' U* n+ A' Z
}$ ~7 f+ P  u1 E# f$ ]
; g& [3 I, ]) f

# S! S2 @/ r" k; w5 \
, X0 E- ?6 n; B' g; |5 k  v" D# H; s
收藏 评论0 发布时间:2021-11-8 16:55

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版