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地线,文件传输是否还能正常工作?
如果不接电源和地,肯定不能正常工作。
三、总结
本次实验实现了计算机之间的串口通信 ,通过串口助手观察到两台计算机之间可以通过串口进行文件传输,但传输时间与文件大小有关,文件越大,传输时间越长,传输后的格式需要自定义打开方式打开。
作者:口腔溃疡杀手