今天再给大家分享一些关于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、使能接收中断前,先清除接收标志位
有时候,在程序初始化的时候,就会接收到数据,这个时候建议大家先清除接收标志位再使能接收中断。类似如下:
dma接收串口数据
使用dma接收串口数据,相信很多朋友都知道。这个可以理解为使用队列,或者fifo的形式,防止因高优先级中断而打断,导致接收数据丢失。
但很多人都遇到过,接收不到数据,或者数据异常的情况。所以,这里同样有需要注意的地方。
1、使能uart之前,先使能dma相关配置
这个和清除标志位一样的道理,使能uart之前,先使能dma相关配置,防止在配置过程中有接收数据。
2、ore上溢错误导致不能使用dma接收数据
导致不能dma接收不到数据的根源,有一种可能就是有ore上溢错误。
若在串口初始化并使能后到 dma 使能之前有数据来,mcu是不能接收的。如果此时数据寄存器 usart_dr 存在一个数据,再来一个数据,就会导致ore上溢错误。
一旦产生上溢错误后,就无法再触发 dam 请求,即使之后再启动 dma 也不行,无法触发 dma 请求就无法将数据寄存器内的数据及时转移走,如此陷入死锁。这就是串口无法正常接收的原因。
所以,最后提醒大家,配置时,请一定要注意这些细节。
来源:嵌入式专栏(作者 | strongerhuang)
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理
数字医疗使用场景与采用率正出现变化
SPS大展拉开序幕 西门子展示了一系列工业技术创新
日本加强限制外国投资者收购日本高科技制造商,防止关键技术泄漏
长时间沉浸VR后的感觉:奇怪的体验甚至感到些许忧伤和沮丧
MT29F2G08ABAEAWP:E STOCK
STM32串口中断及DMA接收常见的几个问题
新纪录将可能开创太阳能电池的新纪元
LED产业链结构和格局,LED行业发展现状及前景预测
一文了解bacnet协议的格式和转成modbus协议的方法
传输设备PDH接口对接问题
机器码是什么
友谊与共进:中国光电大牛对话滨松公司社长
100条电机行业重点知识详细解析
基于单片机的I2C和EEPROM连接
方博碳讨室 | 为什么泰国把屋顶光伏安全作为强制标准?
德国不愿在5G网络受到美国压力,反对对华为发布针对性禁令
农用杀虫灯与传统方法的对比,它的优势是什么
固体继电器实物接线图
雷卯新品:小体积多路低箝位电压防静电ESD
AOC iF22液晶显示器 广视角面板的普及风暴