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

发布者:Weasel最新更新时间:2024-08-27 来源: elecfans关键字:STM32  串口中断  DMA接收 手机看文章 扫描二维码
随时随地手机看文章

今天再给大家分享一些关于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 请求就无法将数据寄存器内的数据及时转移走,如此陷入死锁。这就是串口无法正常接收的原因。

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


关键字:STM32  串口中断  DMA接收 引用地址:STM32串口中断及DMA接收常见的几个问题

上一篇:STM32G474 逐波限流保护的实现
下一篇:STM32串口通信简明知识

推荐阅读最新更新时间:2024-11-12 10:16

STM32 多路软定时器
不记得哪里听过这句话:一个产品的50%的代码用于实现功能,另外50%则用与于容错。可见容错的重要性。容错的方法有很多,其中超时机制是最常用的方法之一。超时机制,故名思议,需要使用到定时器,用定时器来产生定时节拍,然后检测对象是否在规定的时间内正常完成操作。当存在多个需要监控的对象时,如果只使用一个定时器来监控多个对象,则定时机制会产生紊乱;但如果使用多个定时器分别监控一个对象,则会导外设资源浪费或者匮乏。这个问题的解决方法是:用一个定时器外设,在它的基础上实现多路软定时器。这样的话,实际只是用了一个定时器外设,却可以获得多个定时器功能。 下面就来讲讲如何使用一个定时器外设来实现多路软定时器。还是基于我自己规范工程。 1、工程的修
[单片机]
<font color='red'>STM32</font> 多路软定时器
STM32 串口中断里面使用printf 出现错误
其实学单片机使用的时候,往往大家都觉得简单,很快就过了,但其实有一些东西是值得深思的,我以前在写程序的时候往往都是发送数据,那么调用重写的printf()函数就可以了,但这次的项目中用到了NRF双全工通讯,这就需要串口的收发,这回就发生了写问题,具体的流水账就不说了。简单说就是串口收可比发讲究多了。 void USART1_IRQHandler(void) //串口1中断服务程序 { u8 i; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//如果寄存器中有数据 { USART_RX_BUF = USART_ReceiveData(USAR
[单片机]
STM32的内部温度传感器
1、STM32的内部温度传感器 STM32内部温度传感器与ADC的通道16相连,与ADC配 合使用实现温度测量。测量范围–40~125℃,精度 ± 1.5℃ 操作流程: 1)、设置ADC相关参数 // ADC1 configuration ----------------------------- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_Init
[单片机]
STM32 SPI NSS信号理解和DMA传输遇到的问题
最近做个项目,用到了SPI,遇到一些问题。 SPI,四根线,MISO,MOSI,SCK,和NSS,这其中NSS用起来最容易踩坑。NSS是片选线,是用于选择从器件的引脚,可让SPI主器件与从器件进行单独通信,从而避免数据线上的竞争。 问题1:从机发送数据给主机 要知道,SPI主机发数据,从机去收。但是从机发数据,主机可以不理会。因为主机控制着SCK线,从机若想要发送数据,只能去通知主机来“读”。怎么通知? 从机若有数据要发送给主机,可以用一根 INT 线来通知,拉低这根线,主机检测到 INT线被拉低,就可以发送一个废字节,从而去交换从机要发送的有效数据。因为当主机往DR寄存器里面写数据时,就会自动开启SCK,在SCK的
[单片机]
<font color='red'>STM32</font> SPI NSS信号理解和<font color='red'>DMA</font>传输遇到的问题
STM32】HAL库 STM32CubeMX教程八---定时器输入捕获
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 知识概括: 通过本篇博客您将学到: PWM工作原理 STM32CubeMX创建PWM例程 HAL库定时器PWM函数库 PWM创建呼吸灯 什么是PWM 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非
[单片机]
【<font color='red'>STM32</font>】HAL库 STM32CubeMX教程八---定时器输入捕获
FreeRTOS的简介&移植FreeRTOS到STM32平台
I.说明 作者:WXP(翱翔云端的鸟) 联系方式:328452854@qq.com || 13100610853(联系请注明CSDN) 申明:个人原创,转载请先经过本人同意! 要说的话:个人水平有限,不足之处,还请指正!有疑问欢迎大家联系我交流探讨! ============================================================================================================================= ========================================================
[单片机]
FreeRTOS的简介&移植FreeRTOS到<font color='red'>STM32</font>平台
STM32 BH1750光线感应源程序
单片机源程序如下: #include bh1750.h #include delay.h #include timer.h u8 BUF ; u16 temp2=0; float lux=0; void bh1750_iic_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;
[单片机]
STM32学习笔记4:外部中断
NVIC: STM32F40xx/STM32F41xx的92个中断里面,包括10个内核中断和82个可屏蔽中断,具有16级可编程的中断优先级,而我们常用的就是这82个可屏蔽中断。 那么我们如何管理82个外部中断呢? 首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。分组配置在SCB- AIRCR寄存器,如下表: 抢占优先级 & 响应优先级区别1.高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。 2.抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。 3.抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。 4.如果两个中断的
[单片机]
<font color='red'>STM32</font>学习笔记4:外部<font color='red'>中断</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved