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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:55
单片机型号:STM32G030C8T6; S2 ~1 x' H# K6 g. ~5 ]
在初始化完串口后,开启串口接收中断,程序就一直在执行串口中断(此时串口无任何数据),通过在线查看串口外设的相关寄存器(如下图)发现RDR寄存器一直没有被清零,导致ISR寄存器的RXNE位一直有效,串口中断就一直处于触发的状态。, Z: L( F/ q: D! s
1dd517aa2148450cb4f0731830a8d2e0.png
0 o. O+ r/ Z3 l7 I  L" d/ i+ s
. D0 R* ?1 ]* w2 g
通过查看STM32G0x0 Datasheet章节 26.8.10 Bit5 RXNE位,数据收据里面说到可以通过读取RDR寄存器或者往RXFRQ寄存器写1来清除ISR寄存器的RXNE标志位。8 L) U' B2 Z2 E
5 b( T2 i/ O2 O' c) v5 z
8e8cfae417af4d18b57e22bfdb6f5df0.png
; G/ J0 x0 X0 {
4 @1 B5 V" o' S# n7 u: b
LL库串口初始化及中断接收代码如下:
& b6 }' I( \+ c7 i( P) R+ Y$ D) H; G- S  q0 U
  1. void Usart2_Init(u32 baudrate)
    ( b$ c6 }: E) c# @; R
  2. {( J3 R# x4 I5 \% H* V" h: U; D; B
  3.         LL_USART_DeInit(USART2);: [9 e8 K3 C9 Z& Z# G$ ~
  4.         LL_USART_InitTypeDef USART_InitStruct = {0};
    . v- |  f( Y# }+ n# T2 V
  5.         LL_GPIO_InitTypeDef GPIO_InitStruct = {0};9 d2 e7 v$ ?$ k0 [
  6.         
    - c0 I  G7 y) _1 A7 O
  7.         /* Peripheral clock enable *// L2 X: _; y& ^1 j4 N1 K3 k) ~2 j' L
  8.         LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);
    * @1 V8 O/ a* W3 l- _
  9.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
    3 U$ M  W. |* O
  10.         
    2 ^6 U* A6 F/ u3 ]: B: [0 x7 f
  11.         GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
    3 R) ]/ d0 X& k+ a- V
  12.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;. _8 B5 w# |! {4 w/ I1 g8 }
  13.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;8 l( F( U* |  h
  14.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
    9 U# s. C2 k& g2 r' a  V0 d& F
  15.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
    8 r# e- a: I( {" r6 P
  16.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
    6 \( i7 V$ x7 [  `8 I0 s
  17.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    3 q/ y2 G& q" P6 P* V% k
  18.         % k; @( \, u) q/ c- H
  19.         GPIO_InitStruct.Pin = LL_GPIO_PIN_3;$ J3 N5 p# R& e; i6 }3 Y7 E
  20.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
    ' E/ S/ e- B" q/ P
  21.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
    8 u2 \, L# l7 S) h$ a6 J
  22.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;! q% a1 l+ W' |* r% X
  23.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;9 Q, I% N4 R3 Z+ S  o2 ]* W* M
  24.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
    5 P# K. [. q3 N$ A1 t2 S
  25.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    % ]$ P9 ^) D) L
  26.         
    9 k) h' b, F+ Y0 Z0 m' m
  27.         NVIC_SetPriority(USART2_IRQn, USART_PREPRIORITY);) z) a; J; g' O& j# {5 W- c
  28.         NVIC_EnableIRQ(USART2_IRQn);
    - d* O) I8 d8 e4 J% F3 @1 r2 x7 u
  29.         
    * @; I# E, l- n
  30.         USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;
    2 _8 G: S/ S- J' s, z9 r  E
  31.         USART_InitStruct.BaudRate = baudrate;  //波特率
    , s9 O4 g. f4 Q( G% `6 {, u: Q( N
  32.         USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //8位数据
    3 a4 T3 K6 E' F2 q) D# ?. h! z
  33.         USART_InitStruct.StopBits = LL_USART_STOPBITS_2;  //2位停止位
    $ j( I  H2 l5 N4 F+ a& z8 [2 I
  34.         USART_InitStruct.Parity = LL_USART_PARITY_NONE;  //无奇偶校验1 E7 g- n0 I1 V
  35.         USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;! o. i% Q* @" R
  36.         USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
    - ?0 {+ ?& r& g0 W- W. U
  37.         USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;- E7 d- U; u; v0 |- P3 t
  38.         LL_USART_Init(USART2, &USART_InitStruct);+ P7 ]8 N$ U5 n& N, g) ?) r
  39.           t+ [. q: G* T1 k
  40.         LL_USART_SetTXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/84 n, A& X* {, g+ |
  41.         LL_USART_SetRXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/83 o$ {$ h& V. h( G/ i
  42.         
    6 B& M6 L9 Y  b$ G* O1 c
  43.         LL_USART_EnableIT_RXNE_RXFNE(USART2); //使能串口接收中断
    . c" n6 S1 v3 t; v0 \
  44.         LL_USART_Enable(USART2);  j  q' Y# I0 a& W
  45. }8 N$ j* S0 B! t. }( ~
复制代码

+ K; x8 m9 j. O2 Xvoid USART2_IRQHandler(void)1 V$ N: A/ m: Q/ ]: R* Y7 t9 d( Q: I
{3 D  p/ ?1 w) G, R
    u8 data;
% H# f! I: U$ p& {3 {) g5 y: [' [    if (LL_USART_IsActiveFlag_RXNE_RXFNE(USART2)) { //判断接收数据寄存器是否有数据- C. e* o/ P5 `7 [% F6 Z0 i5 K) V
                    //清除接收中断标志方式一:读取RDR寄存器以自动清除RXNE标志
0 c$ C0 U' m$ p% T7 q% J                //清除接收中断标志方式二:往RXFRQ寄存器写1(刷新数据)以清除RXNE中断标志3 |+ \6 x$ U1 N! Z  {
        data = LL_USART_ReceiveData8(USART2); //读接收到的字节,同时相关标志自动清除
8 N, ^0 C' Z0 q8 q) E# a) P        LL_USART_RequestRxDataFlush(USART2);
$ b' v8 `5 v# X    }0 w0 D; y8 Y: e% k! Y
}9 y) R! W, X$ j' e; f

+ y* M" k* G& |9 d1 Z  z
  A% G" N; ^- O5 W6 J% P  n! D' R- e1 v5 ^5 L9 C; B
收藏 评论0 发布时间:2021-11-8 16:55

举报

0个回答

所属标签

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