stm32使用cubumx配置串口不定长接收

前言

此方法利用stm32的uart+dma来实现不定长接收,利用dma中的空闲中断。

设置USART1 为异步通信方式 使能串口1全部中断

设置USART1_RX的DMA中断接收 

速度设置最大(其实用115200没有影响 但为保证工程严谨性)

检查中断优先级 这两个中断是否开启  

生成代码后 

引入头文件

#include "stdio.h"
#include "string.h"

创建变量缓存和引用外部DMA的结构体

extern DMA_HandleTypeDef hdma_usart1_rx;
#define RX_MAXBUFF 64 //接收数组缓存最大值 64
uint8_t rx_buf[RX_MAXBUFF]; //接收缓存
uint8_t rx_sta=0; //接收状态 1:有数据   0:无数据
uint8_t rx_size=0; //接收数据大小

在main函数中 “MX_USART1_UART_Init();”后面加上使能DMA空闲中断和关闭DMA_IT_HT标志位

  MX_USART1_UART_Init(); ///这句由自动生成
  /* USER CODE BEGIN 2 */
		HAL_UARTEx_ReceiveToIdle_DMA(&huart1,rx_buf,RX_MAXBUFF*2);
	__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);

while循环中用来打印显示收到的数据

 while (1)
  {
		if(rx_sta == 1)
		{
			rx_sta = 0;
			
			if(rx_size < 64)
				printf("rx_size:%d ;rx_buff:%s \r\n",rx_size,rx_buf);
			else
				printf("rxbuff_overflow!!\r\n");
			
			memset(rx_buf,0,RX_MAXBUFF);	
		}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

串口中断函数

/* USER CODE BEGIN 4 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if(huart->Instance == USART1)
	{
		rx_sta = 1;
		rx_size = Size;
		HAL_UARTEx_ReceiveToIdle_DMA(&huart1,rx_buf,RX_MAXBUFF*2);
	}
}

printf打印函数 同时使MicroLIB库

int fputc(int ch,FILE *f)
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,100);
	return ch;
}

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值