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

    文章

    5619

    浏览量

    130398
  • STM32
    +关注

    关注

    2313

    文章

    11191

    浏览量

    374599
  • 串口
    +关注

    关注

    15

    文章

    1627

    浏览量

    83327
  • dma
    dma
    +关注

    关注

    3

    文章

    582

    浏览量

    106261
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    cs32A010串口通讯问题

    串口中断接收数据,第一个数据是0,第二个才是正确的数据,而且最后一个字节放到了下一帧数据第一个。 pack包的串口中断例程跑的也有问题,读取串口数据为什么是两条一样的语句,是什么意思?
    发表于 04-13 12:35

    串口中断和定时中断,外部中断在一起如何调用?

    /9600=20ms 也就是说,处理了定时中断后,再处理的串口中断 时间上:实际是定时+串口 如果是1s内,那么定时中断内嵌套串口中断
    发表于 01-14 06:25

    CW32F030的DMA问题求解

    应用很简单,通过DMA把UART接收到的数据放到指定的内存缓冲区rx_buffer[]. 每次接收8个字节数据,下一次数据覆盖上一次. 这个过程本来可以无需CPU参与自动完成.无论串口
    发表于 12-08 08:07

    串口空闲中断串口超时中断介绍

    1. 空闲中断(Idle Interrupt) 触发条件 当串口总线在接收数据后持续保持空闲状态(如高电平)超过一帧时间(即一个字符传输时间)时触发。 硬件自动检测总线空闲状态,与数据长度无关
    发表于 11-21 08:31

    E203串口中断使用总结

    以上函数的设置后,就可以在中断服务函数中写下自己需要的中断处理功能,并且在 main() 函数中写下“my_uart_init()”,就能实现串口中断。 二、串口
    发表于 10-22 07:34

    rt-thread 在使用串口DMA模式的时候,接收数据接收不到00,为什么?

    硬件为STM32F103ZET6: 在使用串口通讯时,在DMA接收模式下,收不到00数据,遇到00数据,好像DMA模式就认为是数据已经结束了
    发表于 10-14 06:20

    串口DMA接收方式打开,为什么在开启IDLE中断的情况下还需要开启DMA中断呢?

    如图,在以 RT_DEVICE_FLAG_DMA_RX 方式打开串口时,底层会配置串口IDLE中断,同时也会打开DMA
    发表于 09-29 08:30

    串口DMA接收数据包丢失怎么解决?

    RTT串口DMA接收数据,超过缓冲区后为什么会吞掉一个数据包呢,不能每次处理完后清除缓冲区数据吗,感觉接收的数据是累计的,累计满之后会重新覆盖,在最后一个包
    发表于 09-29 07:50

    RTT5.2.0串口接收中断死机怎么解决?

    RT_DEVICE_FLAG_DMA_RX 和 RT_DEVICE_FLAG_INT_RX 问题一样, 如果不使用中断就不会出现这个问题, 开始中断如果没有数据接收不会报错, 有
    发表于 09-22 06:16

    STM32H743 UART DMA接收不到数据是为什么?

    ;find %s failed!n\", \"uart3\"); return RT_ERROR; } /* 以 DMA 接收及轮询发送方式打开串口设备
    发表于 09-11 07:14

    关于stm32f4zgt6和mspm0g3507串口通信问题

    本人在使用stm32f4zgt6和mspm0g3507串口通信时出现问题,情况如下: m0芯片使用软件超时解析进行数据接收,使用标准库的transmit函数进行数据发送。 stm32使
    发表于 09-01 11:11

    CYT2B7串口接收会漏接数据怎么解决?

    串口中断方式接收会漏接数据如串口工具发送 :1234567芯片接收到 :1357硬件是CYTVII-B-E-1M-SK开发板软件是SDL v8.3 中的
    发表于 08-14 07:29

    求助,关于stm32H7多DMA数据流问题求解

    情况如下:stm32H7配置了一个adc进行采样,通过dma进行数据传输,串口接收和发送命令,用两个dma数据流通道,采用的空闲
    发表于 07-29 15:02

    STM32407使用串口闲时中断+DMA方式接收最大接收字节是多少?

    使用串口闲时中断+DMA方式接收数据,波特率为460800,DMA接收长度为1024个字节,并开
    发表于 07-22 08:16

    STM32F407多机RS485串口通讯+地址位唤醒+DMA空闲线接收,无法进入中断服务程序怎么处理?

    USART3_MspInit 1 / / USER CODE END USART3_MspInit 1 / } } 在主程序中开启DMA接收和空闲线中断: int main(void) { / USER
    发表于 07-10 07:28