STM32 HAL库实现DMA串口通信
文章目录
- 前言
- 1 DMA简介
- 2 通过CubeMX创建项目
- 2.1 设置RCC
- 2.2 设置USART1
- 2.3 创建项目
- 3 Keil配置项目
- 3.1 修改main代码
- 3.2 烧录
- 4 实现效果
- 总结
前言
- 软件版本
STM32CubeMX 6.4 0
Keil 531
- 硬件
STM32F103C8T6
1 DMA简介
DMA 全称Direct Memory Access,即直接存储器访问。
DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节。
我们知道,数据传输,首先需要的是数据的源地址、数据传输位置的目标地址、传递数据多少的数据传输量、进行多少次传输的传输模式。DMA所需要的核心参数,便是这四个。每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。
因此:转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,直接让数据由A拷贝到B 不经过CPU的处理
DMA传输方式
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:
- 外设到内存
- 内存到外设
- 内存到内存
- 外设到外设
DMA的主要特征
每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置;
- 在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推);
- 独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐;
- 支持循环的缓冲器管理;
- 每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求;
- 存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输;
- 闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标;
- 可编程的数据传输数目:最大为65535。
2 通过CubeMX创建项目
不懂的步骤可以看我另一篇博客:https://blog.csdn.net/apple_52030329/article/details/127232960
2.1 设置RCC
之后照样配置时钟
2.2 设置USART1
选择异步通信,参数选择默认
使能串口
添加两个通道
2.3 创建项目
老样子配置项目
3 Keil配置项目
打开刚才配置好的项目
3.1 修改main代码
int main(void)
{HAL_Init();uint8_t message[] = "DMA communication test\n"; //定义数据发送数组SystemClock_Config();MX_GPIO_Init();MX_DMA_Init();MX_USART1_UART_Init();while (1){HAL_UART_Transmit_DMA(&huart1, (uint8_t *)message, sizeof(message));HAL_Delay(1000);}
}
3.2 烧录
烧录工具选择 mcuisp
4 实现效果
通过串口调试助手查看,效果如下
总结
串口通信的实现方式有多种,轮询、中断以及使用DMA处理等,各有利弊。本文学习使用了DMA方式,实现了简单的串口通信程序
参考
https://blog.csdn.net/isyuuun/article/details/121074067
https://blog.csdn.net/qq_47281915/article/details/121063896?spm=1001.2014.3001.5501
https://blog.csdn.net/as480133937/article/details/104827639/
STM32 HAL库实现DMA串口通信相关推荐
- STM32CubeMX基于HAL库实现简单串口通信
STM32CubeMX基于HAL库实现简单串口通信 板子:STM32F103C8 编译工具:Keil+STM32CubeMX 烧录工具:FlyMcu 串口调试程序:XCOM 实验要求: 1)设置波特率 ...
- HAL库学习之串口通信
目录 一.串口通讯协议简介 一.物理层 1.电平标准 二.协议层 1.波特率 2.通讯的启示和停止信号 3.数据校验 三.STM32的串口简介 四.软件实现 1.通过图形化软件CubeMX配置 2.程 ...
- STM32 HAL库ADC+DMA(非定时器)代码和遇到的问题
目录 一.整体说明 二.部分知识点预览 三.代码部分 四.遇到的问题及现象 (1)仿真进入错误 (2)非连续模式软件触发时adcbuf里面的数据不对 (3)HAL库的ADC DMA相关中断的嵌套实现 ...
- STM32 HAL库 PWM+DMA 驱动WS2812B彩灯(STM32F030F4P6)
谁不想拥有炫酷的小彩灯呢?WS2812B可以给你机会...... 博主使用STM32驱动WS2812B主要参考了这位佬的文章,因为需求问题,采用了Cortex-M0的stm32f030f4p6(16k ...
- 如何快速使用STM32 HAL库和涂鸦Wi-Fi模组进行通信
简介:本文将教大家如何使用STM32HAL库快速开发和涂鸦WIFI模组通信,接入涂鸦云. 实现功能:通过APP实时监测温湿度数据 程序下载路径:demo程序. demo(定时采集数据)程序. 一.使 ...
- STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题
一.HAL库 串口 DMA+ESP8266模组通信问题 用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给wifi模组 ...
- STM32从零到一,从标准库移植到HAL库,UART串口1以DMA模式收发不定长数据代码详解+常见问题 一文解析
前言 本文的参考资料 感谢提供标准库版本的CSDN同学:这两篇文章至少是我看过的最详细的标准库配置DMA版本.而且代码实测稳定能用. STM32 | DMA配置和使用如此简单(超详细)_...| .. ...
- STM32 HAL库 串口DMA接收不定长数据
STM32 HAL库 串口DMA接收不定长数据 整体思路:我是用的CUBEMX软件生成的工程,使能了两个串口,串口2用来接收不定长的数据,串口1用来发送串口2接收到的数据:串口2我找了一个UBLOX卫 ...
- STM32 HAL库 CubeMX教程(五)串口通信基础
STM32 HAL库 CubeMX教程(五)串口通信基础 串口通信简介 CubeMX配置 初始化程序分析 程序编写 参考文献 STM32 HAL库 CubeMX系列教程 目录 串口通信简介 UART: ...
- STM32 HAL库串口同时收发,接收卡死?
STM32 使用 HAL库串口同时收发,使用踩坑史 = =!......by 矜辰所致 目录 前言 一. HAL 库串口收发 1.1 串口发送 1.2 串口接收 1.2.1 标准库接收 1.2.1 H ...
最新文章
- 机器视觉 · 网络相机
- Linux安装screen时的问题
- 通用权限管理系统组件 (GPM - General Permissions Manager) 中实现按部门组织机构设置权限...
- 基于C API的SQLite3基本数据库操作
- oracle中闪回和回滚,oracle闪回操作详解
- 图灵奖大佬 Lecun 发表对比学习新作,比 SimCLR 更好用!
- 中兴侵权案败诉需赔 2.89 亿元;HTC 裁员 1500 人;Android P Beta 3 发布 | CSDN 极客头条...
- Java代码质量改进之:使用ThreadLocal维护线程内部变量
- SOLIDWORKS软件转Dwg格式教程
- 如何在直播、会议、视频中使用虚拟形象
- 计算机里不显示硬盘图标,Win7不显示硬盘图标怎么办?不显示硬盘图标修复方法...
- C++刷题: 逆波兰表达式(力扣150题)
- 使用xpath批量爬取堆糖图片
- 从返利网站看如何经营用户
- 基于DCT的图像数字水印算法
- 最全HTTP状态码汇总1XX——5XX
- linux快速查找文件
- 无线传感网络的自适应协作数据传输方法
- 【降维打击,带你深度学习CPU(上)】
- java.sql.SQLException: Access denied for user ''@'localhost' (using password: YES)出现原因及解决方法