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

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

一、CubeMX配置项目

1.1 SYS配置

cubemx dma 空闲 串口中断 hal串口空闲中断_c语言

1.2 RCC配置

cubemx dma 空闲 串口中断 hal串口空闲中断_c语言_02

1.3 USART设置

cubemx dma 空闲 串口中断 hal串口空闲中断_c语言_03

1.4 NVIC配置

cubemx dma 空闲 串口中断 hal串口空闲中断_单片机_04

1.5时钟配置

cubemx dma 空闲 串口中断 hal串口空闲中断_单片机_05

1.6 项目创建

cubemx dma 空闲 串口中断 hal串口空闲中断_单片机_06


cubemx dma 空闲 串口中断 hal串口空闲中断_c语言_07

二、Keil编写代码

2.1添加头文件

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

cubemx dma 空闲 串口中断 hal串口空闲中断_cubemx dma 空闲 串口中断_08

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

cubemx dma 空闲 串口中断 hal串口空闲中断_c语言_09

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;

cubemx dma 空闲 串口中断 hal串口空闲中断_stm32_10

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

cubemx dma 空闲 串口中断 hal串口空闲中断_c语言_11

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不用理会警告

cubemx dma 空闲 串口中断 hal串口空闲中断_cubemx dma 空闲 串口中断_12

三、烧录运行

cubemx dma 空闲 串口中断 hal串口空闲中断_cubemx dma 空闲 串口中断_13


打开串口后在数据发送区发送“stop stm32!”数据接收停止

发送“stat stm32!”数据接受开始

效果如下:

cubemx dma 空闲 串口中断 hal串口空闲中断_cubemx dma 空闲 串口中断_14



cubemx dma 空闲 串口中断 hal串口空闲中断_单片机_15