STM32基于HAL库的USART+DMA使用

开发板:正点原子阿波罗

创建工程

使能USART
在这里插入图片描述

开启DMA

在这里插入图片描述

配置中断

在这里插入图片描述

以上配置好之后,点击生成工程

一、接收、发送指定长度数据

指定接收、发送的数据长度为1

定义一个接收缓冲区

char tx_buffer[10];

编写中断回调函数

当触发接收中断时,将接收到的数据通过DMA发送出去

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
	if (huart->Instance == USART1) {
		//函数要使用DMA方式的
		HAL_UART_Transmit_DMA(&huart1,tx_buffer,1);  
	}
}

当触发发送中断时,使用DMA接收一下

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
	if (huart->Instance == USART1) {
		函数要使用DMA方式的
		HAL_UART_Receive_DMA(&huart1,tx_buffer,1);
	}
}

使能接收中断

在main.c中

在这里插入图片描述
编译、下载进去就能看到效果

二、接收、发送不定长度数据

接收不定长度时,需要判断USART什么时候为空闲状态,当触发空闲中断时,证明此时已经接收全部数据,需要

用到的函数有

HAL_UART_DMAStop(UART_HandleTypeDef *huart)//停止DMA传输
__HAL_DMA_GET_COUNTER(__HANDLE__)//得到DMA传输了多少数据
__HAL_UART_CLEAR_IDLEFLAG(__HANDLE__)//清除空闲标志
HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)//使用DMA的方式发送
HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)//使用DMA的方式接收

使能空闲中断

MX_USART1_UART_Init() 函数中添加

  /* USER CODE BEGIN USART1_Init 2 */
  //使能空闲中断
  __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
  /* USER CODE END USART1_Init 2 */

定义一个接收缓冲区

/* USER CODE BEGIN 0 */
#define RXSIZE  1024   /
uint8_t rx_buffer[RXSIZE] = {0};
uint16_t RxNum = 0;
/* USER CODE END 0 */

编写USART1中断

/**
  * @brief This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
	/* USER CODE BEGIN USART1_IRQn 0 */
	
	//判断空闲标志
	if (__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) == SET) {
		//清除空闲中断标志
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);
		//停止DMA
		HAL_UART_DMAStop(&huart1);
		//接收了多长的数据
		RxNum = RXSIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
		//将接收到的数据再发送出去
		HAL_UART_Transmit_DMA(&huart1,rx_buffer,RxNum);
	}
	/* USER CODE END USART1_IRQn 0 */
	HAL_UART_IRQHandler(&huart1);
	/* USER CODE BEGIN USART1_IRQn 1 */
	/* USER CODE END USART1_IRQn 1 */
}

编写中断回调函数

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
  if (huart->Instance == USART1) {
    RxNum = 0;
    //清空一个缓冲区
    memset(rx_buffer,0,RXSIZE);
    //使能接收
    HAL_UART_Receive_DMA(&huart1,rx_buffer,RXSIZE);
  }
}

使能接收中断

在main.c中

若是不添加这句则无法进入中断
在这里插入图片描述
编译、下载进去就能看到效果

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
STM32F103C8T6是一款32位ARM Cortex-M3内核的微控制器,而HAL库是ST公司提供的一种软件开发库,用于简化开发者在STM32系列微控制器上的软件开发过程。在这个库的基础上,我们可以使用USART通信协议进行数据传输。 在使用HAL库USART之前,首先要在代码中包含相应的头文件,如stm32f1xx_hal.h和stm32f1xx_hal_uart.h,并初始化USART控制器和GPIO外设,配置相应的引脚。接着,我们需要定义一个UART_HandleTypeDef结构体变量,并通过HAL_UART_Init函数来初始化USART的一些配置参数,如波特率、数据位、停止位和奇偶校验等。 通过HAL_UART_Transmit函数可以发送数据,函数中传入发送数据的缓冲区指针和数据长度参数。而接收数据时,可以通过HAL_UART_Receive函数来接收数据,函数中传入接收数据的缓冲区指针和数据长度参数。 另外,为了确保数据的准确传输,我们还可以使用中断来处理数据的发送和接收。通过HAL_UART_Transmit_IT函数可以开启数据发送的中断处理,并在中断回调函数中实现数据的发送。而使用HAL_UART_Receive_IT函数则可以开启数据接收的中断处理,并在中断回调函数中实现数据的接收。 以上就是基于HAL库USART使用方法。使用HAL库可以省去一些繁琐的底层配置工作,提高开发效率和代码的可维护性。同时,HAL库还提供了丰富的功能函数,如自动流控制和DMA传输等,更进一步地简化了串口通信的开发流程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点灯大师~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值