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

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

3天内不再提示

STM32串口中断 DMA接收的几点注意地方

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-04 13:57 次阅读

今天写点大家常问,也是常见的关于UART串口的内容。这几点内容或许曾经也困惑了你很久。

1UART串口中断接收

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

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

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

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

1.中断接收数据丢失

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

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

2.ORE上溢错误

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

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

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

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

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

2

DMA接收串口数据

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

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

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

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

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

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

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

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

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

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

    关注

    2239

    文章

    10671

    浏览量

    348720
  • uart
    +关注

    关注

    22

    文章

    1158

    浏览量

    99952
  • dma
    dma
    +关注

    关注

    3

    文章

    535

    浏览量

    99016
收藏 人收藏

    评论

    相关推荐

    关于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

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

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

    XMC4800串口中断接收数据错误如何解决?

    串口中断数据,接收到的数据为3个字节。接收到的数据为上一帧的最后一个字节和本数据帧的头两个字节。请问该问题如何解决?通过逻辑分析仪抓取数据,RX数据是正常,但是软件中收到数据的数组中数据是异常的。
    发表于 01-26 08:10

    stm32串口接收中断触发原理

    配置串口接收中断使能:在初始化串口时,需要设置相应的控制寄存器来使能串口接收
    发表于 01-17 15:42 1609次阅读
    <b class='flag-5'>stm32</b><b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>中断</b>触发原理

    GD32串口dma接收空闲中断配置流程是怎样的?

    GD32串口dma接收空闲中断配置流程是怎样的,用过的朋友分享下经验。现在已经实现串口+DMA
    发表于 11-03 07:51

    LPC5500_SDK例程:串口DMA发送+中断接收

    LPC5500_SDK例程:串口DMA发送+中断接收
    的头像 发表于 10-30 16:59 521次阅读
    LPC5500_SDK例程:<b class='flag-5'>串口</b><b class='flag-5'>DMA</b>发送+<b class='flag-5'>中断</b><b class='flag-5'>接收</b>

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

    STM32串口中断DMA接收常见的几个问题
    的头像 发表于 10-26 16:41 2524次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>串口中断</b>及<b class='flag-5'>DMA</b><b class='flag-5'>接收</b>常见的几个问题

    HAL_UART_Transmit阻塞时会影响串口中断接收吗?

    最近项目里使用了两路串口透传数据,串口3中断接收数据,组包后通过串口1阻塞发送出去。
    的头像 发表于 10-26 14:24 476次阅读
    HAL_UART_Transmit阻塞时会影响<b class='flag-5'>串口中断</b><b class='flag-5'>接收</b>吗?

    STM32串口中断接收不定长报文介绍

    本项目中,需要使用STM32的USART6串口与FPGA板(下位机)通信,需要发送和接收数据,有报文应答机制。
    的头像 发表于 10-26 11:01 529次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>串口中断</b><b class='flag-5'>接收</b>不定长报文介绍

    一个严谨的STM32串口DMA发送&amp;接收(1.5Mbps波特率)机制

    一个严谨的STM32串口DMA发送&接收(1.5Mbps波特率)机制
    的头像 发表于 09-18 10:58 1714次阅读
    一个严谨的<b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>DMA</b>发送&amp;<b class='flag-5'>接收</b>(1.5Mbps波特率)机制

    CW32L083串口中断+定时器实现不定长数据接收

    CW32L083 用串口中断加定时器中断实现串口的不定长数据的接收,特别适用于AT指令的接收
    的头像 发表于 07-12 09:00 1060次阅读
    CW32L083<b class='flag-5'>串口中断</b>+定时器实现不定长数据<b class='flag-5'>接收</b>

    衔尾法解决当无法使用空闲中断以及DMA中断时配置DMA接收串口不定长数据

    [Ooonly新人贴]记录工作中遇到的问题,话不多说先上干货 问题:类似K线与蓝牙接收模块,要求由原来的接收串口中断改为DMA接收。据说要用
    发表于 06-19 09:32

    GD32F4单片机实现接收超时中断+DMA实现串口的不定长接收DMA发送

    设备任务比较繁重时,使用中断接收可能会丢失数据。尤其是在长时间关闭中断或者串口中断优先级不高时
    发表于 06-09 15:04 1725次阅读
    GD32F4单片机实现<b class='flag-5'>接收</b>超时<b class='flag-5'>中断</b>+<b class='flag-5'>DMA</b>实现<b class='flag-5'>串口</b>的不定长<b class='flag-5'>接收</b>和<b class='flag-5'>DMA</b>发送

    STM32CubeMX之串口接收不定长数据

    基本串口通信通常只能接收到定长数据,无法稳定接收不定长数据,本章介绍利用STM32单片机的IDLE空闲中断
    的头像 发表于 05-11 09:59 2251次阅读
    <b class='flag-5'>STM32</b>CubeMX之<b class='flag-5'>串口</b><b class='flag-5'>接收</b>不定长数据