【温酒笔记】DMA

参考文档:野火STM32F103
网友资料整理

1. Direct Memory Access-直接内存访问

DMA控制器独立于内核
是一个单独的外设

  • DMA1有7个通道
  • DMA2有5个通道
  • DMA有四个等级,非常高,高,中,低四个优先级
  • 如果优先等级相同,通道编号越小优先级越高
  • 数据流向: 存储器到存储器,存储器到外设,外设到存储器
  • 单次传输或循环传输
  • 传输过半中断,传输完成中断,传输错误中断

2. 串口示例

  1. 初始化

// 定义一个GPIO初始化结构体,并初始化为0
GPIO_InitTypeDef GPIO_InitStruct = {0};

// 检查当前USART实例是否为USART1
if(uartHandle->Instance==USART1)
{
  // 用户自定义代码区域开始(USART1_MspInit 0)
  /* USER CODE BEGIN USART1_MspInit 0 */

  // 用户自定义代码区域结束(USART1_MspInit 0)
  /* USER CODE END USART1_MspInit 0 */

  // 使能USART1时钟
  __HAL_RCC_USART1_CLK_ENABLE();

  // 使能GPIOA时钟
  __HAL_RCC_GPIOA_CLK_ENABLE();

  // USART1 GPIO配置说明
  /**USART1 GPIO Configuration
  PA9     ------> USART1_TX
  PA10     ------> USART1_RX
  */

  // 配置GPIO引脚
  GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; // 选择PA9和PA10引脚
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;       // 设置为复用推挽输出模式
  GPIO_InitStruct.Pull = GPIO_NOPULL;           // 不使用上拉或下拉电阻
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // 设置最高频率
  GPIO_InitStruct.Alternate = GPIO_AF4_USART1;  // 选择USART1复用功能
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);       // 初始化GPIO

  // USART1 DMA初始化
  // USART1_TX DMA通道初始化
  hdma_usart1_tx.Instance = DMA1_Channel2;      // 选择DMA1通道2
  hdma_usart1_tx.Init.Request = DMA_REQUEST_3;  // 选择DMA请求3
  hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; // 数据传输方向:内存到外设
  hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;     // 禁用外设地址递增
  hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;         // 启用内存地址递增
  hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 外设数据对齐方式:字节
  hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;   // 内存数据对齐方式:字节
  hdma_usart1_tx.Init.Mode = DMA_NORMAL;                 // 设置为普通模式
  hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;       // 设置优先级为低
  if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)           // 初始化DMA
  {
    Error_Handler();                                     // 如果初始化失败,调用错误处理函数
  }

  // 将DMA与USART1_TX关联
  __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);

  // USART1中断初始化
  HAL_NVIC_SetPriority(USART1_IRQn, 2, 0);               // 设置USART1中断优先级
  HAL_NVIC_EnableIRQ(USART1_IRQn);                       // 使能USART1中断

  // 用户自定义代码区域开始(USART1_MspInit 1)
  /* USER CODE BEGIN USART1_MspInit 1 */

  // 用户自定义代码区域结束(USART1_MspInit 1)
  /* USER CODE END USART1_MspInit 1 */
}
  1. DMA发送

  /* USART1 向 DMA发出TX请求 */
     HAL_UART_Transmit_DMA(&UartHandle, (uint8_t *)SendBuff ,SENDBUFF_SIZE);
  1. 使用DMA传输完成中断
//初始化
void MX_DMA_Init(void)
{
  // 使能DMA控制器时钟
  __HAL_RCC_DMA1_CLK_ENABLE();

  // DMA中断初始化
  // 配置DMA1通道2和3的中断
  HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 2, 0); // 设置DMA1通道2和3中断的优先级为2,子优先级为0
  HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);         // 使能DMA1通道2和3的中断
}
//中断服务函数
/**
  * @brief This function handles DMA1 channel 2 and channel 3 interrupts.
  */
void DMA1_Channel2_3_IRQHandler(void)
{
  /* USER CODE BEGIN DMA1_Channel2_3_IRQn 0 */

  /* USER CODE END DMA1_Channel2_3_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_usart1_tx);
  /* USER CODE BEGIN DMA1_Channel2_3_IRQn 1 */

  /* USER CODE END DMA1_Channel2_3_IRQn 1 */
}
//中断回调函数-打印传输完成结果

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart == &huart1)
	{
		printf(" dma_ok\r\n");
	}
}
//主函数
  while (1)
  {
		HAL_UART_Transmit_DMA(&huart1, Tx_buff, 10);
		HAL_Delay(1000);
  }

结果:传输完数据到中断回调函数中打印 : dma ok
在这里插入图片描述

3. 库函数备注

串口发送/接收函数
HAL_UART_Transmit():串口发送数据,使用超时管理机制
HAL_UART_Receive():串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT():串口中断模式发送
HAL_UART_Receive_IT():串口中断模式接收
HAL_UART_Transmit_DMA():串口DMA模式发送
HAL_UART_Transmit_DMA():串口DMA模式接收

串口中断函数
HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数(用的较少)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
HAL_UART_ErrorCallback();串口接收错误函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/906962.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion Web UI 1.9.4常用插件扩展-WD14-tagger

Stable Diffusion Web UI 1.9.4 运行在 WSL 中的 Docker 容器中 tagger 插件的作用是,上传一张图片,反推这张图片可能的提示词。 使用场景就是,想要得到类似的图片内容时使用。 WD14-tagger 安装 Stable Diffusion WebUI WD14-tagger GitH…

VS 中使用c#高版本语言方法

方法如下,打开项目工程文件(记事本),然后添加如下语句:保存,重新加载即可使用最新C#语法。

Golang--DOS命令、变量、基本数据类型、标识符

1、DOS命令 切换盘符(大小写没有区别): c: //切换到c盘 d: //切换到d盘 e: //切换到e盘 显示文件内信息: 指令:dir 切换路径: 指令:cd 绝对路径 / 相对路径 . 表示当前…

正反向滤波的简述和MATLAB代码

文章目录 MATLAB 例程:卡尔曼滤波与反向滤波运行结果代码说明总结P.S. 相关公式1. 正向滤波(Forward Filtering)2. 反向滤波(Backward Filtering)3. 总结以下是一个简单的MATLAB例程,演示如何使用卡尔曼滤波进行状态估计,包括正向滤波和反向滤波的实现。这个例程模拟了一…

Django目录结构最佳实践

Django项目目录结构 项目目录结构配置文件引用修改创建自定义子应用方法修改自定义注册目录从apps目录开始 项目目录结构 └── backend # 后端项目目录(项目名称)├── __init__.py├── logs # 项目日志目录├── manage.py #…

KVM 使用主机 GPU

KVM 如何使用主机的 GPU,首先安装 KVM。 配置Grub vi /etc//etc/default/grub GRUB_CMDLINE_LINUX"amd_iommuon iommupt videoefifb:off vfio_pci.ids10de:1e07,10de:10f7,10de:1ad6,10de:1ad7"查看主机显卡信息 lspci -nnk | grep -A 3 VGA 找到GP…

b站小土堆PyTorch视频学习笔记(二)

Dataloader:提供不同类型的数据集;为后面的网络提供不同的数据形式 Dataset:提供一种方式去获取数据及其label(标签) 主要实现以下两个功能: {如何获取每一个数据及其lable;告诉我们总共有多少数据} fr…

nginx的proxy_next_upstream使用中的一个坑

今天线上系统出了点问题,机房的电信出口突然不通了,原本以为能自动切换的nginx配置,居然没有生效,导致了业务告警,手工紧急处理了才解决了。 当时的设想是,如果这个服务的访问,出现了500或者超…

【Git】SSH密钥

目录 1 前言2 SSH密钥2.1 生成密钥2.2 查看密钥2.3 关联Git服务器 3 小结 1 前言 许多Git服务器都使用SSH公钥进行认证,为了向Git服务器提供SSH公钥,如果某系统用户尚未拥有密钥,必须事先为其生成一份。 2 SSH密钥 2.1 生成密钥 在Window…

【Seed-Labs】SQL Injection Attack Lab

Overview SQL 注入是一种代码注入技术,利用的是网络应用程序与数据库服务器之间接口的漏洞。当用户输入的信息在发送到后端数据库服务器之前没有在网络应用程序中进行正确检查时,就会出现这种漏洞。 许多网络应用程序从用户那里获取输入,然…

ClkLog企业版(CDP)预售开启,更有鸿蒙SDK前来助力

新版本发布 ClkLog在上线近1年后,获得了客户的一致肯定与好评,并收到了不少客户对功能需求的反馈。根据客户的反馈,我们在今年三季度对ClkLog的版本进行了重新的规划与调整,简化了原有的版本类型,方便客户进行选择。 与…

T矩阵其实就是pauli基的乘,S矩阵中hv是体散射分量

注意什么是面散射,二次散射和体散射。 ShhSvv表示单次散射的电压,|ShhSvv|^2是功率

群控系统服务端开发模式-应用开发-上传配置功能开发

下面直接进入上传配置功能开发,废话不多说。 一、创建表 1、语句 CREATE TABLE cluster_control.nc_param_upload (id int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 编号,upload_type tinyint(1) UNSIGNED NOT NULL COMMENT 上传类型 1:本站 2&a…

HarmonyOS NEXT 应用开发实战(九、知乎日报项目详情页实现详细介绍)

在本篇博文中,我们将探讨如何使用 HarmonyOS Next 框架开发一个知乎日报的详情页,逐步介绍所用到的组件及代码实现。知乎日报是个小巧完整的小项目,这是一个循序渐进的过程,适合初学者和有一定开发经验的工程师参考。 1. 项目背景…

数据结构之链式结构二叉树的实现(初级版)

本文内容将主会多次用到函数递归知识&#xff01;&#xff01;&#xff01; 本节内容需要借助画图才能更好理解&#xff01;&#xff01;&#xff01; 和往常一样&#xff0c;还是创建三个文件 这是tree.h #pragma once #include<stdio.h> #include<stdlib.h> …

数据结构(Java)—— 认识泛型

1. 包装类 在学习泛型前我们需要先了解一下包装类 在 Java 中&#xff0c;由于基本类型不是继承自 Object &#xff0c;为了在泛型代码中可以支持基本类型&#xff0c; Java 给每个基本类型都对应了一个包装类型。 1.1 基本数据类型和对应的包装类 基本数据类型包装类byteByt…

LSTM模型改进实现多步预测未来30天销售额

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【BiLSTM模型实现电力数据预测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实…

使用带有令牌认证的 Jupyter Notebook 服务器

当你不想在默认浏览器打开Jupyter Notebook,但是在其他浏览器打开http://localhost:8890/lab或者http://localhost:8889/tree&#xff0c;却显示 Token authentication is enabled&#xff0c;如下图 可以按以下步骤操作&#xff1a; 获取令牌&#xff1a;在启动 Jupyter Note…

软考(中级-软件设计师)数据库篇(1101)

第6章 数据库系统基础知识 一、基本概念 1、数据库 数据库&#xff08;Database &#xff0c;DB&#xff09;是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储&#xff0c;具有较小的冗余度、较高的数据独立性和扩展…

【java】java的基本程序设计结构06-运算符

运算符 一、分类 算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符 1.1 算术运算符 操作符描述例子加法 - 相加运算符两侧的值A B 等于 30-减法 - 左操作数减去右操作数A – B 等于 -10*乘法 - 相乘操作符两侧的值A * B等于200/除法 - 左操作数除以右操作数B /…