【STM32Cube_07】使用USART发送和接收数据(中断模式)

寻求更好的阅读体验,请移步:Mculover666的个人博客

1. 准备工作

硬件准备

首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi):
在这里插入图片描述

软件准备

  • 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码;
  • 准备一个串口调试助手,这里我使用的是Serial Port Utility

Keil MDK和串口助手Serial Port Utility 的安装包都可以在文末关注公众号获取,回复关键字获取相应的安装包:

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
1. 在stm32cubemx中配置串口参数 首先,打开stm32cubemx软件,新建一个工程,选择需要使用的芯片型号,并进行初始化配置。 在Pinout & Configuration选项卡中,选择USART1,然后在右侧的Configuration栏中配置串口参数,如下图所示: ![image](https://user-images.githubusercontent.com/57706581/129364710-0b0ec9cd-7e6c-4e05-8d0c-6b7ee6e5c8b7.png) 其中,Baud Rate设置为115200,Data Bits为8,Stop Bits为1,Parity为None,Flow Control为None。 在Project Manager选项卡中,点击GENERATE CODE按钮生成代码。 2. 使用USART1串口,采用中断接收数据 在生成的代码中,找到main.c文件,在main函数中添加以下代码: ``` /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart1, RxData, 1); /* USER CODE END 2 */ ``` 这段代码的作用是启动USART1串口的中断接收功能,当接收到数据时,会触发中断,并执行中断处理函数。 在stm32cubeIDE中,中断处理函数的名称为USART1_IRQHandler,在stm32cubemx生成的代码中已经定义了该函数,我们只需要在该函数中添加处理接收数据的代码即可。 在USART1_IRQHandler函数中添加以下代码: ``` void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ if (__HAL_UART_GET_IT(&huart1, UART_IT_RXNE) != RESET) { uint8_t data; HAL_UART_Receive(&huart1, &data, 1, 0xFFFF); // 处理接收到的数据 } /* USER CODE END USART1_IRQn 1 */ } ``` 其中,__HAL_UART_GET_IT函数用于判断是否接收到了数据,如果接收到了数据,则调用HAL_UART_Receive函数接收数据,并进行处理。 3. 使用DMA方式发送数据stm32cubemx生成的代码中,已经默认启用了DMA方式发送数据,我们只需要在main函数中添加以下代码即可: ``` /* USER CODE BEGIN 4 */ uint8_t TxData[] = "Hello World!\r\n"; HAL_UART_Transmit_DMA(&huart1, TxData, sizeof(TxData)); /* USER CODE END 4 */ ``` 这段代码的作用是启动USART1串口的DMA发送功能,将TxData数组中的数据发送出去。 至此,我们已经完成了使用USART1串口,采用中断接收数据使用DMA方式发送数据的配置代码。完整代码如下: ``` #include "main.h" #include "stm32f1xx_hal.h" #include "usart.h" #include "gpio.h" uint8_t RxData[1]; void SystemClock_Config(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart1, RxData, 1); uint8_t TxData[] = "Hello World!\r\n"; HAL_UART_Transmit_DMA(&huart1, TxData, sizeof(TxData)); /* USER CODE END 2 */ while (1) { } } void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ if (__HAL_UART_GET_IT(&huart1, UART_IT_RXNE) != RESET) { uint8_t data; HAL_UART_Receive(&huart1, &data, 1, 0xFFFF); // 处理接收到的数据 } /* USER CODE END USART1_IRQn 1 */ } void Error_Handler(void) { } 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_MUL16; 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_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mculover666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值