首页
学习
活动
专区
工具
TVP
发布

STM32—无需中断来实现使用DMA接收串口数据

本节目标: 通过DMA,无需中断,接收不定时长的串口数据 描述: 当在串口多数据传输下,CPU会产生多次中断接收串口数据,这样会大大地降低CPU效率,同时又需要CPU去做其它更重要的事情,我们应该如何来优化...比如四轴飞行器,当在不停地获取姿态控制方向时,又要去接收串口数据....答:使用DMA,无需CPU中断便能实现接收串口数据 1.DMA介绍 DMA,全称为: Direct Memory Access,即直接存储器访问, DMA 传输方式无需 CPU 直接 控制传输,通过硬件为...2在main()中调用串口配置函数,初始化串口后,然后使能UART1_RX的DMA接收 2.1在main()函数中,使用以下函数来调用配置函数: uart_init(115200); //串口初始化为...所以使用库函数中变量DMA1_Channel5 来配置UART1_RX. 3.2在main()函数中,定义一个接收数组,使用以下3个参数来调用配置函数: u8 USART_RX_BUF[35]; //接收缓冲

2.9K50
您找到你想要的搜索结果了吗?
是的
没有找到

【STM32笔记】串口空闲中断接收不定长数据(DMA方式)

在使用STM32的串口接收数据的时候,我们常常会使用接收中断的方式来接收数据,常用的是RXNE。这里分享另一种接收数据的方式——IDLE中断(PS:本文的例子运行在STM32F103ZET6上)。...一、IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?...二、RXNE中断和IDLE中断的区别? 当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。...这是状态寄存器,当串口接收到数据时,bit5就会自动变成1,当接收完一帧数据后,bit4就会变成1. 需要注意的是,在中断函数里面,需要把对应的位清0,否则会影响下一次数据的接收。 ?...四、USART+DMA+IDLE接收不定长数据例程 1、USART初始化 ? 2、中断服务函数 ? 3、主函数 ? 4、运行结果 ?

5.6K31

串口通信—串口发送和接收代码讲解

我们不仅仅可以将数据发送到串口调试助手,我们还可以在串口调试助手发送数据给控制器,控制器程序根据接收到的数据进行下一步工作。   ...首先,我们来编写一个程序实现开发板与电脑通信,在开发板上电时通过USART 发送一串字符串给电脑,然后开发板进入中断接收等待状态,如果电脑有发送数据过来,开发板就会产生中断,我们在中断服务函数接收数据,...  使能USART;   在USART 接收中断服务函数实现数据接收和发送。   ...首先我们需要调用USART_Config 函数完成USART 初始化配置,包括GPIO 配置,USART 配置,接收中断使能等等信息。   接下来就可以调用字符发送函数把数据发送给串口调试助手了。...我们在串口调试助手发送区域输入任意字符,点击发送按钮,马上在串口调试助手接收区即可看到相同的字符。

5.1K30

关于串口接收处理数据

一,处理思路(定时器模拟空闲中断)   判断串口接收到一条完整的数据以后置位一个标志位,主循环判断此标志位处理数据.   ...同时串口中断接收数据的时候对这个变量清零!...如果串口一直接收数据这个变量永远累加不到期望的数值,如果串口接收     数据以后不再接收数据,变量会累加到期望的数值,然后就是判断接收到一条完整的数据....,DMA发送完成中断里面也要判断内存里面有没有需要发送的数据,有的话就重新配置DMA, 说完发送,再说接收 我的想法是 数组+DMA+串口空闲中断/定时器 串口空闲中断和定时器的作用都是判断接收到一条完整的数据...内存管理+DMA+串口空闲中断

3.3K31

Simulink 串口接收详解1

接收更加复杂的情况 4.程序下载 ---- 1. 接收uint8数据 ? 用串口调试助手给 Matlab 发送两个字节a和A,用ASCII码展示就是97和65。 1.1....模块 Serial Configuration 对于串口的一些基本设置。 ? 3....接收更加复杂的情况 由本文1和2两个小节可以看到,该串口接收只能解析单一的数据(要么是uint8数据类型,要么是doule数据类型)。但是实际我们的发送包会很复杂,有可能是多种类型的数据集合。...进阶教程:[Matlab]Simulink串口接收详解2用S-Function解析数据包 typedef struct { uint8 head;//1 double x;//8...St_Data data; }Un_sendData; 4.程序下载 程序下载的所有地址集中在,下一个博客Simulink串口接收详解2用S-Function解析数据包:https:

2K10

STM32单片机采用环形缓冲区实现串口中断数据接收管理

一、前言 在嵌入式系统开发中,与上位机进行串口通信是非常常见的场景。上位机可以通过串口发送指令或者数据给嵌入式设备,而嵌入式设备需要可靠地接收并解析这些数据,以执行相应的操作。...在本项目中,选择使用STM32微控制器来实现串口数据接收功能。STM32具有丰富的外设资源和强大的性能,非常适合用于串口通信和数据处理。...通过使用环形缓冲区管理串口接收的数据,可以实现可靠的数据接收和处理,并提高系统的稳定性和可靠性。同时,该方案也适用于其他嵌入式系统和通信场景。...CircularBuffer_Write(cb, data[i])) { return false; // 写入数据出错 } } return true; } // 示例:STM32串口接收中断处理函数...最后,给出了一个示例,展示在STM32串口接收中断处理函数中将接收到的数据写入环形缓冲区。

33330

单片机多字节串口接收(转)

工作了一年多,写了不少单片机串口程序。感觉串口多字节接收部分的逻辑相对于配置寄存器跟串口回复来说,是有点难度的——寄存器配置基本上都是死的,串口回复多字节跟回复一字节只是多了一个循环。   ...串口接收程序是基于串口中断的,单片机的串口每次接收到一字节数据产生一次中断,然后再读取某个寄存器就可以得到串口接收的数据了。然而在实际应用当中,基本上不会有单字节接收的情况。...第一次写串口接收程序的时候,我首先想到的就是定义一个全局变量(实际上最好是定义局部静态变量),初始值设置为0,然后每进一次中断+1,然后加到串口通信协议的长度的时候再清零。然后判断帧头、校验。...接收成功则在中断程序中把串口接收成功标志位置1。   ...下面是全局变量定义   unsigned char receive[4]={0,0,0,0};//接收缓存   bit uart_flag;//串口接收成功标志   然后串口中断部分   ```c

1.8K50

FreeRTOS例程3-串口中断接收不定长的数据与二值信号量的使用

串口接收中断 中断标志为:USART_IT_RXNE,即rx none empty,串口只要接收到数据就触发中断,如果是接收一个字符串,则每接收到一个字符就触发一次中断。...串口空闲中断 中断标志为:USART_IT_IDLE,idle即空闲的意思,串口空闲时触发的中断,当然也不是说串口空闲时就一直触发中断,而实在每个连续的接收完成后,触发中断,如果是接收一个字符串,则接收完整个字符串后...所以,这两个中断可以配合使用,串口接收中断实时接收数据,接受完一串数据后,空闲中断被触发,就可以对接收的一串数据分析处理了。这种方式不需要知道每次字符串的具体长度,因而可以接收不定长的串口数据。...信号量用于任务间的同步,FreeRTOS是多任务系统,不同任务间可能需要某种同步关系,如串口中断接收完数据后,数据分析处理任务才能拿到数据进行分析,这就是一种同步。...串口空闲中断接受完一串数据后,可执行释放信号量操作,这时,数据分析处理任务就可以获取到信号量,进而可以处理串口数据了,实现了串口数据接收与数据处理的同步。 接下来的程序思路如下: ?

2.4K12

Linux中断处理

中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux中断的处理过程。...handler: 类型为 hw_interrupt_type 结构,表示IRQ线对应的硬件相关处理函数,比如 8259A中断控制器 接收到一个中断信号时,需要发送一个确认信号才会继续接收中断信号的,发送确认信号的函数就是...这里要注意的是,如果中断处理过程能够开启中断的,那么就把中断打开(因为CPU接收中断信号时会关闭中断)。...鉴于这个原因,Linux中断处理分为两个部分,上半部 和 下半部,上半部 在前面已经介绍过,接下来就介绍一下 下半部 的执行。...softirq机制 中断下半部 由 softirq(软中断) 机制来实现的,在Linux内核中,有一个名为 softirq_vec 的数组,如下: static struct softirq_action

6.5K20

Linux中断 - IDT

[toc] 如何设置IDT IDT 中断描述符表定义 中断描述符表简单来说说是定义了发生中断/异常时,CPU按这张表中定义的行为来处理对应的中断/异常。...中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux...pre-cpu的中断栈,还是使用IST的中断栈; type表示所中断是何种类型,目前有以下四种: enum { GATE_INTERRUPT = 0xE, //中断门 GATE_TRAP...传统系统调用相关 IDT 的设置 Linux系统启动过程中内核压解后最终都调用到start_kernel, 在这里会调用trap_init, 然后又会调用idt_setup_traps: void...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int

6.5K10

51单片机采用中断进行串口通信

51单片机采用中断方式的串口通信过程及程序分析: 所谓中断方式,就是串口收/发标志位出发中断后,在中断中执行既定操作,可通过函数调用来实现。...程序: /*51单片机采用中断方式的串口通信程序分析: 接收数据时 等待中断->然后在中断接收数据 发送数据时 发送数据->等待中断->然后在中断中发送数据 具体步骤如下: 确定T1的工作方式(编程TMOD...=0 波特率不加倍 EA=1;//开总中断 ES=1;//开串口中断 注意:如果使用查询方式进行串口通信时,要把串口中断ES关闭、 } //定义数据发送函数 void sentTemp...(1) { if(RIflag==1) { ES=0;//关串口中断 RIflag=0;//接收标志位清0 sentTemp...{ //串口中断函数 if(RI) { RI=0;//接收中断标志位RI必须由软件清0 Temp=SBUF;//把接收缓冲器中收到的数据赋值给led

1.6K21

关于串口数据的发送和接收(调试必备)

前言 对于串口的数据发送和接收,大多是都是利用串口中断来进行的,但是这样对于编程方面有一定要求,并且程序也不太好写,比如说,如果让你随意接收一段数据,然后利用串口将它发送出来,第一个需要考虑的问题就是接收数据的长度...,因为串口数据的发送可以根据意愿去调用,可以不用中断,但是串口数据的接收就非常需要串口中断了,因为你不知道什么时候数据发送过来,如果用查询法的话,每次都要去轮训,并且在没有操作系统的时候,轮训带来的时间延迟是接收数据所不能接受的...因此我们必须将ES置为1 我们来看一下串口中断的向量表 由此可以看见当ES置为1的时候,即ES开关闭合,则RI和TI(接收完成标志和发送完成标志) 都能够触发串口中断,它们都共用串口中断...这样接收所需要的第一个步骤就清楚了,即ES = 1.接下来谈一下后面的思路。在打开串口中断允许后,数据来的时候,就会触发接收串口中断,RI会置为1。...那么我们就另外想一个办法,因为串口中断接收的时候都会触发中断,那么如果在接收到第一个字节进入中断的时候就清除RI并且开启一个时间更小的定时,然后在里面查询RI是否被置为1(因为一个字节接收完成后RI就会置

3.9K20

Linux 中断处理浅析

最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着”重要的事马上做, 不重要的事推后做”的异步处理思想....比如: 时钟中断处理过程, 网络发送/接收处理过程. 结尾阶段 CPU接收中断以后, 以历以上五个阶段, 中断处理完成. 最后需要恢复第一阶段中被保存在栈上的寄存器信息. 中断处理结束....中断处理的这几个阶段中不能调用可能导致睡眠的函数(包括分配内存); 对于第一个问题, 较新的linux内核增加了ksoftirqd内核线程, 如果持续处理的softirq超过一定数量, 则结束中断处理过程...据说在montavista(一种嵌入式实时linux)中, 将内核的中断机制做了修改. (某些中断的)中断处理过程被赋予了task结构, 能够被内核调度. 解决了上述两个问题....工作队列 linux基线版本的内核在解决上述问题上, 提供了workqueue机制.

7.3K80

Linux基础(串口编程)

虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口。废话少讲,今天来解剖使用串口时的编程代码细节。...上面的代码是使用串口的第一步,来解释下都是啥意思。...来瞧瞧: 第21-22行,定义了一个用来配置串口属性的结构体: struct termios serial; bzero(&serial, sizeof(serial)); 第24行,将串口设置为raw...|= CLOCAL | CREAD; // 忽略调制解调器线路状态并使能接收器 serial.c_cflag &= ~CSIZE; // 使能字符尺寸 serial.c_cflag |= CS8; /.../ 设置字符尺寸为CS8 serial.c_cflag &= ~PARENB; // 关闭奇偶校验 serial.c_cflag &= ~CSTOPB; // 关闭停止位 第33、36行,刷新掉接收到的数据并忽略掉他们

12.6K20

2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片 解决串口接收数据丢字节丢包问题

本文用的是VS2013MFC写串口数据接收: 第一步:首先建立一个MFC工程,成功后会跳出一个对话框,直接在对话框上点击右键-》点击插入ACTIVAE控件-》选择MicrosoftCommunications...先预读缓冲区以清除残留数据 } 好这是打开串口的函数 ,既然打开的串口那么硬件就要给我们发数据了 ,而mFC也要有接收的能力 所以这时候我们要添加一个 串口数据的响应函数: ?...  所以我们一次性接收够了我们就跳出来  要是一直接收肯定会炸的  不信可以自己试试哈哈哈哈哈哈 还有这里有时候会出现一个问题,就是  串口传输数据的时候回丢包     有时候单步调试的时候却不会丢包...丢字节   STM32   单片机51都有可能出现这种情况  (串口调试助手收发大量数据时是怎样处理的,新手求教,写了一个串口调试助手,接收数据会丢帧,串口通讯,丢包严重是什么问题,为什么串口单步调试正常...m_hasCOMImage; CImage m_COMImage; 然后在看Dlg.cpp文件  我们还需要几个函数: 第一  在Dlg::OnInitDialog()初始中 我们要先给图片变量分配内存 不然程序会中断

2.9K30
领券