当前位置: 首页 > news >正文

1、HAL库UART 中断|DMA 自动回显接收数据

1、实现代码:

stm32f4xx_hal_conf.h文件开启UART宏定义

#define HAL_UART_MODULE_ENABLED

添加stm32f4xx_hal_uart.c和stm32f4xx_hal_dma.c到自己工程;
编写好的代码:usart_Driver.c

/**********************************************************************
*file:串口驱动
*author:残梦
*date:2023.2.13
*note:
**********************************************************************/
#include "usart_Driver.h"#define UART1_BAUDRATE 2000000 //波特率
#define UART1_RX_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOA_CLK_ENABLE()
#define UART1_RX_GPIO_PORT              GPIOA
#define UART1_RX_GPIO_PIN               GPIO_PIN_10
#define UART1_RX_AF                     GPIO_AF7_USART1#define UART1_TX_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOA_CLK_ENABLE()
#define UART1_TX_GPIO_PORT              GPIOA
#define UART1_TX_GPIO_PIN               GPIO_PIN_9
#define UART1_TX_AF                     GPIO_AF7_USART1UART_HandleTypeDef huart1;#ifndef _UART1_RX_MODEDMA_HandleTypeDef hdma_usart1_rx;
#endif
uint8_t huart1_RxData[50] = {0};
/****************************************************
@function:串口1初始化
@param:void
@return:void
@date:2023.2.13
@note:
****************************************************/
void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = UART1_BAUDRATE;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if(HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}#ifdef _UART1_RX_MODEHAL_UART_Receive_IT(&huart1, huart1_RxData, sizeof(huart1_RxData));#elseHAL_UART_Receive_DMA(&huart1,huart1_RxData,sizeof(huart1_RxData));#endif
}/****************************************************
@function:串口1
@param:void
@return:void
@date:2023.2.13
@note:
****************************************************/
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_USART1_CLK_ENABLE();UART1_RX_GPIO_CLK_ENABLE();UART1_TX_GPIO_CLK_ENABLE();//外设引脚初始化GPIO_InitStruct.Pin = UART1_RX_GPIO_PIN;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = UART1_RX_AF;HAL_GPIO_Init(UART1_RX_GPIO_PORT, &GPIO_InitStruct);GPIO_InitStruct.Pin = UART1_TX_GPIO_PIN;GPIO_InitStruct.Alternate = UART1_TX_AF;HAL_GPIO_Init(UART1_TX_GPIO_PORT, &GPIO_InitStruct);#ifdef _UART1_RX_MODEHAL_NVIC_SetPriority(USART1_IRQn,1,0);HAL_NVIC_EnableIRQ(USART1_IRQn);#else__HAL_RCC_DMA2_CLK_ENABLE();hdma_usart1_rx.Instance = DMA2_Stream2;hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4;hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;hdma_usart1_rx.Init.Mode = DMA_CIRCULAR;hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;hdma_usart1_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_1QUARTERFULL;hdma_usart1_rx.Init.MemBurst = DMA_MBURST_SINGLE;hdma_usart1_rx.Init.PeriphBurst = DMA_PBURST_SINGLE;if(HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK){Error_Handler();}__HAL_LINKDMA(&huart1,hdmarx,hdma_usart1_rx);//关联DMA句柄HAL_NVIC_SetPriority(DMA2_Stream2_IRQn,0,0);HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);#endif
}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{HAL_UART_Transmit(&huart1,huart1_RxData,sizeof(huart1_RxData),10);//自收自发#ifdef _UART1_RX_MODEHAL_UART_Receive_IT(&huart1, huart1_RxData, sizeof(huart1_RxData));//中断方式接收则需开启,否则会导致接收完指定数据个数后自动关闭#endif
}

usart_Driver.h

#ifndef _usart_Driver_H_
#define _usart_Driver_H_
#include "Common_Driver.h"
//#define _UART1_RX_MODE //未定义--DMA方式接收,定义--中断接收方式extern UART_HandleTypeDef huart1;
extern void MX_USART1_UART_Init(void);#endif

在stm32f4xx_it.c文件中添加中断处理函数:

/* USER CODE BEGIN 1 */
#include "usart_driver.h"
#ifdef _UART1_RX_MODE
void USART1_IRQHandler(void)
{extern UART_HandleTypeDef huart1;HAL_UART_IRQHandler(&huart1);
}
#else
void DMA2_Stream2_IRQHandler(void)
{extern DMA_HandleTypeDef hdma_usart1_rx;HAL_DMA_IRQHandler(&hdma_usart1_rx);
}
#endif
/* USER CODE END 1 */
```c
/****************************************************
@function:串口重定义
@param:void
@return:void
@date:2023.2.14
@note:使用printf时需要此函数,并在Keil魔术棒中勾选User MicroLIB库
****************************************************/
int fputc(int ch,FILE *f)
{uint8_t data = ch;HAL_UART_Transmit(&huart1,&data,1,1);return(ch);
}

主函数调用MX_USART1_UART_Init();即可实现自收自发
在这里插入图片描述

2、电路推荐:CH340N

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、初始化处理框架 MX_USART1_UART_Init()

void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = UART1_BAUDRATE;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if(HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}#ifdef _UART1_RX_MODEHAL_UART_Receive_IT(&huart1, huart1_RxData, sizeof(huart1_RxData));#elseHAL_UART_Receive_DMA(&huart1,huart1_RxData,sizeof(huart1_RxData));#endif
}

OverSampling :过采样
8倍过采样速度更快,最高速度可达fPCLK/8,fPCLK为USART时钟;
16倍过采样速度虽然没有8倍过采样那么快,但得到的数据更加精准,其最大速度为fPCLK/16;

那么HAL_UART_Init()里面做了什么呢?

移除参数检查,提取主要后

HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
{if (huart->gState == HAL_UART_STATE_RESET){/* Allocate lock resource and initialize it */huart->Lock = HAL_UNLOCKED;/* Init the low level hardware : GPIO, CLOCK */HAL_UART_MspInit(huart);}huart->gState = HAL_UART_STATE_BUSY;/* Disable the peripheral */__HAL_UART_DISABLE(huart);/* Set the UART Communication parameters */UART_SetConfig(huart);/* In asynchronous mode, the following bits must be kept cleared:- LINEN and CLKEN bits in the USART_CR2 register,- SCEN, HDSEL and IREN  bits in the USART_CR3 register.*/CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN));/* Enable the peripheral */__HAL_UART_ENABLE(huart);/* Initialize the UART state */huart->ErrorCode = HAL_UART_ERROR_NONE;huart->gState = HAL_UART_STATE_READY;huart->RxState = HAL_UART_STATE_READY;return HAL_OK;
}

所以这个函数顺序则先通过函数HAL_UART_MspInit()初始化底层硬件:GPIO, CLOCK
再调用UART_SetConfig()设置时串口通信参数
__HAL_UART_ENABLE()启用外围设备

那么HAL_UART_MspInit()里面做了什么呢?

该函数主要是初始化底层硬件:GPIO、CLOCK、DMA、中断
开启DMA时需要关联句柄

__HAL_LINKDMA(&huart1,hdmarx,hdma_usart1_rx);//关联DMA句柄

为什么使用的是DMA2_Stream2 且通道4呢
在这里插入图片描述
可以看到USART1挂载在APB2上
在这里插入图片描述
在这里插入图片描述
由此知晓DMA使用的流和通道

启动中断|DMA去接收数据

中断接收函数:HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size)
1、使用此函数值得注意的是此函数
Size参数代表接收的数据个数,在接收完该个数后会自动关闭中断,导致后续数据不去接收了**
所以在接收到数据回调函数中需要再次调用此函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{HAL_UART_Transmit(&huart1,huart1_RxData,sizeof(huart1_RxData),10);//自收自发#ifdef _UART1_RX_MODEHAL_UART_Receive_IT(&huart1, huart1_RxData, sizeof(huart1_RxData));//中断方式接收则需开启,否则会导致接收完指定数据个数后自动关闭#endif
}

2、使用前需开启串口中断

    HAL_NVIC_SetPriority(USART1_IRQn,1,0);HAL_NVIC_EnableIRQ(USART1_IRQn);

**DMA中断接收函数:HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size)
1、使用前需要开启DMA中断并关联DMA句柄

    __HAL_LINKDMA(&huart1,hdmarx,hdma_usart1_rx);//关联DMA句柄HAL_NVIC_SetPriority(DMA2_Stream2_IRQn,0,0);HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);

中断函数调用HAL库处理函数中的处理

在stm32f4xx_it.c文件中添加中断处理函数:HAL_外设名_IRQHandler();
如HAL_UART_IRQHandler()或者HAL_DMA_IRQHandler();
注意:在HAL_UART_IRQHandler()函数中会调用函数:
函数中会在接收完指定数据个数后会执行的关闭中断(在使用函数HAL_UART_Receive_IT()时)

static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
{......省略if (--huart->RxXferCount == 0U)//此处就是在接收完指定数据个数后会执行的关闭中断{/* Disable the UART Data Register not empty Interrupt */__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);/* Disable the UART Parity Error Interrupt */__HAL_UART_DISABLE_IT(huart, UART_IT_PE);/* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */__HAL_UART_DISABLE_IT(huart, UART_IT_ERR);/* Rx process is completed, restore huart->RxState to Ready */huart->RxState = HAL_UART_STATE_READY;/* Check current reception Mode :If Reception till IDLE event has been selected : */if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE){......}else{/*Call legacy weak Rx complete callback*/HAL_UART_RxCpltCallback(huart);}}......省略
}

HAL_DMA_IRQHandler()函数可是不会去关闭的哈

4、CubeMx UART 中断接收回显数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
生成代码即可
在这里插入图片描述
1、main.h中包含stdio.h文件

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

2、usart.c中
定义接收数据区变量

/* USER CODE BEGIN 0 */
uint8_t huart1_RxData[50] = {0};
/* USER CODE END 0 */

MX_USART1_UART_Init()函数中添加数据中断接收函数:

  /* USER CODE BEGIN USART1_Init 2 */HAL_UART_Receive_IT(&huart1, huart1_RxData, sizeof(huart1_RxData));/* USER CODE END USART1_Init 2 */

添加回调函数并发送接收到的数据

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{HAL_UART_Transmit(&huart1,huart1_RxData,sizeof(huart1_RxData),10);//自收自发HAL_UART_Receive_IT(&huart1, huart1_RxData, sizeof(huart1_RxData));//中断方式接收则需开启,否则会导致接收完指定数据个数后自动关闭
}

编写串口重定义函数,方便使用printf()

/****************************************************
@function:串口重定义
@param:void
@return:void
@date:2023.2.14
@note:使用printf时需要此函数,并在Keil魔术棒中勾选User MicroLIB库
****************************************************/
int fputc(int ch,FILE *f)
{uint8_t data = ch;HAL_UART_Transmit(&huart1,&data,1,1);return(ch);
}

在这里插入图片描述
usart.c

/********************************************************************************* @file    usart.c* @brief   This file provides code for the configuration*          of the USART instances.******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2023 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************//* Includes ------------------------------------------------------------------*/
#include "usart.h"/* USER CODE BEGIN 0 */
uint8_t huart1_RxData[50] = {0};
/* USER CODE END 0 */UART_HandleTypeDef huart1;/* USART1 init function */void MX_USART1_UART_Init(void)
{/* USER CODE BEGIN USART1_Init 0 *//* USER CODE END USART1_Init 0 *//* USER CODE BEGIN USART1_Init 1 *//* USER CODE END USART1_Init 1 */huart1.Instance = USART1;huart1.Init.BaudRate = 2000000;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN USART1_Init 2 */HAL_UART_Receive_IT(&huart1, huart1_RxData, sizeof(huart1_RxData));/* USER CODE END USART1_Init 2 */}void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(uartHandle->Instance==USART1){/* USER CODE BEGIN USART1_MspInit 0 *//* USER CODE END USART1_MspInit 0 *//* USART1 clock enable */__HAL_RCC_USART1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**USART1 GPIO ConfigurationPA9     ------> USART1_TXPA10     ------> USART1_RX*/GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF7_USART1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USART1 interrupt Init */HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);HAL_NVIC_EnableIRQ(USART1_IRQn);/* USER CODE BEGIN USART1_MspInit 1 *//* USER CODE END USART1_MspInit 1 */}
}void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{if(uartHandle->Instance==USART1){/* USER CODE BEGIN USART1_MspDeInit 0 *//* USER CODE END USART1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_USART1_CLK_DISABLE();/**USART1 GPIO ConfigurationPA9     ------> USART1_TXPA10     ------> USART1_RX*/HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);/* USART1 interrupt Deinit */HAL_NVIC_DisableIRQ(USART1_IRQn);/* USER CODE BEGIN USART1_MspDeInit 1 *//* USER CODE END USART1_MspDeInit 1 */}
}/* USER CODE BEGIN 1 */
/****************************************************
@function:串口重定义
@param:void
@return:void
@date:2023.2.14
@note:使用printf时需要此函数,并在Keil魔术棒中勾选User MicroLIB库
****************************************************/
int fputc(int ch,FILE *f)
{uint8_t data = ch;HAL_UART_Transmit(&huart1,&data,1,1);return(ch);
}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{HAL_UART_Transmit(&huart1,huart1_RxData,sizeof(huart1_RxData),10);//自收自发HAL_UART_Receive_IT(&huart1, huart1_RxData, sizeof(huart1_RxData));//中断方式接收则需开启,否则会导致接收完指定数据个数后自动关闭
}/* USER CODE END 1 *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

UART 中断接收完整工程:
链接:https://pan.baidu.com/s/1p34JFrjOUl2_IsnvZBSn0w
提取码:au2o

## 5、CubeMx UART DMA中断接收回显数据

注意:除了USART1外其他配置和CubeMx UART 中断接收回显数据一样
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
产生工程代码
1、usart.c中
定义接收数据区变量

/* USER CODE BEGIN 0 */
uint8_t huart1_RxData[50] = {0};
/* USER CODE END 0 */

MX_USART1_UART_Init()函数中添加数据DMA中断接收函数:

  /* USER CODE BEGIN USART1_Init 2 */HAL_UART_Receive_DMA(&huart1,huart1_RxData,sizeof(huart1_RxData));/* USER CODE END USART1_Init 2 */

添加回调函数并发送接收到的数据

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{HAL_UART_Transmit(&huart1,huart1_RxData,sizeof(huart1_RxData),10);//自收自发
}

在这里插入图片描述
usart.c

/********************************************************************************* @file    usart.c* @brief   This file provides code for the configuration*          of the USART instances.******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2023 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************//* Includes ------------------------------------------------------------------*/
#include "usart.h"/* USER CODE BEGIN 0 */
uint8_t huart1_RxData[50] = {0};
/* USER CODE END 0 */UART_HandleTypeDef huart1;
DMA_HandleTypeDef hdma_usart1_rx;/* USART1 init function */void MX_USART1_UART_Init(void)
{/* USER CODE BEGIN USART1_Init 0 *//* USER CODE END USART1_Init 0 *//* USER CODE BEGIN USART1_Init 1 *//* USER CODE END USART1_Init 1 */huart1.Instance = USART1;huart1.Init.BaudRate = 2000000;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN USART1_Init 2 */HAL_UART_Receive_DMA(&huart1,huart1_RxData,sizeof(huart1_RxData));/* USER CODE END USART1_Init 2 */}void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(uartHandle->Instance==USART1){/* USER CODE BEGIN USART1_MspInit 0 *//* USER CODE END USART1_MspInit 0 *//* USART1 clock enable */__HAL_RCC_USART1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**USART1 GPIO ConfigurationPA9     ------> USART1_TXPA10     ------> USART1_RX*/GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF7_USART1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USART1 DMA Init *//* USART1_RX Init */hdma_usart1_rx.Instance = DMA2_Stream2;hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4;hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;hdma_usart1_rx.Init.Mode = DMA_CIRCULAR;hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK){Error_Handler();}__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx);/* USER CODE BEGIN USART1_MspInit 1 *//* USER CODE END USART1_MspInit 1 */}
}void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{if(uartHandle->Instance==USART1){/* USER CODE BEGIN USART1_MspDeInit 0 *//* USER CODE END USART1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_USART1_CLK_DISABLE();/**USART1 GPIO ConfigurationPA9     ------> USART1_TXPA10     ------> USART1_RX*/HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);/* USART1 DMA DeInit */HAL_DMA_DeInit(uartHandle->hdmarx);/* USER CODE BEGIN USART1_MspDeInit 1 *//* USER CODE END USART1_MspDeInit 1 */}
}/* USER CODE BEGIN 1 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{HAL_UART_Transmit(&huart1,huart1_RxData,sizeof(huart1_RxData),10);//自收自发
}
/* USER CODE END 1 *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

UART DMA接收完整工程:
链接:https://pan.baidu.com/s/15aVMAqIVg8DrLjlPVGY5ag
提取码:3nmu

http://www.lryc.cn/news/8338.html

相关文章:

  • NPOI - ConditionalFormattingRule
  • JavaのString类这一篇就够了(包含StringBuffer_Builder)
  • C# dataGridView 导出表格 xls NPOI 2.4.1 版本
  • 秒杀项目的消息推送
  • 最近开发及 vue3 几个小总结
  • 代谢组学分享-花青素通过调节氨基酸代谢改善糖尿病肾病的肾功能
  • 超简单!pytorch入门教程:Tensor
  • 如何使用COCO数据集,注意事项
  • 金三银四跳槽季,JAVA面试撸题就来【笑小枫】微信小程序吧~
  • 分享115个HTML电子商务模板,总有一款适合您
  • Python 字符串
  • 总线定义,车载总线:车载etherNet or CAN
  • Python(for和while)循环嵌套及用法
  • 6万字电力行业系统解决方案光伏电站综合安防系统解决方案
  • [Android Studio]Android 数据存储--SQLite数据库存储
  • 学校节能降耗减排方案——能耗监管平台的建设及效果剖析
  • 探索IP地址的应用
  • 点赞破万!阿里面试官总结的2022最新1685页Java面试宝典太全了
  • 项目搭建规范
  • 8.Docker Machine
  • 如何配合使用ESLINT 和 PRETTIER
  • 学英语的优势已来,抓住这个机会
  • 基于微信小程序云开发实现考研题库小程序项目(完整版)
  • AI一点通:使用 ColumnTransformer 转换 Pandas DataFrame 的一个或多个列
  • 【C语言】全局变量、局部变量和静态变量的区别
  • 血氧仪「上潜」,智能穿戴「下沉」
  • CPP2022-计算机类-期末考试
  • 【蓝桥集训】第二天——差分
  • Spring Boot最核心的27个注解,你了解多少?
  • css3弹性盒子