基于HAL库实现DMA串口通信


前言
本次实验的器件及软件如下:
软件版本:
STM32CubeMX:6.35,KEIl:5.31,FlyMcu或者mcuisp(烧入软件),串口助手
硬件:
STM32F103C8T 核心板,usb to ttl

实验要求
STM32系统给上位机(win10)连续发送“hello windows!”;当上位机给stm32发送字符“stop”后,stm32暂停发送“hello windows!”;发送一个字符“start”后,stm32继续发送;

一、DMA是什么?

DMA,全称Direct Memory Access,即直接存储器访问。

DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。

实际上DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。**无须CPU的干预,通过DMA数据可以快速地移动。**这就节省了CPU的资源来做其他操作。

DMA传输方式
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节。
更多有关DMA的只是可以参考以下链接链接: link

二、工程创建

1、选择自己的芯片类型,输入芯片——选型———开始工程
在这里插入图片描述
2、SYS配置
在这里插入图片描述
3、RCC配置

在这里插入图片描述
4、设置usart1,选择异步通信,参数选择默认设置即可,需要记得自己设置的参数
在这里插入图片描述
5、串口使能
在这里插入图片描述
6、添加通道(点击add即可,不需要做其他的修改)
在这里插入图片描述

7、项目的生成
在这里插入图片描述
在这里插入图片描述
最后点击open project 跳转到keil中
到此,工程创建完成

三、代码实现

1、在main.c文件中找到函数MX_GPIO_Init,选中并点击右键,跳转到该函数定义的地方。
在这里插入图片描述
2、
在这里插入图片描述

3、其他部分代码

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	//当输入的指令为“stop!"时,发送提示并改变flag=0
	if(strEqual(rx_buf,"stop!"))
	{
		flag=0;
	}
	
	//当输入的指令为"start"时,发送提示并改变flag=1
	else if(strEqual(rx_buf,"start"))
	{
		flag=1;
	}
	HAL_UART_Receive_DMA(&huart1,(uint8_t*)rx_buf,5);
}

4、效果展示
在这里插入图片描述

四、实现心得

学习串口通信的理论知识后,通过实验,我真正理解了中断和DMA在串口通信中的作用。中断用于处理发送和接收过程中的突发事件,确保数据的实时传输;而DMA则可以独立于CPU进行数据传输,提高了数据传输的效率。效率与可靠性:通过使用中断和DMA,我可以明显地看到数据传输速度的提升。然而,在追求效率的同时,也需要考虑到数据的可靠性和完整性。在实验中,我遇到了几次因硬件故障或信号干扰导致的数据传输错误,这让我意识到在追求效率的同时,数据的安全性同样重要。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值