STM32CubeMX UART1_DMA接收不定长度信息

STM32CubeMX UART1_DMA接收不定长度信息


前言

记录自己学习的过程


一、CubeMX配置

1.开启usart1,默认配置即可
在这里插入图片描述
2.设置usart1_Tx的DMA
在这里插入图片描述
3.设置usart1_Rx的DMA
在这里插入图片描述
注意:USART_Rx要设置成上拉模式
为什么?
为了减少误进入串口空闲中断
具体介绍可以参考这篇文章
在这里插入图片描述

4.设置usart1中断
在这里插入图片描述

二、Keil代码

1.main.c

__IO uint8_t uart_dma_recbuf[255] = {0};//串口接收缓冲区

int main(void)
{
	__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);//使能串UART2 IDLE中断
	HAL_UART_Receive_DMA(&huart1,(uint8_t *)uart_dma_recbuf, 255);//开启USART1的DMA接收
	while(1)
	{
	
	}
}

2.stm32f4xx_it.c

#include <stdio.h>
#include <string.h>

extern __IO uint8_t uart_dma_recbuf[255];

void USART1_IRQHandler(void)//串口的中断函数
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	uint8_t tmp_flag = 0;
	uint8_t temp = 0;
	tmp_flag = __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE);
	if(tmp_flag != RESET)//IDLE标志被置位
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
		HAL_UART_DMAStop(&huart1);//关闭串口的DMA
		temp = 255 - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);//接收的字节 = 总字节 - 剩余的字节
		HAL_UART_Transmit_DMA(&huart1,(uint8_t *)uart_dma_recbuf,temp);//将接收到的数据发出去
		// memcpy(buff, (char *)uart_dma_recbuf,temp );
		HAL_UART_Receive_DMA(&huart1,(uint8_t *)uart_dma_recbuf, 255);//因为上面关闭了串口的DMA,所以要重新开启DMA接收
	}
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

3.效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值