HAL库中断方式进行串口通信

本文详细介绍了使用STM32F103ZET6的HAL库通过中断方式实现串口通信的过程,包括CubeMX配置、Keil编写中断处理代码、设置字符串识别及中断接收操作。通过发送'stopstm32!'和'statstm32!'控制通信状态,适合初学者理解串口中断应用。
摘要由CSDN通过智能技术生成

HAL库中断方式进行串口通信

实验准备:
软件:
STM32CubeMX:6.6.0
KEIl:5.37.0.0
FlyMcu:0.188
硬件:
STM32F103ZET6

一、CubeMX配置项目

1.1 SYS配置

在这里插入图片描述

1.2 RCC配置

在这里插入图片描述

1.3 USART设置

在这里插入图片描述

1.4 NVIC配置

在这里插入图片描述

1.5时钟配置

在这里插入图片描述

1.6 项目创建

在这里插入图片描述
在这里插入图片描述

二、Keil编写代码

2.1添加头文件

在main.c和usart.c中添加头文件#include "stdio.h"和#include "string.h"之后,勾选Target中的use MicroLIB,在mian.c文件中,添加如下代码,进行重定义:
在这里插入图片描述

int fputc(int ch, FILE *f)
 
{
 
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
 
  return ch;
 
}

在这里插入图片描述

2.2 设置两个字符型数组和FLAG

在main.c中添加#include "string.h"后设置两个字符型数组,用来存放需要判别的字符串。同时设置FLAG标志变量,来判断电脑向stm32发送了哪一个字符串。

uint8_t aRxBuffer;		//????
uint8_t Uart1_RxBuff[256]; //????
uint8_t str1[1] = "g";
uint8_t str2[1] = "s";
uint8_t start[20] = "start stm32!";
uint8_t stop[20] = "stop stm32!";
uint8_t Uart1_Rx_Cnt = 0;	//??????
uint8_t cAlmStr[] = "????\r\n";

unsigned int flag = 1;

在这里插入图片描述

2.3 在main函数中设置中断

2.3.1 函数原型
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

参数:

  • UART_HandleTypeDef *huart:UATR的别名
  • huart1 *pData:接收到的数据存放地址
  • Size:接收的字节数
2.3.2 功能
  • 串口中断接收,以中断方式接收指定长度数据。
  • 大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。
  • 接收到数据时,会触发串口中断。
  • 再然后,串口中断函数处理,直到接收到指定长度数据
  • 而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)
2.3.4 添加代码
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);

在这里插入图片描述

2.4 main函数中while添加代码

while (1)
{
	if(flag == 1){		
	  		printf("Hello windows!\r\n");
		}
	HAL_Delay(1000);
}

2.5 在main函数下面重写中断处理函数

main函数中添加以下代码:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(strcmp(Uart1_RxBuff, str1) == 0)
	{
			flag = 1;
			printf("start....\r\n");
		
	}
	if(strcmp(Uart1_RxBuff, str2) == 0)
	{
			flag = 0;
			printf("stop....\r\n");
		
	}
	if (strcmp(Uart1_RxBuff, go) == 0){
			flag = 1;
			printf("start....\r\n");
		
	}
	if (strcmp(Uart1_RxBuff, stop) == 0){
			flag = 0;
			printf("stop....\r\n");
		
	}
	if(Uart1_Rx_Cnt >= 255)  //溢出判断
	{
		Uart1_Rx_Cnt = 0;
		memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
		HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);	
	}
	else
	{
		Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存
	
		if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
		{
			Uart1_Rx_Cnt = 0;
			memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空数组
		}
	}
	
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断

}

只要头文件添加了string.h不用理会警告
在这里插入图片描述

三、烧录运行

在这里插入图片描述
打开串口后在数据发送区发送“stop stm32!”数据接收停止
发送“stat stm32!”数据接受开始
效果如下:
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值