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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:55
单片机型号:STM32G030C8T6
在初始化完串口后,开启串口接收中断,程序就一直在执行串口中断(此时串口无任何数据),通过在线查看串口外设的相关寄存器(如下图)发现RDR寄存器一直没有被清零,导致ISR寄存器的RXNE位一直有效,串口中断就一直处于触发的状态。
1dd517aa2148450cb4f0731830a8d2e0.png


通过查看STM32G0x0 Datasheet章节 26.8.10 Bit5 RXNE位,数据收据里面说到可以通过读取RDR寄存器或者往RXFRQ寄存器写1来清除ISR寄存器的RXNE标志位。

8e8cfae417af4d18b57e22bfdb6f5df0.png


LL库串口初始化及中断接收代码如下:

  1. void Usart2_Init(u32 baudrate)
  2. {
  3.         LL_USART_DeInit(USART2);
  4.         LL_USART_InitTypeDef USART_InitStruct = {0};
  5.         LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
  6.         
  7.         /* Peripheral clock enable */
  8.         LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);
  9.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
  10.         
  11.         GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
  12.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  13.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  14.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  15.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  16.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
  17.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  18.         
  19.         GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
  20.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  21.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  22.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  23.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  24.         GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
  25.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  26.         
  27.         NVIC_SetPriority(USART2_IRQn, USART_PREPRIORITY);
  28.         NVIC_EnableIRQ(USART2_IRQn);
  29.         
  30.         USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;
  31.         USART_InitStruct.BaudRate = baudrate;  //波特率
  32.         USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; //8位数据
  33.         USART_InitStruct.StopBits = LL_USART_STOPBITS_2;  //2位停止位
  34.         USART_InitStruct.Parity = LL_USART_PARITY_NONE;  //无奇偶校验
  35.         USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  36.         USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
  37.         USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  38.         LL_USART_Init(USART2, &USART_InitStruct);
  39.         
  40.         LL_USART_SetTXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置TX缓存阈值为深度的1/8
  41.         LL_USART_SetRXFIFOThreshold(USART2, LL_USART_FIFOTHRESHOLD_1_8);//设置RX缓存阈值为深度的1/8
  42.         
  43.         LL_USART_EnableIT_RXNE_RXFNE(USART2); //使能串口接收中断
  44.         LL_USART_Enable(USART2);
  45. }
复制代码

void USART2_IRQHandler(void)
{
    u8 data;
    if (LL_USART_IsActiveFlag_RXNE_RXFNE(USART2)) { //判断接收数据寄存器是否有数据
                    //清除接收中断标志方式一:读取RDR寄存器以自动清除RXNE标志
                //清除接收中断标志方式二:往RXFRQ寄存器写1(刷新数据)以清除RXNE中断标志
        data = LL_USART_ReceiveData8(USART2); //读接收到的字节,同时相关标志自动清除
        LL_USART_RequestRxDataFlush(USART2);
    }
}



收藏 评论0 发布时间:2021-11-8 16:55

举报

0个回答

所属标签

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