STM32 HAL 串口收发

配置 STM32CuveMX

不做解释

关键函数讲解


中断接收数据

在初始化串口后开启中断

// 开启 空闲中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
// 中断接收数据
HAL_UART_Receive_IT(&huart1, rx_buffer, 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 */

  // 中断接收模式
  uint8_t tmp_flag = __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE); // 判断是否是空闲中断
  if ((tmp_flag != RESET))                                         // 判断空闲中断
  {
    __HAL_UART_CLEAR_IDLEFLAG(&huart1); // 清除空闲中断
  }
  // 中断接收模式
  if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
  {
    tmp_flag = (uint16_t)huart1.Instance->DR;
    huart1.Instance->DR = tmp_flag;
  }
  /* USER CODE END USART1_IRQn 1 */
}

发送数据

char run[] = ".";
HAL_UART_Transmit(&huart1, (uint8_t *)run, sizeof(run), 0xFFFF);

DMA收发

全局变量

uint8_t rx_buffer[100]; 

在初始化串口后开启中断

// 开启 空闲中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
// DMA接收数据
HAL_UART_Receive_DMA(&huart1, rx_buffer, 100);

在串口中断函数中添加

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 */
	
	uint8_t tmp_flag = __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE); // 获取IDLE状态
	if ((tmp_flag != RESET))                                         // 判断接收是否结束
	{
		 __HAL_UART_CLEAR_IDLEFLAG(&huart1); // 清楚标志位
		 HAL_UART_DMAStop(&huart1);
		 uint8_t temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
		 rx_len = 100 - temp;                               // 计算数据长度
		 HAL_UART_Transmit_DMA(&huart1, rx_buffer, rx_len); // 发送数据
		 HAL_UART_Receive_DMA(&huart1, rx_buffer, 100);     // 开启DMA
	}
 
  /* USER CODE END USART1_IRQn 1 */
}

发送数据

char run[] = ".";
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)run, sizeof(run));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值