目录
目录
前言
对比串口通信的不同方式,体味串口中断通信和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处理速度,这两种方式都是嵌入式芯片两种高效的传输方式,后期需要不断练习加深对它们的理解与运用。