基于中断DMA的串口通信

基于中断/DMA的串口通信

本篇讲述,通过中断方式、DMA两种方式完成串口通信

中断方式

使用STM32CubeMX创建工程:

  1. 打开STM32CubeMX,选择你的目标STM32微控制器型号,然后进入项目。

  2. 在"Pinout & Configuration"选项卡中,开始如下配置:

    点击A->Z,选择SYS,在Debug一栏选择Serial Wire

    在这里插入图片描述

    选择RCC,如下:

    在这里插入图片描述

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

  4. 在"Clock Configuration"选项卡中,设置如下:

在这里插入图片描述

  1. 在"Project Manager"选项卡中,按如下配置:

    Code Generator界面:

    在这里插入图片描述

  2. 最后,点击GENERATE CODE,生成后直接点击打开项目

    在这里插入图片描述

keil代码部分

打开项目后,进行代码编写。

1.定义全局变量和对main进行编写

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:开始发送
int main(void)
{
	HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
	//设置接受中断
	HAL_UART_Receive_IT(&huart1,(uint8_t *)&c, 1);

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

2.重载HAL_UART_RxCpltCallback函数

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);	
}

3.烧录和结果

在这里插入图片描述

在这里插入图片描述

4.波形图

在这里插入图片描述

DMA方式

使用STM32CubeMX创建工程

与中断方式大致相同,唯一不同如下

在"Clock Configuration"选项卡中,设置如下:

a5

keil代码部分

打开项目后,进行代码编写。

1.定义全军变量和对main进行编写

uint8_t A;
int flag=0;
uint8_t r[5]="start";
int j=0;
int i=0;
int flag1=0;
int flag2=0;
uint8_t t[4]="stop";

void SystemClock_Config(void);

/**
* @brief  The application entry point.
* @retval int
*/
int main(void)
{

HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */
SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */

/* USER CODE END 2 */
HAL_UART_Receive_DMA(&huart1,(uint8_t *)&A,1);

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
  /* USER CODE END WHILE */
    if(flag==1){
HAL_UART_Transmit_DMA(&huart1,"hello windows!\n",15);
    HAL_Delay(1000);
    }
  /* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}

2.重载HAL_UART_RxCpltCallback函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  
  
  if(A==r[i]){
  	flag1++;
  		i++;
  	}
  	else
  	{
  		flag1=0;
  		i=0;
  	}
  	if(A==t[j]){
  	flag2++;
  		j++;
  	}
  	else
  	{
  		flag2=0;
  		j=0;
  	}
  	if(flag1==5)
  	{
  		flag=1;
  		HAL_UART_Transmit_DMA(&huart1,"start",5);
  		flag1=0;
  		i=0;
  	}
  	if(flag2==4)
  	{
  		
  		flag=0;
  		HAL_UART_Transmit_DMA(&huart1,"stop",4);
  		flag2=0;
  		j=0;
  	}
  HAL_UART_Receive_IT(&huart1,(uint8_t *)&A,1);
}

3.烧录和结果

在这里插入图片描述

在这里插入图片描述

4.波形图

在这里插入图片描述

总结

通过这两种不同的方式,使我更加了解串口通信,让我受益匪浅。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值