STM32——DMA知识点及实战总结

news2024/11/15 15:30:39

1.DMA概念介绍

DMA,全称Direct Memory Access,即直接存储器访问。
DMA传输 将数据从一个地址空间复制到另一个地址空间。
注意:DMA传输无需CPU直接控制传输
在这里插入图片描述

在这里插入图片描述

2.DMA框图

在这里插入图片描述

3.DMA处理过程

在这里插入图片描述
外设的 8 个请求独立连接到每个通道,由 DMA_SxCR 控制数据流选择哪一个通道,每个
数据流有 8 个通道可供选择,每次只能选择其中一个通道进行 DMA 传输。
在这里插入图片描述
在这里插入图片描述

5 DMA优先级

第一阶段(软件阶段):每个通道的优先级可在DMA_CCRx寄存器中设置,有四个等级:最高、高、中和低优先级。
第二阶段(硬件阶段):如果两个请求有相同软件优先级,较低编号的通道比较高编号的通道有较高的优先级。

6.寄存器

在这里插入图片描述
)

7.DMA句柄结构体

typedef struct __DMA_HandleTypeDef
{
void Instance; / 寄存器基地址 /
DMA_InitTypeDef Init; /
DAM 通信参数 */

uint32_t StreamBaseAddress
uint32_t StreamIndex

}DMA_HandleTypeDef;

typedef struct
{
uint32_t Channel; /* 传输通道,例如:DMA_CHANEL_4 /
uint32_t Direction; /
传输方向,例如存储器到外设 DMA_MEMORY_TO_PERIPH /
uint32_t PeriphInc; /
外设(非)增量模式,非增量模式 DMA_PINC_DISABLE /
uint32_t MemInc; /
存储器(非)增量模式,增量模式 DMA_MINC_ENABLE /
uint32_t PeriphDataAlignment; /
外设数据大小:8/16/32 位 /
uint32_t MemDataAlignment; /
存储器数据大小:8/16/32 位 /
uint32_t Mode; /
模式:外设流控模式/循环模式/普通模式 /
uint32_t Priority; /
DMA 优先级:低/中/高/非常高 */
}DMA_InitTypeDef;

8 8.2以DMA方式传输串口数据配置步骤

在这里插入图片描述
代码:

8.1 dma.c


//DMA数据传输(内存到内存的传输)实现步骤:
//1.全局变量与宏定义
//1.1源与目标缓冲区定义

//2.函数定义
//初始化DMA配置
//2.1DMA时钟使能
//2.3初始化DMA句柄及DMA配置
//2.4关联源和目标地址

//3 传输控制
//3.1传输失能
//3.2设置传输数据的长度
//3.3传输使能

//4.函数调用、执行
//4.1硬件初始化,HAL_Init()调用
//4.2 DMA配置初始化化函数调用调用
//4.3 等待DMA传输完成
//4.4 while(1)中执行代码

//DMA数据传输(内存到内存的传输)实现步骤:
//2.2DMA句柄创建
DMA_HandleTypeDef g_dma_handler;     
//1.全局变量与宏定义
//1.1源与目标缓冲区定义
uint8_t src_buf[10] = {0x0a, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};
uint8_t dest_buf[10] = {0};

//2.函数定义
//初始化DMA配置
void dma_init(void)
{
    //2.1DMA1时钟使能
    __HAL_RCC_DMA1_CLK_ENABLE();
    //2.3初始化DMA句柄及DMA配置
    g_dma_handler.Instance = DMA1_Channel1;
    g_dma_handler.Init.Direction = DMA_MEMORY_TO_MEMORY;
    
    /* 与目标地址相关 */
    g_dma_handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    g_dma_handler.Init.MemInc = DMA_MINC_ENABLE;

    /* 与源地址相关 */
    g_dma_handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    g_dma_handler.Init.PeriphInc = DMA_PINC_ENABLE;
    
    g_dma_handler.Init.Priority = DMA_PRIORITY_HIGH;
    g_dma_handler.Init.Mode = DMA_NORMAL;   /* 内存到内存是不支持循环模式 */
    
    HAL_DMA_Init(&g_dma_handler);
     //2.4关联源和目标地址,启动DMA传输的函数
    HAL_DMA_Start(&g_dma_handler, (uint32_t)src_buf, (uint32_t)dest_buf, 0);
   
}

//3 传输控制函数
void dma_enable_transmit(uint16_t cndtr)
{
    //3.1传输失能
    __HAL_DMA_DISABLE(&g_dma_handler);
    //3.2设置传输数据的长度
    g_dma_handler.Instance->DMA_CNDTR = cndtr;  // 设置传输数据长度
    //3.3传输使能
    __HAL_DMA_ENABLE(&g_dma_handler);
    
}

8.2 main.c

int main()    
{
    uint8_t key = 0;
    //3.1硬件初始化,HAL_Init()调用
    HAL_Init();                             /* 初始化HAL库 */
    sys_stm32_clock_init(336, 8, 2, 7);     /* 设置时钟,168Mhz */
    delay_init(168);                         /* 延时初始化 */
    usart_init(115200);
    led_init();                             /* 初始化LED */
    key_init();                             /* 初始化按键 */
    LED0(0);                                /* 先点亮LED0 */
    //3.2 DMA配置初始化化函数调用调用
    dma_init();
    while(1)
    {
        
        key = key_scan(0);                  /* 得到键值 */
        if (key == KEY0_PRES)
        {
             memset(dest_buf, 0, 10);
             dma_enable_transmit(10);
             while(1)
             {
                 if (__HAL_DMA_GET_FLAG(&g_dma_handler, DMA_FLAG_TC1))
                {
                    __HAL_DMA_CLEAR_FLAG(&g_dma_handler, DMA_FLAG_TC1);
                    printf("传输完成 \r\n");
                    break;
                }
             }
            
        
        }

        LED0_TOGGLE();
        delay_ms(200);  
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

推挽输出、开漏输出、上拉输入、下拉输入、浮空输入。

一、推挽输出 推挽输出的内部电路大概如上图中黄色部分,输出控制内有反相器,由一个P-MOS和一个N-MOS组合而成,同一时间只有一个管子能够进行导通。 当写入1时,经过反向器后为0,P-MOS导通,N-MOS截至&#xf…

kafka简单介绍和代码示例

“这是一篇理论文章,给大家讲一讲kafka” 简介 在大数据领域开发者常常会听到MQ这个术语,该术语便是消息队列的意思, Kafka是分布式的发布—订阅消息系统。它最初由LinkedIn(领英)公司发布,使用Scala语言编写,与2010年…

gin-vue-admin二开使用雪花算法生成唯一标识 id

场景介绍 需求场景: 总部采集分支的数据,由于分支的 id 是子增的主键 id,所以会出现重复的 id,但是这个 id 需要作为标识,没有实际作用,这里选择的是分布式 id 雪花算法生成 id 存储用来标识,这…

交通流量预测:T-GCN A Temporal Graph Convolutional Network for Traffic Prediction

摘要 为了同时捕捉时空相关性,将图卷积网络(GCN)和门控递归单元(GRU)相结合,提出了一种新的基于神经网络的流量预测方法–时态图卷积网络(T-GCN)模型。具体地,GCN用于学习复杂的拓扑结构以捕获空间相关性,而门控递归单元用于学习…

20240112-补 制作两个字符串字谜的最少步骤数

题目要求 给你两个长度相同的字符串 s 和 t。在一个步骤中,你可以选择 t 中的任意一个字符并用另一个字符替换它。 返回将 t 变为 s 的变位所需的最少步数。 字符串的 "字谜 "是指字符串中的相同字符具有不同(或相同)的排列顺序…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 第1章 HTML5+CSS3初体验 项目1-2 许愿墙

项目展示 在生活中,许愿墙是一种承载愿望的实体,来源于“许愿树”的习俗。后来人们逐渐改变观念,开始将愿望写在小纸片上,然后贴在墙上,这就是许愿墙。随着互联网的发展,人们又将许愿墙搬到了网络上&#…

网络协议与攻击模拟_04ICMP协议与ICMP重定向

ICMP协议是网络层协议, 利用ICMP协议可以实现网络中监听服务和拒绝服务,如 ICMP重定向的攻击。 一、ICMP基本概念 1、ICMP协议 ICMP是Internet控制报文协议,用于在IP主机、路由器之间传递控制消息,控制消息指网络通不通、主机是…

如何用Python调用智谱AI的API进行智能问答

一、引言 随着人工智能技术的不断演进,以ChatGPT为首的智能聊天机器人如:文心一言、通义千问、智谱AI等受到越来越多人的喜欢。这些智能引擎不仅有网页版,而且开放了免费的api接口,并给出了样例代码。 这样,我们可以…

基于JavaWeb+BS架构+SpringBoot+Vue健美操评分系统系统的设计和实现

基于JavaWebBS架构SpringBootVue健美操评分系统系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 目 录 1 绪 论 1 1.1背景与意义 1 1.2 国内外研究概况 1 1.3 研究的内容…

大数据开发之Hadoop(HDFS)

第 1 章:HDFS概述 1.1 HDFS产出背景及定义 1、HDFS产生背景 随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的…

epoll实现(ET)

说来惭愧,编程也有一年半的时间了,今天在实现epoll这个多路转接的代码时,写了个bug,个人认为还是很不好发现的一个错误。 首先,在这里先给大家说说多路转接。所谓的多路转接就是在IO的时候提高了效率,原来…

电机的转矩控制和转速控制的区别和应用(电机控制),电动汽车电机控制更多用转矩控制模式还是转速控制模式?

转矩控制模式牺牲时间获取稳定性;转速模式牺牲稳定性获取时间; 1,VCU根据驾驶员给定的油门踏板开度确定的转矩需求,再将需求转矩指令发送给MCU,转矩控制。控制转矩可以把加速度的控制权掌握在驾驶者手里,更…

makefile,make,CMake项目编译之helloworld

文章目录 makefile,make,CMake项目编译1.相关概念1.1makefile是什么1.2make和makefile1.3cmake1.4Cmake与CMakeLists 的关系 2.makefile文件编写helloworld makefile,make,CMake项目编译 1.相关概念 1.1makefile是什么 工程中的…

Windows下同一台服务器部署多个tomcat服务

工具 apache-tomcat-8.5.97 安装tomcat步骤 下载apache-tomcat-8.5.97,下载下来的文件为apache-tomcat-8.5.97-windows-x64.zip解压该压缩包到指定目录下,比如E:\works修改解压文件夹名字为:tomcat-8080在E:\works目录下创建该文件夹的两个…

大模型学习之书生·浦语大模型5——基于LMDeploy大模型量化部署实践

目录 大模型部署背景 LMDeploy部署 量化 TurboMind API server 动手实践环节

计算机导论09-数据组织与管理

文章目录 数据管理基础数据管理技术的发展数据组织与管理的发展手工数据处理阶段文件方式的数据处理阶段数据库数据处理阶段 数据库技术的发展 数据模型数据模型的要素概念模型逻辑模型 数据库系统数据库系统基础数据库系统构成 数据库系统的结构数据库系统的体系结构数据库系统…

maxwell同步全量历史数据

CentOS安装maxwell 在上篇的基础上,我们实现了实时同步mysql数据到kafka。maxwell不仅可以同步实时数据,也可以同步全量历史数据。在这里模拟一下历史数据的场景,创建表结构如下,并写入测试数据。 CREATE TABLE user_det…

Kafka集群与可靠性

Kafka集群与可靠性 1.Kafka集群搭建实战 使用两台Linux服务器:一台192.168.182.137 一台192.168.182.138 安装kafka首先,我们需要配置java环境变量(这里就略过了) mkdir /opt/kafka #上传压缩包kafka_2.13-3.3.1.tgz并解压 ta…

某银行主机安全运营体系建设实践

随着商业银行业务的发展,主机规模持续增长,给安全团队运营工作带来极大挑战,传统的运营手段已经无法适应业务规模的快速发展,主要体现在主机资产数量多、类型复杂,安全团队难以对全量资产进行及时有效的梳理、管理&…

【QML COOK】- 010-动态创建组件

上节介绍了Component的概念,本节介绍一下如何使用javascript动态创建对象。 1. 创建工程,新建一个MyComponent.qml的qml import QtQuickRectangle {color: "red" }它很简单就是一个红色框 2. 编辑main.qml import QtQuickWindow {id: root…