IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32基于HAL库的USART+DMA使用 -> 正文阅读

[嵌入式]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中

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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-06-25 18:19:04  更:2022-06-25 18:19:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 8:01:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计