【嵌入式基础】串口中断通信VS串口DMA通信
目录
目录
前言
一、串口通信
1、 通信方式
2、通信速率
3、串口通信的三种工作方式
二、串口中断通信
1、串口中断特点
2、CubeMX配置初始化串口中断相关外设
3、串口中断程序分析
4、实验效果
三、串口DMA通信
1、关于DMA
2、CubeMX配置初始化DMA方式串口通信的外设
3、DMA程序分析
4、实验效果展示
四、参考文献
五、总结
前言
对比串口通信的不同方式,体味串口中断通信和DMA串口通信的区别
一、串口通信
1、 通信方式
同步串行:数据传输以数据块(一组字符)为单位,在一个数据块内,字符与字符间无间隔,收发双方依靠独立的时钟线进行信号的同步。适用于大批量的数据传输。
异步串行:数据传输以单个字符为单位,字符和字符之间的间隙任意,字符内部每一位持续的时间相同。收发双方没有专门的时钟信号,而是依靠事先约定的字符格式和通信速率来完成通信。
2、通信速率
· 波特率计算
Tx / Rx 波特率 = fCK/(16* USARTDIV )
· 这里的fCK是给外设的时钟(PCLK1用于USART2、3、4、5,PCLK2用于USART1)
USARTDIV是一个无符号的定点数。这12位的值设置在USART_BRR寄存器。· 常用的波特率有:9600、19200、38400、57600和115200;
· 波特率为115200,表示每秒 传输115200位,且每一位数据在数据线上持续时间为Tbit = 1/115200 ≈ 8.68us。
3、串口通信的三种工作方式
轮询方式 | CPU不断检测串口的状态标志来判断数据收发的情况。特点:程序设计简单,但CPU在检测标志位期间,无法执行其他任务,CPU利用率较低。 |
中断方式 | 使能中断后,接收一字节数据或发送一字节后申请中断,在ISR中完成后续处理。在数据收发期间,CPU可以执行其他任务,CPU利用率较高。 |
DMA方式 | 初始化时设置相关参数,启动DMA传输后,数据传输过程不需要CPU的干预。传输完成后,再产生DMA中断,由CPU进行后续处理。传输效率最高。 |
二、串口中断通信
1、串口中断特点
1. 发送数据时,将一字节数据放入数据寄存器DR;接收数据时,将DR的内容存放到用户存储区;
2. 中断方式不必等待数据的传输过程,只需要在每字节数据收发完成后,由中断标志位触发中断,在中断服务程序中放入新的一字数据或者读取接收到
的一字节数据;
3. 在传输数据量较大,且通信波特率较高(大于38400)时,如果采用中断方式,每收发一个字节的数据,CPU都会被打断,造成CPU无法处理其他事务。因此在批量数据传输,通信波特率较高时,建议采用DMA方式。
2、CubeMX配置初始化串口中断相关外设
· RCC时钟配置
选择高速外部晶振(HSE)作为系统时钟输入
配置时钟树
· USART1配置使能
· 串口中断使能
· 配置过程文件导出
3、串口中断程序分析
· USART1初始化配置函数
· 相关标志位及发送接收字符串变量的定义
· main 函数实现将目标字符串发送至pc端上位机
· 串口中断服务函数及回调函数
串口中断回调函数,我们所要实现的串口中断服务功能都在回调函数中编写
· 详细工程代码传送门:USART_TI · 范特西
4、实验效果
本实验使用到的烧录插件为:FlyMcu.exe
本实验使用到的串口收发助手为:XCOM V2.3
USART通信
三、串口DMA通信
1、关于DMA
· 直接存储访器问(DMA)的基本概念
用于在外设与存储器之间以及存储器与存储器之间进行高速数据传输。DMA传输过程的初始化和启动由CPU完成,传输过程由DMA控制器来执行,无需CPU参与,从而节省CPU资源,提高利用率。
· DMA控制器的特点
1. STM32F411微控制器具备两个DMA控制器:DMA1和DMA2,每个控制器有8个数据流,每个数据流可以映射到8个通道(或请求)
2. 每一个DMA控制器用于管理一个或多个外设的存储器访问请求,并通过总线仲裁器来协调各个DMA请求的优先级
3. 数据流(stream)是用于连接传输源和传输目标的数据通路,每个数据流可以配置为不同的传输源和传输目标,这些传输源和传输目标称为通道(Channel)
4. 具备16字节的FIFO。使能FIFO功能后,源数据先送入FIFO,达到FIFO的触发阈值后,再传送到目标地址
· DMA数据传输方式
普通模式 | 传输结束后(即要传输数据的数量达到零),将不再产生DMA操作。若开始新的DMA传输,需在关闭DMA通道情况下,重新启动DMA传输。 |
循环模式 | 可用于处理环形缓冲区和连续数据流(例如ADC扫描模式)。当激活循环模式后,每轮传输结束时,要传输的数据数量将自动用设置的初始值进行加载, 并继续响应DMA请求。 |
2、CubeMX配置初始化DMA方式串口通信的外设
· RCC时钟配置
选择高速外部晶振(HSE)作为系统时钟输入
时钟树与上面串口中断时钟配置一致
· USART1初始化配置
按如下步骤设置USART1为异步通信,BAUT率为115200、停止位1位且无奇偶校验位
使能中断
· DMA配置
DMA四种传输方向:
- 外设到内存 Peripheral To Memory
- 内存到外设 Memory To Peripheral
- 内存到内存 Memory To Memory
- 外设到外设 Peripheral To Peripheral
DMA传输方向、工作模式等相关配置
Src Memory 表示外设地址寄存器
功能:设置传输数据的时候外设地址是不变还是递增。如果设置 为递增,那么下一次传输的时候地址加 Data Width个字节,
Dst Memory 表示内存地址寄存器
功能:设置传输数据时候内存地址是否递增。如果设置 为递增,那么下一次传输的时候地址加 Data Width个字节
我们是通过DMA将数据从内存中发送到外设,是将数据不断存进固定外设地址串口的发送数据寄存器(USARTx_TDR)。所以外设的地址是不递增。
而内存储器存储的是要发送的数据,所以地址指针要递增,保证数据依次被发出
· 配置工程导出
3、DMA程序分析
· DMA初始化配置函数
· DMA中断服务函数入口
· main函数实现通过DMA发送字符串至pc上位机
待发送字符数组
通过DMA发送字符串 sentbuf
· 详细工程代码传送门 :DMA_USART · 范特西
4、实验效果展示
本实验使用到的烧录插件为:FlyMcu.exe
本实验使用到的串口收发助手为:XCOM V2.3
DMA串口
四、参考文献
【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)
五、总结
通过本次串口中断方式和DMA直接存储访问的方式实现了串口通信,再一次加深了对串口通信的基础知识的理解,且体会到了不同的串口通信的方式,通过中断方式极大的提高了处理芯片的运算效率,只会在中断触发的时候才会取处理中断函数,其他时候都继续执行主程序;DMA方式则更加高效,它直接将数据从内存传到外设或从外设传回内存,该过程压根不需要CPU参与,极大的减轻了CPU的负担,提高了CPU处理速度,这两种方式都是嵌入式芯片两种高效的传输方式,后期需要不断练习加深对它们的理解与运用。
【嵌入式基础】串口中断通信VS串口DMA通信相关推荐
- 使用串口中断方式实现串口通信
文章目录 一. 实验环境 二.实验目标 三.串口中断方式特点 四.HAL配置串口通信 五.开发板引脚连接 六.程序代码 (1)接收单个字符控制串口发送 (2)接收多个字符控制串口发送 七.总结 一. ...
- 采用串口中断方式实现串口通信:停止/持续发送“hello windows!”
文章目录 一.stm32接收到字符"s"/"t"时停止/持续发送"hello windows!" 1.STM32CubeMX工程创建 2.程 ...
- 采用串口中断方式实现串口通信
文章目录 前言 一.中断介绍 1.中断方式 2.中断优先级 3.中断向量 二.利用STM32CubeMX配置项目 三.在keil配置代码 四.实际效果 五.总结 六.参考资料 前言 一.中断介绍 1. ...
- 从单片机到嵌入式开发——(6) 定时器与串口中断
在上文中我们讲到了基本的中断定义和外部中断的使用方法.本篇将继续介绍另外两种常见的中断,也即定时器中断和串口中断. 标准的51单片机有5个中断源:两个外部中断.两个定时器/计数器中断.具体如下: 优先 ...
- STM32 串口中断总结
更多精彩内容关注 微信公众号"广乙电子(dlrcclub)" 本文以USART1为例,叙述串口中断的编程过程. 1.先来讲述一下在应用串口中断时涉及到的一些库文件. 首先对于STM ...
- UART0串口编程(三):中断方式的串口编程;用中断编写发送函数
UART0串口编程(三) 一:中断方式的串口编程 1.用中断方式编写串口程序由那几部分组成 2.硬件上的支持 1>UART0 发送FIFO缓冲区 A.UART0含有1个16字节的发送FIFO缓冲 ...
- Arduino学习笔记:串口中断
实习任务需要实现一个优先级变换,因此在此要自学一下串口中断. 1 为何要中断 计算机读取信息有两种方法:查询和中断.查询即为不断读取,直到得到数据.而中断为只有接到数据后才会响应.在Arduino中, ...
- linux驱动向不同串口发数据,Linux串口(serial、uart)驱动程序设计
一.核心数据结构 串口驱动有3个核心数据结构,它们都定义在 1.uart_driver uart_driver包含了串口设备名.串口驱动名.主次设备号.串口控制台(可选)等信息,还封装了tty_dri ...
- linux 串口驱动 理解,linux 串口驱动 理解
linux 串口 驱动 理解 一.核心数据结构 串口驱动有3个核心数据结构,它们都定义在 1.uart_driver uart_driver包含了串口设备名.串口驱动名.主次设备号.串口控制台(可选) ...
- linux内核串口接入pps,Linux串口(serial、uart)驱动程序设计
一.核心数据结构 串口驱动有3个核心数据结构,它们都定义在 1.uart_driver uart_driver包含了串口设备名.串口驱动名.主次设备号.串口控制台(可选)等信息,还封装了tty_dri ...
最新文章
- aFleX脚本常见错误
- WebService大讲堂之Axis2(3):使用services.xml文件发布WebService
- arthas案例:哪个controller处理了请求?每个请求的调用参数和返回值是多少?
- Mybatis笔记一:java.lang.NoClassDefFoundError: org/apache/ibatis/mapping/DatabaseIdProvider
- 结队开发之NABCD
- nit计算机应用基础是考试大纲,全国计算机应用技术证书考试(NIT)考试大纲(计算机应用基础Windows XP)...
- python代码删掉了几行怎么撤回_78行Python代码实现现微信撤回消息功能
- Windows环境下的安装gcc
- hibernate 各种主键生成策略(转)
- 在程序里面(服务器端)调用Winrar压缩文件的方法?另寻求一条语句转换的方法。vb.net到C#。...
- 音乐播放器App界面优秀案例,通过案例看大咖如何设计?
- 计算机应用基础网上作业题第二章,计算机应用基础网上作业题.doc
- php是视频还是图片格式,php 视频、音频和图片文件上传,该如何解决
- 洛谷——P1287 盒子与球
- dockertool (win10家庭版)安装后的问题
- 麻省理工18年春软件构造课程阅读04“代码评审”
- 那些35岁的程序员哪里去了?
- OOP_多态(C#)
- 分析Crash report
- 金山词霸的字典引擎接口