前言
本次实验的器件及软件如下:
软件版本:
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,我可以明显地看到数据传输速度的提升。然而,在追求效率的同时,也需要考虑到数据的可靠性和完整性。在实验中,我遇到了几次因硬件故障或信号干扰导致的数据传输错误,这让我意识到在追求效率的同时,数据的安全性同样重要。