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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:55
单片机型号:STM32G030C8T67 Q9 ]( s" v. Q# r9 V5 y
在初始化完串口后,开启串口接收中断,程序就一直在执行串口中断(此时串口无任何数据),通过在线查看串口外设的相关寄存器(如下图)发现RDR寄存器一直没有被清零,导致ISR寄存器的RXNE位一直有效,串口中断就一直处于触发的状态。
/ N. d- o; {7 T# x8 {' m: y
1dd517aa2148450cb4f0731830a8d2e0.png
' t8 k, Y1 C; ^# A% B
. O# i2 \4 b5 E2 R2 o8 l* R
通过查看STM32G0x0 Datasheet章节 26.8.10 Bit5 RXNE位,数据收据里面说到可以通过读取RDR寄存器或者往RXFRQ寄存器写1来清除ISR寄存器的RXNE标志位。) n) J4 U# H! e( o
8 l* z. p/ w2 z9 O8 Z4 S
8e8cfae417af4d18b57e22bfdb6f5df0.png
3 l9 `, A: z0 t5 a

8 j; O' [! Z2 H# U3 \- z7 f: wLL库串口初始化及中断接收代码如下:4 k4 ~: Q0 H1 {  S
5 f% p4 u4 |* B: J2 Q
  1. void Usart2_Init(u32 baudrate)7 q( r, v1 J# A! M
  2. {
    1 x" R; p  @8 d- r& q6 f0 C
  3.         LL_USART_DeInit(USART2);0 ?- \* t2 v9 Z  E- \# S) G
  4.         LL_USART_InitTypeDef USART_InitStruct = {0};
    5 F" u9 d+ m3 Z1 ?: U$ t9 R2 f
  5.         LL_GPIO_InitTypeDef GPIO_InitStruct = {0};8 U3 f7 H: {' k! P8 R" C- m
  6.         " x5 f* B* C; R& B# ]2 P9 C
  7.         /* Peripheral clock enable */
    4 T  P/ S  S% ]& a1 f1 t
  8.         LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);8 z( p" C/ l& y( q. |+ l1 ]' m
  9.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);# q& j5 G: q9 t& z
  10.         
    1 |6 B6 E" Y% N. k
  11.         GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
    7 S7 H( @  z8 u' A) N1 d" E
  12.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
    / J  Q% {8 |( X. F
  13.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;/ Z7 u" N0 r: h4 ^7 r& ^# l' B
  14.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;* w; |5 m( H0 e6 \
  15.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
    0 b9 i; x4 L  P1 A+ _% {
  16.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;6 O: R, A! Z% J* ?5 j
  17.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);4 [3 O9 M) l- h6 j+ X1 v5 T
  18.         
    - E7 x* y$ |3 s, z+ Y
  19.         GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
    9 Y: ?" H  L5 T8 I# s' ~3 g
  20.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
    5 Y. d4 M: T- l3 r: z7 B8 a
  21.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;+ m5 q' x8 v, Y' l4 h
  22.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
    ! D' B& w  g" g
  23.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;: O5 e) @2 o! S" X7 t: d
  24.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
    ; ~# ~2 F3 ]2 a
  25.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    / @9 ]' L% a3 r1 {* W
  26.         * \* h9 J- \# f7 P9 a' U
  27.         NVIC_SetPriority(USART2_IRQn, USART_PREPRIORITY);
    ; u4 x4 u! {! X- D4 S2 l/ U3 Y
  28.         NVIC_EnableIRQ(USART2_IRQn);
    0 h; x3 O+ r6 i( N
  29.         7 @: \, V, v8 ?0 @7 `" ^+ I) S
  30.         USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;
    0 l! Y4 d# a% r9 p
  31.         USART_InitStruct.BaudRate = baudrate;  //波特率1 K, H& q8 e2 f. w- ^% y
  32.         USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //8位数据4 X) M) Z' V3 x" \5 s5 P! j* B
  33.         USART_InitStruct.StopBits = LL_USART_STOPBITS_2;  //2位停止位( C9 Z' @: C. R1 [
  34.         USART_InitStruct.Parity = LL_USART_PARITY_NONE;  //无奇偶校验
    3 F8 x7 @! }$ J3 z
  35.         USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;7 @' f8 e# T. g
  36.         USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;: _) {" \, z/ f
  37.         USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;& z8 |$ O, R; Y6 L0 ^
  38.         LL_USART_Init(USART2, &USART_InitStruct);; s, u1 i- \/ m+ c# a4 {
  39.         
    ( v3 U! ]0 Y, B( P' `3 Y3 k
  40.         LL_USART_SetTXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8, k5 q+ T' D* h! J$ b5 h
  41.         LL_USART_SetRXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/8
    2 j: {/ B; x. j
  42.         2 S3 j7 _! P) U* t; @  `' l- b. w
  43.         LL_USART_EnableIT_RXNE_RXFNE(USART2); //使能串口接收中断; @) X3 _8 X- V
  44.         LL_USART_Enable(USART2);
    & u! l2 z# G' r( G( S  a3 V1 \
  45. }9 H) F" D/ r. f
复制代码
  i- g. v& F9 k1 F) C0 J1 j
void USART2_IRQHandler(void)% H5 I- {' x, e2 N
{* r% I; O" k, R5 h
    u8 data;! q. B2 z# T- [1 h. Y% t
    if (LL_USART_IsActiveFlag_RXNE_RXFNE(USART2)) { //判断接收数据寄存器是否有数据8 @: u) b( u( T2 R6 z; h% h- c
                    //清除接收中断标志方式一:读取RDR寄存器以自动清除RXNE标志
& O/ v% Y& ]. A' }) a+ J                //清除接收中断标志方式二:往RXFRQ寄存器写1(刷新数据)以清除RXNE中断标志5 |5 ?) P; Z/ a& o" I3 y1 D3 c) w; R. _
        data = LL_USART_ReceiveData8(USART2); //读接收到的字节,同时相关标志自动清除
. |( A7 C4 i6 G, m3 C2 e9 t        LL_USART_RequestRxDataFlush(USART2);
0 a1 B0 p# X( y9 ]    }8 W" j* F* i, a3 f# B2 M3 @
}
% m4 Q& r1 ?. W9 b' _8 k% S$ Z5 @
' ?$ L9 [) Y4 H- l' ~6 S
8 d8 B+ s4 z8 t0 [2 t
收藏 评论0 发布时间:2021-11-8 16:55

举报

0个回答

所属标签

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