首先感谢网上的小伙伴,这篇文章记录下浏览量过6W,再学习道路上继续努力加油!小编调试串口功能发现普通方式非常暂用时间,在此记录一下串口DMA方式加串口空闲中断方式收发数据;

1、cubemx配置:串口1的DMA方式,修改中断优先级,串口DMA发送一次不需要循环发送,串口宽度Byte;

CUBEMX配置iic cubemx配置串口中断_STM32

CUBEMX配置iic cubemx配置串口中断_CUBEMX配置iic_02

CUBEMX配置iic cubemx配置串口中断_数据_03

CUBEMX配置iic cubemx配置串口中断_串口_04

CUBEMX配置iic cubemx配置串口中断_数组_05

 

二、源码:

CUBEMX配置iic cubemx配置串口中断_数据_06

CUBEMX配置iic cubemx配置串口中断_CUBEMX配置iic_07

CUBEMX配置iic cubemx配置串口中断_CUBEMX配置iic_08

CUBEMX配置iic cubemx配置串口中断_数组_09

CUBEMX配置iic cubemx配置串口中断_数组_10

 

CUBEMX配置iic cubemx配置串口中断_数组_11

CUBEMX配置iic cubemx配置串口中断_STM32_12

 

文件main.c中:

/* USER CODE BEGIN Includes */

#include <stdio.h>						//uart redirect fputc
#include <string.h>						//copy function
#include <stdarg.h>						//va_start /vsnprintf /va_end function

/* USER CODE END Includes */


/* USER CODE BEGIN 0 */

#define	ON	1
#define	OFF	0
#define	UART_DEBUG	&huart1			//调试串口
#define	BUFFER_SIZE	256					//串口DMA发送接收数组大小
typedef	union
{
	unsigned int interface;
	struct
	{	
		uint8_t rx_buffer[BUFFER_SIZE];  	 	//接收数据数组
		uint8_t tx_buffer[BUFFER_SIZE];  	 	//发送数据数组
		uint8_t uart_buffer[BUFFER_SIZE];  	//接收数据缓存数组
		uint8_t recive_count;							 	//接收计数
		unsigned char interrupt_idle	:1;		//空闲中断标志
		
	}bits;
}UART_MDADAT;

UART_MDADAT	uartDMA_data;


/******************************************************************************************
*** 函数名称: Debug_Printf
*** 输入参数: 无
*** 返 回 值: 无
*** 说    明:串口1中断回调函数
*** 功能说明:
***	编者										时间										版本
***	WL											2020/12/17						 V0.1
******************************************************************************************/
void user_uart1IT_ReceiveCallback(void)
{
	uint8_t temp;
	if((__HAL_UART_GET_FLAG(UART_DEBUG, UART_FLAG_IDLE) != RESET))  //获取IDLE标志位,idle标志被置位
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);														//清除空闲中断标志位
		HAL_UART_DMAStop(UART_DEBUG);																	//停止串口DMA功能
		
		temp = huart1.hdmarx->Instance->CNDTR;												//得到当前还剩余多少个数据 
		uartDMA_data.bits.recive_count = BUFFER_SIZE - temp;					//接收数据计数
		
		uartDMA_data.bits.interrupt_idle = ON;												// 接受完成标志位置1	
		
	}
}


/******************************************************************************************
*** 函数名称: Debug_Printf
*** 输入参数: 无
*** 返 回 值: 无
*** 说    明:自定义串口 printf功能
*** 功能说明:
1、sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据。
2、strlen只关心存储的数据内容,不关心空间的大小和类型。
3、串口DMA方式打印的数组需要保留,DMA直接操作的是内存,如果DMA未打印完成就清空数组会出现数据打印不完整的情况

***	编者										时间										版本
***	WL											2020/12/8								V0.1
******************************************************************************************/
void Debug_Printf(UART_HandleTypeDef *huart, char *format, ...)
{
	va_list ap;
	
	va_start(ap, format);																			//初始化 ap 变量
	vsnprintf((char *)uartDMA_data.bits.tx_buffer, sizeof(uartDMA_data.bits.tx_buffer), format, ap);		//可变参数。用于向字符串中打印数据、数据格式用户自定义
	va_end(ap);																								//允许使用了 va_start 宏的带有可变参数的函数返回
	
	HAL_UART_Transmit_DMA(UART_DEBUG, (uint8_t *)uartDMA_data.bits.tx_buffer, strlen((char *)uartDMA_data.bits.tx_buffer));	//打印数据
	
}


/* USER CODE END 0 */


int main(void)
{
    //中间配置省略。。。。。。。

  /* USER CODE BEGIN 2 */

	__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
	HAL_UART_Receive_DMA(&huart1, uartDMA_data.bits.rx_buffer, BUFFER_SIZE);
	
  /* USER CODE END 2 */


  while (1)
  {
	
		
		if(uartDMA_data.bits.interrupt_idle == ON)		//有空闲中断
		{
			uartDMA_data.bits.interrupt_idle = OFF;
			
			memset(uartDMA_data.bits.uart_buffer, 0, sizeof(uartDMA_data.bits.uart_buffer));																						//清除缓存数据数组
			memcpy(uartDMA_data.bits.uart_buffer, uartDMA_data.bits.rx_buffer, strlen((char *)uartDMA_data.bits.rx_buffer));						//取出数据
			memset(uartDMA_data.bits.rx_buffer, 0, sizeof(uartDMA_data.bits.rx_buffer));																								//清空数组
			HAL_UART_Receive_DMA(UART_DEBUG, uartDMA_data.bits.rx_buffer, sizeof(uartDMA_data.bits.rx_buffer));													//重新启动串口DMA功能
			
			Debug_Printf(UART_DEBUG, "\r\n*******************************串口 DMA方式接收打印如下 *****************************\r\n "); 	HAL_Delay(100);
			
			Debug_Printf(UART_DEBUG, "\r\n HAL_UART_Transmit_DMA 库函数打印\t:"); 	HAL_Delay(100);
			HAL_UART_Transmit_DMA(UART_DEBUG, (uint8_t *)uartDMA_data.bits.uart_buffer, strlen((char *)uartDMA_data.bits.uart_buffer));	//打印接收到的数据
			HAL_Delay(100);
			Debug_Printf(UART_DEBUG, "\r\nDebug_Printf函数打印数组\t\t:"); 					HAL_Delay(100);
			Debug_Printf(UART_DEBUG, (char *)uartDMA_data.bits.uart_buffer);	
			HAL_Delay(100);
			Debug_Printf(UART_DEBUG, "\r\nDebug_Printf函数打印字符\t\t:"); 					HAL_Delay(100);
			Debug_Printf(UART_DEBUG, "uart MDA Debug printf function");
			HAL_Delay(100);
			Debug_Printf(UART_DEBUG, "\r\nDebug_Printf函数打印串口接收计数值\t:"); 					HAL_Delay(100);
			Debug_Printf(UART_DEBUG, "recive_count: %d\r\n", uartDMA_data.bits.recive_count);
			
		}
		
		
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
}

stm32f1xx_it.c代码:

void USART1_IRQHandler(void)
{
    //省略。。。。。
	user_uart1IT_ReceiveCallback();
	
}

三、功能验证:

CUBEMX配置iic cubemx配置串口中断_数组_13

 

 

 

链接:https://pan.baidu.com/s/1Byt51Ux7JX_snSXXf6PJEQ 
提取码:k3xf