0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32串口中断及DMA接收常见的几个问题

jf_pJlTbmA9 来源:strongerHuang 作者:strongerHuang 2023-10-26 16:41 次阅读

今天再给大家分享一些关于STM32串口中断及DMA接收常见的几个问题。

UART串口中断接收

使能UART串口中断之后,有接收到UART数据,进入中断,此时要清除RXNE接收标志位:

1)通过软件向该RXNE标志位写入零来清零;

2)通过对 USART_DR 寄存器执行读入操作将该位清零。

这里可以查看对应《参考手册》,一般我们选择第2种,通过读取UART串口数据来清零。

1、中断接收数据丢失

在UART串口中断函数中,或者更高优先级中断函数中长时间执行,导致接收丢失,所以,请勿在中断函数中长时间执行。

特别有些人,还在中断函数添加延时函数。实际应用中,只要不是特殊情况,比如测试某个功能可以添加延时函数,都不建议在中断函数添加延时函数。

2、ORE上溢错误

ORE上溢错误是什么意思呢? 可能很多人不了解,简单说就是:UART接收到有数据,没有去取,但又来了数据,此时就会产生ORE上溢错误。(请看“参考手册”)

其实,上面这种长时间在占用中断,就会导致UART接收数据上溢。

很多人没有在意这个,如果是使能了中断接收,标志位没有清除,又有ORE上溢错误的话,程序就会不停地进入UART中断。(大家不妨试一下,看一下是不是你代码一直在UART中断里面不停运行)。

3、使能接收中断前,先清除接收标志位

有时候,在程序初始化的时候,就会接收到数据,这个时候建议大家先清除接收标志位再使能接收中断。类似如下:

wKgZomUD8ZyAcMFkAAOnWVM3tz4985.jpg

DMA接收串口数据

使用DMA接收串口数据,相信很多朋友都知道。这个可以理解为使用队列,或者FIFO的形式,防止因高优先级中断而打断,导致接收数据丢失。

但很多人都遇到过,接收不到数据,或者数据异常的情况。所以,这里同样有需要注意的地方。

1、使能UART之前,先使能DMA相关配置

这个和清除标志位一样的道理,使能UART之前,先使能DMA相关配置,防止在配置过程中有接收数据。

wKgZomUD8Z2AQ7HXAAEwkQrKiT4053.jpg

2、ORE上溢错误导致不能使用DMA接收数据

导致不能DMA接收不到数据的根源,有一种可能就是有ORE上溢错误。

若在串口初始化并使能后到 DMA 使能之前有数据来,MCU是不能接收的。如果此时数据寄存器 USART_DR 存在一个数据,再来一个数据,就会导致ORE上溢错误。

一旦产生上溢错误后,就无法再触发 DAM 请求,即使之后再启动 DMA 也不行,无法触发 DMA 请求就无法将数据寄存器内的数据及时转移走,如此陷入死锁。这就是串口无法正常接收的原因。

所以,最后提醒大家,配置时,请一定要注意这些细节。

来源:嵌入式专栏(作者 | strongerHuang)
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5363

    浏览量

    121036
  • STM32
    +关注

    关注

    2272

    文章

    10923

    浏览量

    357315
  • 串口
    +关注

    关注

    14

    文章

    1557

    浏览量

    76950
  • dma
    dma
    +关注

    关注

    3

    文章

    566

    浏览量

    100888
收藏 人收藏

    评论

    相关推荐

    串口中断是内部中断还是外部中断串口中断是怎么触发的

    串口中断通常被视为外部中断。虽然串口控制器(如USART、UART等)可能集成在微控制器或处理器的内部,但从中断的角度来看,串口中断是由处理
    的头像 发表于 01-29 15:03 62次阅读

    串口中断需要清除标志位吗,串口中断标志位会自动清除吗

    在电子通信领域,串口中断作为一种重要的通信机制,广泛应用于各种嵌入式系统和计算机设备中。串口中断标志位的管理,尤其是是否需要手动清除以及是否会自动清除,是理解和实现串口通信的关键环节。
    的头像 发表于 01-29 14:59 77次阅读

    串口中断有什么用,串口中断的触发条件是什么

    在现代电子通信系统中,串口中断作为一种高效的数据处理机制,扮演着至关重要的角色。它允许处理器在数据到达或发送完成时立即响应,从而提高系统的响应速度和效率。
    的头像 发表于 01-29 14:56 61次阅读

    STM32G030F6用串口中断函数接收数据,发送数据就死机怎么解决?

    平台介绍: 芯片是使用的STM32G030F6,系统是rt-thread nano-v3.1.5, 使用rtthread studio + cubemx生成工程项目 问题描述:想使用串口中断方式去
    发表于 07-11 06:44

    STM32G030不能再次进入串口中断的原因?

    在使用串口时数据发送完毕 将串口设置为外部中断,然后MCU进入停止模式。在触发外部唤醒后,进入外部触发中断 ,再次初始化串口后,再
    发表于 05-17 10:38

    如何在STM32F439 DMA中断中区分是哪个通道产生的中断

    STM32F439有两个DMA控制器DMA1和DMA2,每个控制器有8个流,每个流有8个通道,我做的是采用串口1
    发表于 05-17 08:20

    STM32串口DMA通讯接收不到数据的原因?

    //STM32串口DMA通讯接收不到数据 //请各位大神帮忙看看,下面的DMA配置问题出在哪里 //程序编写思路是:用
    发表于 05-09 06:40

    stm32cubemx的串口中断接收时,过一段时间串口中断不进了怎么解决?

    个小时多串口中断进不去了,我用两根线挂在总线上在电脑上用串口助手监听收发的数据,发送和应答的过程还在持续,其他功能也都正常只是cubemx的程序认为没有收到数据。很难定位是哪里的问题。
    发表于 04-17 06:48

    STM32L051使用HAL库串口中断的疑问求解

    使用STM32CUB生成原始代码,然后采用串口中断接收 L051有两个串口串口1,串口2,以
    发表于 04-08 07:17

    常见串口通信的几个问题请教?

    有关常见串口通信的几个问题请教论坛里的专家? 1、常见串口通信CAN,DP,PN,ETHER IP/TCP,ETHERCAT等,这些
    发表于 04-04 16:30

    STM32F030F4串口空闲中断接收不定长数据,发生中断后不知道如何计算接收到的字节数?

    我用STM32F030F4串口空闲中断接收不定长数据,发生中断后不知道怎样计算接收到的字节数。
    发表于 04-03 07:12

    关于STM32L051C8T6芯片LPUART+DMA接收问题求解

    STM32L051C8T6芯片低功耗串口LPUART+DMA。 我用STM32CUBEMX 生成了程序LPUART以及UART2串口+
    发表于 03-28 07:05

    STM32F103ZET6 HAL库使用串口1DMA空闲中断接收数据时CNDTR寄存器问题如何解决?

    STM32F103ZET6开发过程中,用到HAL库中的串口1DMA空闲中断处理数据时发现: 当接收数据长度超过16字节后,(__HAL_
    发表于 03-12 08:35

    STM32h7开启Cache后,串口发送DMA会导致中断触发如何解决?

    STM32h7 开启Cache后,串口使用发送DMA发送数据会导致中断触发(只开启接收空闲中断
    发表于 03-12 07:37

    STM32G030在使用串口中断接收时,发现串口接收一次数据后,第二次进不去中断的原因?

    在使用串口中断接收时,发现串口接收一次数据后,第二次进不去中断了,初始化开启了中断且在回调函数里
    发表于 03-08 07:40