基于中断&DMA的串口通信

一、基于中断的串口通信

1.配置stm32cubemx

配置RCC
在这里插入图片描述

配置SYS
在这里插入图片描述

配置USART1
在这里插入图片描述

配置NVIC
在这里插入图片描述

配置时钟树
在这里插入图片描述

project manager设置
在这里插入图片描述

在这里插入图片描述

2.在keil软件中修改代码

定义全局变量

uint8_t c;
uint8_t d[10];//指令 s:停止  t:开始
uint8_t  index=0;
uint8_t  num=0;
char message[]="hello windows!\n";//输出信息
char tips[]="CommandError\n";//提示1
uint8_t r[5]="start";
uint8_t t[4]="stop";
int flag1=0,i=0;
int flag2=0,j=0;
char tips1[]="start stm32";//提示2
char tips2[]="stop stm32";//提示3
int flag=0;//标志 s:停止发送 t:开始发送

重写中断处理函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{	
	
	HAL_UART_Transmit(&huart1,(uint8_t *)&c,1,0xFFFF);
		if(c==r[i]){
		flag1++;
			i++;
		}
		else
		{
			flag1=0;
			i=0;
		}
		if(c==t[j]){
		flag2++;
			j++;
		}
		else
		{
			flag2=0;
			j=0;
		}
		if(flag1==5)
		{
			flag=1;
			flag1=0;
			i=0;
		}
		if(flag2==4)
		{
			
			flag=0;
			flag2=0;
			j=0;
		}
		//HAL_UART_Transmit(&huart1,(uint8_t *)&flag2,1,0xFFFF);
        HAL_UART_Receive_IT(&huart1,(uint8_t *)&c, 1);	
}

在mian函数的while循环前添加串口接收函数

HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);	

加上if识别语句

if(flag==1){
			//发送信息
			HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF); 			
			//延时
			HAL_Delay(1000);
		}

3.烧录
在这里插入图片描述

4.结果
发送start开始发送hello Windows,发送stop停止发送hello Windows
在这里插入图片描述

5.波形图
在这里插入图片描述

二、基于DMA的串口通信
1.DMA介绍
DMA,全称Direct Memory Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节。
我们知道,数据传输,首先需要的是数据的源地址、数据传输位置的目标地址、传递数据多少的数据传输量、进行多少次传输的传输模式。DMA所需要的核心参数,便是这四个。
每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。

2.通过CubeMX创建项目
设置RCC
在这里插入图片描述

设置USART1
选择异步通信
参数选择默认
在这里插入图片描述

使能串口
在这里插入图片描述

添加两个通道
在这里插入图片描述

创建项目(如图)
在这里插入图片描述

3.把main函数中的内容修改为自己的代码

int main(void)
{

  HAL_Init();

	uint8_t message[] = "hello Windows\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);
  }
}

4.结果
把修改完的代码进行编译后再烧录,通过串口调试助手查看。(打开串口助手后连续发送hello Windows)
在这里插入图片描述

5.波形图
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值