基于中断/DMA模式的串口通信

本文详细对比了中断和DMA模式在串口通信中的区别,并通过stm32CubeMX工程实例,展示了如何设置及编写基于DMA和中断模式的串口通信代码,包括Keil的配置、烧录运行以及仿真结果分析。
摘要由CSDN通过智能技术生成


一、DMA与中断模式的区别

(1)中断方式是在数据缓冲寄存区满后,发中断请求,CPU进行中断处理。
(2)DMA方式则是以数据块为单位传输的,在所要求传送的数据块全部传送结束时要求CPU进行中断处理,这样大大减少CPU进行中断处理的次数。 DMA方式不需CPU干预传送操作 ,不占用CPU任何资源, 整个数据传输操作在一个称为"DMA控制器"的控制下进行的。CPU除了在数据传输开始和结束时做一点处理外,在传输过程中CPU可以进行其他的工作。这样,在大部分时间里,CPU和输入输出都处于并行操作。因此,使整个计算机系统的效率大大提高。 中断方式是程序切换,每次操作需要保护和恢复现场,中断次数多,CPU需要花较多的时间处理中断,中断次数多也会导致数据丢失。 但是DMA是必须利用中断的,否则CPU无法得到数据已经传输结束,当数据传输开始结束的时候,需要给CPU一个中断信号,CPU进行处理.这个就大大的节约了CPU的资源。
(3)中断方式的数据传送方向是由设备到CPU再到内存,或者相反。
DMA方式的数据传送则是将所传输的数据由设备直接送入内存,或是由内存直接送到设备。

二、基于DMA模式的串口通信

1.建立stm32CubeMX工程

打开软件,选择器件,建立工程.
在这里插入图片描述
然后设置RCC
在这里插入图片描述
设置USART1
在这里插入图片描述
添加两个通道
在这里插入图片描述
设置NVIC
在这里插入图片描述
然后创建工程名
在这里插入图片描述
在这里插入图片描述
创建工程后,直接转到Keil.

2.Keil代码编写与运行

打开Keil,先点击魔法棒进行相关配置,以便输出.hex文件。
在这里插入图片描述

在这里插入图片描述
设置好后,进行编译,若无错误,则说明工程创建完好,然后就是代码的编写。
完整代码如下:

#include "main.h"
#include "dma.h"
#include "usart.h"
#include "gpio.h"
#include "string.h"

void SystemClock_Config(void);

int shuru(char date[6],char date2[6])//判断输入若为“start”,则和数据匹配返回1,反之返回0
{
   
	for(int i=0;i<6;i++)
	{
   
		if(date[i]!=date2[i])  return 0;
	}
	return 1;
}	

int flag=1;//0停止发送,1开始发送
char date[6]="start";

int main(void)
{
   
  HAL_Init();

  
  SystemClock_Config();

 
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
	
  char message[]="Hello windows!\n";//输出信息
  HAL_UART_Receive_DMA(&huart1,(uint8_t*)&date,5);//设置串口DMA模式接收
	
  while (1)
  {
   
    if(flag==1)//当输入"start",flag==1,此时发送&
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值