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

目录

串口通信

一、通过STM32CubeMX配置项目

1、设置RCC

2、设置SYS

3、设置NVIC

4、设置USART

5、clock配置

6、project配置

7、code配置

8、创建程序打开keil,点击上图中右上角GENERATE CODE,选择open project。

二、在keil中编写代码

1.打开通过STM32CubeMX生成的代码

2.这里我直接贴出代码,大家根据自己的要求和需要修改即可

3.编译操作

4.烧录

三、成果展示

1、输入*号,一直发送hello Windows

2、输入#号停止发送

3、再次输入*号重新开始

四、仿真

五、总结

串口传输

一、实验要求:

二、实验过程:

1、首先我们需要两台电脑,下载相同的串口程序并用于发送和接收文件。

2、将两个线用杜邦线正确连接,这里我将TXD连接RXD,RXD连接TXD,5V连接5V,GND连接GND。如图所示:

3、发送界面

4、接收界面

5、接收图片记得更改格式为.jpg,这里我是更改之后的界面,可以在接收到的文件属性中更改

6、接收图片

思考:

1、预估文件大小、波特率和传输时间三者之间的关系,并对比实际传输时间。

2、如果只接TX–RX, RX–TX 这样两根线,不接电源线或者不接GND地线,文件传输是否还能正常工作?

三、总结


串口通信

一、通过STM32CubeMX配置项目

1、设置RCC

2、设置SYS

3、设置NVIC

4、设置USART

这里直接选择USART1

5、clock配置

6、project配置

7、code配置

8、创建程序打开keil,点击上图中右上角GENERATE CODE,选择open project。

(具体步骤可以参考我的上一篇博客,除了USART,SYY,RCC,NVIC。其他配置方法都相类似)

二、在keil中编写代码

1.打开通过STM32CubeMX生成的代码

2.这里我直接贴出代码,大家根据自己的要求和需要修改即可

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"
char c;//?? 0:??  1:??
char message[]="hello Windows\n";//????
char tips[]="CommandError\n";//??1
char tips1[]="Start.....\n";//??2
char tips2[]="Stop......\n";//??3
int flag=0;//?? 0:???? 1.????



/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

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

  /* USER CODE BEGIN 1 */
HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
	
	//??????
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  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 */
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
if(flag==1){
			//????
			HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF); 
			
			//??
			HAL_Delay(1000);
		}

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	
	//???????0?,???????flag
	if(c=='#'){
		flag=0;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); 
	}
	
	//???????1?,???????flag
	else if(c=='*'){
		flag=1;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); 
	}
	
	//?????????,???????flag
	else {
		flag=0;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF); 
	}

	//??????
		HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);  
}
/**
  * @brief System Clock Configuration
  * @retval None
  */

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

简单解释一下:首先我们在main前定义了全局变量,便于我们接下来的操作和观察,比较重要的部分是我们设置了两个符号为标志#和*。当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送;

3.编译操作

点击开始编译,没有错误信息就可以开始下一步了

4.烧录

这里要点开三个点的符号,选择我们编译生成的hex文件,进行烧录

我使用的烧录软件

通过百度网盘分享的文件:FlyMcu.exe
链接:https://pan.baidu.com/s/1EaGSTZq0IxiQyP_rnpOnEA 
提取码:amr2

烧录成功如图所示

三、成果展示

我用的串口软件

通过百度网盘分享的文件:串口调试助手.exe
链接:https://pan.baidu.com/s/1FwTnFah5Pt-_Xvb4iE_-LA 
提取码:6arw

1、输入*号,一直发送hello Windows

2、输入#号停止发送

3、再次输入*号重新开始

四、仿真

五、总结

本次串口通信项目借助 STM32CubeMX 配置与 Keil 编程,以特定指令控制 STM32 与上位机串口通信,实现数据交互功能并展示效果,涵盖从配置到成果呈现的完整流程与要点总结。让我学习并且掌握了串口通信的方法以及特点,对以后的学习具有极大的帮助。

串口传输

一、实验要求:

将两台笔记本电脑,借助 USB/TTL转RS232 模块和杜邦线,建立起串口连接。然后用串口助手等工具软件(如sscom,带文件传输功能)将一台笔记本上的一个大文件(图片、视频和压缩包软件)传输到另外一台电脑。

二、实验过程:

1、首先我们需要两台电脑,下载相同的串口程序并用于发送和接收文件。

我用的用于串口传输的程序:

通过百度网盘分享的文件:sscom5.13.1.exe
链接:https://pan.baidu.com/s/11AeIamxDDOqm3JRVDcdejA 
提取码:iafx

2、将两个线用杜邦线正确连接,这里我将TXD连接RXD,RXD连接TXD,5V连接5V,GND连接GND。如图所示:

3、发送界面

4、接收界面

5、接收图片记得更改格式为.jpg,这里我是更改之后的界面,可以在接收到的文件属性中更改

6、接收图片

思考:

1、预估文件大小、波特率和传输时间三者之间的关系,并对比实际传输时间。

根据文件大小,理论时间=(文件大小*8)/波特率

但实际的时间比理论时间长,推测应该是传输过程中加入了时延,或者是过程中出现了一些错误而导致的

2、如果只接TX–RX, RX–TX 这样两根线,不接电源线或者不接GND地线,文件传输是否还能正常工作?

如果不接电源和地,肯定不能正常工作。

三、总结

本次实验实现了计算机之间的串口通信 ,通过串口助手观察到两台计算机之间可以通过串口进行文件传输,但传输时间与文件大小有关,文件越大,传输时间越长,传输后的格式需要自定义打开方式打开。

作者:口腔溃疡杀手

物联沃分享整理
物联沃-IOTWORD物联网 » STM32利用HAL库中断方式进行串口通信

发表回复