使用STM32CUBE MX创建STM32F407工程 串口DMA加空闲中断任意长度收发

使用STM32CUBE MX创建STM32F407工程 串口DMA加空闲中断任意长度收发

一、使用平台

    STM32F407VET6

    KEIL 5 5.25

    STM32CUBE MX 4.25

 使用STM32CUBE MX创建STM32F407工程 串口DMA加空闲中断任意长度收发_第1张图片使用STM32CUBE MX创建STM32F407工程 串口DMA加空闲中断任意长度收发_第2张图片

二、配置

    LED连接在单片机PB9,串口使用UART1,PA9,PA10。

1.打开stm32cube,新建工程

使用STM32CUBE MX创建STM32F407工程 串口DMA加空闲中断任意长度收发_第3张图片

    使用STM32CUBE MX创建STM32F407工程 串口DMA加空闲中断任意长度收发_第4张图片

使能外部晶振,串口,LED(GPIOB,9).

2.配置时钟树

使用STM32CUBE MX创建STM32F407工程 串口DMA加空闲中断任意长度收发_第5张图片

3.详细配置

1.串口参数配置:

使用STM32CUBE MX创建STM32F407工程 串口DMA加空闲中断任意长度收发_第6张图片

串口使用DMA,大大节省CPU开支。

使用STM32CUBE MX创建STM32F407工程 串口DMA加空闲中断任意长度收发_第7张图片

配置中断优先级:

使用STM32CUBE MX创建STM32F407工程 串口DMA加空闲中断任意长度收发_第8张图片

配置LED -pin

使用STM32CUBE MX创建STM32F407工程 串口DMA加空闲中断任意长度收发_第9张图片

2.配置输出工程

使用STM32CUBE MX创建STM32F407工程 串口DMA加空闲中断任意长度收发_第10张图片

使用STM32CUBE MX创建STM32F407工程 串口DMA加空闲中断任意长度收发_第11张图片

三、代码修改

1.

uart.h

头文件中添加UART结构体:

/* USER CODE BEGIN Private defines */
#define RX_LEN 1024  
	 
typedef struct  
{  
uint8_t  RX_flag:1;        //IDLE receive flag
uint16_t RX_Size;          //receive length
uint8_t  RX_pData[RX_LEN]; //DMA receive buffer
}USART_RECEIVETYPE;  
   
extern USART_RECEIVETYPE UsartType; 
/* USER CODE END Private defines */

uart.c

/* USER CODE BEGIN 0 */
USART_RECEIVETYPE UsartType; 
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */

void UsartReceive_IDLE(UART_HandleTypeDef *huart)  
{  
    uint32_t temp;  
  
    if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))  
    {   
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);  
        HAL_UART_DMAStop(&huart1);  
        temp = huart1.hdmarx->Instance->NDTR;  
        UsartType.RX_Size =  RX_LEN - temp;   
        UsartType.RX_flag=1;  
        HAL_UART_Receive_DMA(&huart1,UsartType.RX_pData,RX_LEN);  
    }  
} 
/* USER CODE END 1 */

在main函数中的while(1)之前添加串口DMA使能函数,开启串口空闲中断。

在主循环中添加FLAG检测,如果使用RTOS,则在进程中检测。

  /* USER CODE BEGIN 2 */
	
	HAL_UART_Receive_DMA(&huart1, UsartType.RX_pData, RX_LEN);  
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); 
	
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

	if(UsartType.RX_flag)    	// Receive flag
		{  
			UsartType.RX_flag=0;	// clean flag
			HAL_UART_Transmit_DMA(&huart1, UsartType.RX_pData, UsartType.RX_Size);
		} 
  }
  /* USER CODE END 3 */

最后别忘了  一定要在串口中断中调用串口空闲中断回调函数。

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	UsartReceive_IDLE(&huart1); 
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

OK,大功告成!!!!

工程下载地址:https://download.csdn.net/download/medojonh/10381613

你可能感兴趣的:(stm32)