今天写点大家常问,也是常见的关于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 串口中断 DMA接收
引用地址:
STM32串口中断 DMA接收的几点注意地方
推荐阅读最新更新时间:2024-11-09 11:03
FPGA和STM32的区别是什么 stm32与fpga的优缺点分析
FPGA基本原理和内部结构 一、FPGA原理 FPGA中的基本逻辑单元是CLB模块,一个CLB模块一般包含若干个基本的查找表、寄存器和多路选择器资源,因此FPGA中的逻辑表达式基于LUT的。 FPGA内部的编程信息一般存储在SRAM单元中,因此通常的FPGA都是基于SRAM的,所以掉电后信息会丢失,下次上电需要先配置才能使用。 着重介绍Xilinx FPGA, 二、FPGA产品的速度等级 速度等级一般反映一款芯片的性能,速度等级越高,说明芯片内的逻辑延时和布线延时越小,设计的性能要求也越容易达到,随之付出的成本也越大。 对Xilinx FPGA,速度等级一般有“-1”、“-2”、“-3”等,数字越大,速度等级越高,芯片价钱
[单片机]
hc32和stm32的区别
HC32和STM32是两个不同的单片机系列。HC32是华大基础电子有限公司(Holtek)生产的单片机,而STM32是意法半导体(STMicroelectronics)生产的单片机。虽然它们都属于单片机系列,但是它们之间还是存在一些区别的。 第一个区别是两个系列使用的架构不同。HC32系列使用的是Cortex-M0架构,而STM32系列使用的则是Cortex-M3或Cortex-M4架构。这意味着,STM32系列的芯片性能比HC32系列要更高,并且具有更强的处理能力。 第二个区别是两个系列的周期和价格。HC32系列以低成本和高品质而著称,而STM32系列则以价格昂贵和可靠性高著称。这也导致了它们在不同的市场中有所不同,HC32主要
[单片机]
STM32高级开发(7)-浅析样例工程的Makefile
上一篇中我们为大家介绍了makefile的最简单的用法和关于它的学习资料,本篇建立在大家已经稍许看过makefile的教程上,结合我们的 arm 工具链来具体分析上一篇中makefile的配置和作用。 样例工程的Makefile 首先还是先放上我们样例工程中的makefile文件。 #工程的名称及最后生成文件的名字 TARGET = LED_project #设定临时性环境变量 export CC = arm-none-eabi-gcc export AS = arm-none-eabi-as export LD = arm-none-eabi-ld export OBJ
[单片机]
关于 STM32 的几点内容
主要内容: 1.为什么STM32F0没有AFIO时钟呢? 2.关于STM32中的各种电源 3.IAR中如何查看外设寄存器 4.关于问问题 1为什么STM32F0没有AFIO时钟呢? 前面写过一篇文章【关于STM32时钟配置的那些坑】里面有讲述关于什么时候开启AFIO时钟,有朋友下来去研究AFIO时钟时发现STM32F0芯片中没有AFIO时钟,于是就问了这么一个问题:你好,为什么STM32F0没有AFIO时钟呢? 答案就是STM32F0没有AFIO时钟。那又是怎样实现重定义这个功能的呢? 实现重定义功能也是由特定的控制器完成的,需要使用某个控制器,就需要开启对应的时钟。 而STM32F1就是由“Alternate function
[单片机]
毕业设计| STM32物流搬运小车
# 硬件选型 # 车身 :使用平衡小车之家的一款自带车体和4个麦克纳姆轮的套餐。(不需要PS2手柄,巡线配置都不需要,麦轮直径60mm) 主控 :STM32F103ZET6最小系统板,不是很推荐我使用的这块,主要是颜值不高。(不加SRAM)电机驱动 :WINGXINE阿里风斯的一款H桥双驱,电机驱动超级好用。 无线串口:选择的逐飞科技的无线串口,半双工。主要是喜欢即插即用。机械臂:这个爪子真的超级不推荐,放出截图给大家避坑。(黑色B款爪子) # 硬件设计 # 值得一谈的就是电源部分的设计,其余主控和电机驱动部分的设计,本质上只是进行相应的线路连接,仅此而已。下面我好好聊一下这次的电源设计。 1)一开始的方案是,使用一块
[单片机]
基于STM32跑步路径记录
随着 科技 不断进步, 电子 化设备不断进入涌入我们的日常生活。生活水平的提高,各项健身运动应运而生,然后,健身运动不能盲目进行,科学的健身方式才能有效的提升我们自身的身体素质。 现如今各自手环手表的出现, 通过 智能 手环,用户可以记录日常生活中的锻炼、睡眠、部分还有饮食等实时数据,并将这些数据与 手机 、平等同步,起到通过数据指导健康生活的作用。 智能手环作为可穿戴设备,其功能还是比较强大的,其开发涉及智能手环 MCU 数据指令到 蓝牙 IC 的传输、蓝牙到APP的数据 通信 协议、APP到手机内部的通信调试逻辑实现、APP数据到云端服务器的数据库 算法 设计等一系列的开发。支持多种运动监控模式,可以实时监控身体的各项性能
[单片机]
远程修改STM32 TIMER占空比的方案
现在有人有这样一个需求,他使用STM32F429芯片做开发,其中用到32位的TIM2实现3路PWM输出。 另外有上位机跟STM32的UART接口相连,上位机可能不定期地需要通过UART接口给STM32发送新的占空比参数,而且每次都发送3个比较输出通道的参数【12个字节】。 如何快捷地实现这个功能呢?要求收到数据后尽快修改3个比较通道的参数。 前一篇重点介绍了利用DMAFIFO和UART接收事件触发DMA传输实现了3个CCR寄存器的批量修改。 我们不妨就该话题稍作拓展,不再局限于某个STM32系列,而是从整个STM32的资源上考虑当前需求。上次提到3种实现方案,我想借此机会再给大家介绍另外一种实现方案,以拓宽未来解决
[单片机]
Stm32固件库中关于NART的误解
Stm32 固件库中关于NART的误解 禁止自动重传模式(NART) 该模式主要用于满足CAN标准中,时间触发通信选项的需求。通过对CAN_MCR寄存器的NART位置’1’,来让硬件工作在该模式。 在该模式下,发送操作只会执行一次。如果发送操作失败了,不管是由于仲裁丢失或出错,硬件都不会再自动发送该报文。 网上有很多can的程序在注释的时候有这样的错误: 将 CAN_InitStructure.CAN_NART=DISABLE理解成为失能自动重传 但是NART的英文全称应该是no automatic retransmission,也就是没有自动重传。 那么CAN_InitStructure.CAN_NART=DISABLE的
[单片机]