蓝桥杯物联网STM32 学习记录8——外设实验2.6:USART2的DMA中断与回调

本文介绍了STM32中如何配置DMA和UART进行串口通信,通过回调函数实现数据接收完成后的处理。在主循环中,当接收到特定结束符时,发送确认信息。同时,回调函数`HAL_UART_RxCpltCallback`在DMA接收完成后被调用,用于标记接收完成并控制GPIO状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

CUBE配置

1.引脚设置:

在这里插入图片描述

2:开启串口2的异步模式

在这里插入图片描述

3.添加DMA通道在这里插入图片描述

4.时钟选择

在这里插入图片描述

5.生成程序。

用户代码

OLED部分代码可参考之前的帖子。

蓝桥杯物联网STM32 学习记录6——外设实验1:OLED显示的实现

(此处省略OLED部分,重点体现回调函数。)

/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_USART2_UART_Init(void);
uint8_t ASCII_To_Hex(uint8_t number);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t Rev_Flag = 0;
uint8_t Rev_count = 0;
uint8_t RXBuffer[100];
uint8_t rxbuffer[100];
uint8_t TxBuffer[50] = {'R', 'e', 'c', 'i', 'v', 'e', 'O', 'K'};
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();
	
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  HAL_UART_Receive_DMA(&huart2,RXBuffer,50);//启动串口DMA接收
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	if (RXBuffer[49] == 0xEE)
    {
        RXBuffer[49] = 0;
        Rev_count++;
        HAL_UART_Transmit(&huart2, TxBuffer, 8, 50);
    }
    if (Rev_Flag == 1)//回调函数执行后,进入该条件
    {
        Rev_Flag  = 0;
        //发送字符串ReciveOK
        HAL_UART_Receive_DMA(&huart2, RXBuffer, 50);
    }
  }
  /* USER CODE END 3 */
  /* USER CODE BEGIN 4 */

/**
  * @brief 串口DMA接收完成的回调函数,打开Rev_Flag标志,并且反转PA1.
  * @param None
  * @retval None
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    Rev_Flag = 1;//将接收标志置1,表示接收回调执行。
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);//翻转点评

}
/* USER CODE END 4 */
}

回调函数的解释

stm32l0xx_hal_uart.c文件中找到了此虚函数的定义

/**
  * @brief  Rx Transfer completed callback.
  * @param  huart UART handle.
  * @retval None
  */
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_UART_RxCpltCallback can be implemented in the user file.
   */
}

参考这篇帖子。
https://blog.youkuaiyun.com/super828/article/details/79120066
在这里插入图片描述

因此在使用时只需要去实现这个函数即可,详情见用户代码中USER CODE 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值