STM32CubeIDE(串口)

目录

一、轮询模式

[1.1 配置USART2为异步模式](#1.1 配置USART2为异步模式)

[1.2 500ms发送一次消息](#1.2 500ms发送一次消息)

[1.3 通信结果](#1.3 通信结果)

[1.4 串口控制LED](#1.4 串口控制LED)

二、中断收发

[2.1 开启中断](#2.1 开启中断)

[2.2 中断发送接收](#2.2 中断发送接收)

[2.2.1 中断发送只需要调用接口](#2.2.1 中断发送只需要调用接口)

[2.2.2 中断接收](#2.2.2 中断接收)

[2.3 实验结果](#2.3 实验结果)

三、DMA模式与收发不定长数据

[3.1 DMA通道配置](#3.1 DMA通道配置)

[3.2 DMA发送接收函数](#3.2 DMA发送接收函数)

[3.3 使用空闲中断接收不定长数据](#3.3 使用空闲中断接收不定长数据)


一、轮询模式

1.1 配置USART2为异步模式

1.2 500ms发送一次消息

1.3 通信结果

1.4 串口控制LED

cpp 复制代码
  uint8_t reciveDate[2];
  while (1)
  {
	  HAL_UART_Receive(&huart1, reciveDate, 2, HAL_MAX_DELAY);
	  HAL_UART_Transmit(&huart1, reciveDate, 2, 100);
	  GPIO_PinState state=GPIO_PIN_SET;
	  if(reciveDate[1]=='1')
	  {
		  state=GPIO_PIN_RESET;
	  }
	  if(reciveDate[0]=='R')
	  {
		  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, state);
	  }
	  else if(reciveDate[0]=='G')
	  {
		  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, state);
	  }
  }
}

二、中断收发

2.1 开启中断

2.2 中断发送接收

2.2.1 中断发送只需要调用接口

cpp 复制代码
HAL_UART_Transmit_IT(&huart1, reciveDate, 2);

2.2.2 中断接收

①在程序起始开启中断

②重新定义stm32f1xx_hal_uart.c中的函数

cpp 复制代码
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function should not be modified, when the callback is needed,
           the HAL_UART_RxCpltCallback could be implemented in the user file
   */
}
cpp 复制代码
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Transmit_IT(&huart1, reciveDate, 2);
	GPIO_PinState state = GPIO_PIN_SET;

	if (reciveDate[1] == '1')
	{
		state = GPIO_PIN_RESET;
	}
	if (reciveDate[0] == 'G')
	{
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, state);
	}
	HAL_UART_Receive_IT(&huart1, reciveDate, 2);//再次启动中断接收
}

2.3 实验结果

三、DMA模式与收发不定长数据

3.1 DMA通道配置

3.2 DMA发送接收函数

只需要将_IT修改为_DMA即可,DMA模式还是有中断参与其中

cpp 复制代码
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Transmit_DMA(&huart1, reciveDate, 2);//dma发送
	GPIO_PinState state = GPIO_PIN_SET;

	if (reciveDate[1] == '1')
	{
		state = GPIO_PIN_RESET;
	}
	if (reciveDate[0] == 'G')
	{
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, state);
	}
	HAL_UART_Receive_DMA(&huart1, reciveDate, 2);//DMA接收
}

3.3 使用空闲中断接收不定长数据

只有当接收端不再有数据输入时才会触发空闲中断,重新定义

cpp 复制代码
__weak void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  UNUSED(Size);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_UARTEx_RxEventCallback can be implemented in the user file.
   */
}
cpp 复制代码
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if(huart==&huart1)
	{
		HAL_UART_Transmit_DMA(&huart1, reciveDate, Size);//发�?�与接收相同的Size长度的字节数

		HAL_UARTEx_ReceiveToIdle_DMA(&huart1, reciveDate, sizeof(reciveDate));//接收不定长数�?
	}
}
相关推荐
电鱼智能的电小鱼1 小时前
基于电鱼 ARM 边缘网关的智慧工地数据可靠传输方案——断点续传 + 4G/5G冗余通信,保障数据完整上传
arm开发·人工智能·嵌入式硬件·深度学习·5g·机器学习
范纹杉想快点毕业1 小时前
12个月嵌入式进阶计划ZYNQ 系列芯片嵌入式与硬件系统知识学习全计划(基于国内视频资源)
c语言·arm开发·单片机·嵌入式硬件·学习·fpga开发·音视频
NEU-UUN2 小时前
1.2.STM32简介——全程手敲板书
stm32·单片机·嵌入式硬件
三佛科技-134163842122 小时前
全自动削皮机方案,果蔬去皮机/削皮机MCU控制方案开发设计
单片机·嵌入式硬件
应用市场2 小时前
基于STM32的多模态智能门锁系统设计与实现
stm32·单片机·嵌入式硬件
xiaohai@Linux2 小时前
STM32在LVGL上实现移植FatFs文件系统(保姆级详细教程)
stm32·单片机·嵌入式硬件·lvgl·fatfs
Jerry丶Li2 小时前
二十二、STM32的ADC(二)(ADC单通道)
stm32·单片机·嵌入式硬件
飞睿科技2 小时前
超越蓝牙与Wi-Fi,UWB技术如何解锁手机下一波创新浪潮?
嵌入式硬件·物联网·智能手机·uwb
点灯小铭2 小时前
基于单片机的交流功率测量仪设计与实现
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
星辰pid4 小时前
STM32基于OLED的多级菜单(控制步进/无刷电机/舵机,含FLASH存储数据掉电不丢失)
stm32·单片机·嵌入式硬件