首页 > 其他分享 >STM32 第21章 DMA--直接存储器访问

STM32 第21章 DMA--直接存储器访问

时间:2024-11-02 16:46:53浏览次数:6  
标签:Specifies DMA 21 -- DIR memory uint32 外设

时间:2024.10.31-11.2

参考资料:

《零死角玩转STM32》“DMA--直接存储器访问”章节

编程部分的代码基于12-GPIO输出-使用固件库点亮LED灯

一、学习内容

1、DMA功能框图和DMA初始化结构体

1.1DMA功能框图

1.1.1DMA简介
DMA:

Data Memory Access,直接存储器访问。和GPIO、串口等一样都是外设。

主要功能:

把数据从一个地方搬到另外一个地方,而且不占用CPU。

DMA1:

有7个通道(搬运数据的管道),可以实现P(外设)->M(存储器),M->P,M->M

DMA2(只存在大容量/互联型的产品中):

有5个通道,可以实现P->M,M->P,M->M

霸道和指南者是512K的,所以都有两个DMA控制器

1.1.2DMA功能框图

1-DMA请求

如果外设想要通过DMA来传输数据,必须先向DMA控制器发送DMA请求,DMA收到请求信号以后,控制器会给外设一个应答信号,当外设应答且DMA控制器收到应答信号之后,就会启动DMA的传输,直到传输完毕。

2-通道

传输数据的管道

2.1DMA请求+通道
DMA1请求映射

 DMA2请求映射

TIPS:

1、ADC3/SDIO/TIM8的DMA请求只有大容量的单片机才有

2、当使用M->M模式时,所有通道均可使用,无硬性规定,P->M和M->P都需要根据实际需要的功能选择不同的通道

3-仲裁器

多个DMA请求一起来,怎么办?

1、软件阶段,DMA_CCPx:PL[1:0]。
2、硬件阶段,通道编号小的优先级大,DMA1的优先级高于DMA2的优先级。

1.1.3DMA处理

 

1.2DMA相关库函数

1.2.1DMA初始化结构体

初始化结构体在固件库头文件中:stm32f10x_dma.h

/** 
  * @brief  DMA Init structure definition
  */

typedef struct
{
  uint32_t DMA_PeripheralBaseAddr; /*!< Specifies the peripheral base address for DMAy Channelx. */

  uint32_t DMA_MemoryBaseAddr;     /*!< Specifies the memory base address for DMAy Channelx. */

  uint32_t DMA_DIR;                /*!< Specifies if the peripheral is the source or destination.
                                        This parameter can be a value of @ref DMA_data_transfer_direction */

  uint32_t DMA_BufferSize;         /*!< Specifies the buffer size, in data unit, of the specified Channel. 
                                        The data unit is equal to the configuration set in DMA_PeripheralDataSize
                                        or DMA_MemoryDataSize members depending in the transfer direction. */

  uint32_t DMA_PeripheralInc;      /*!< Specifies whether the Peripheral address register is incremented or not.
                                        This parameter can be a value of @ref DMA_peripheral_incremented_mode */

  uint32_t DMA_MemoryInc;          /*!< Specifies whether the memory address register is incremented or not.
                                        This parameter can be a value of @ref DMA_memory_incremented_mode */

  uint32_t DMA_PeripheralDataSize; /*!< Specifies the Peripheral data width.
                                        This parameter can be a value of @ref DMA_peripheral_data_size */

  uint32_t DMA_MemoryDataSize;     /*!< Specifies the Memory data width.
                                        This parameter can be a value of @ref DMA_memory_data_size */

  uint32_t DMA_Mode;               /*!< Specifies the operation mode of the DMAy Channelx.
                                        This parameter can be a value of @ref DMA_circular_normal_mode.
                                        @note: The circular buffer mode cannot be used if the memory-to-memory
                                              data transfer is configured on the selected Channel */

  uint32_t DMA_Priority;           /*!< Specifies the software priority for the DMAy Channelx.
                                        This parameter can be a value of @ref DMA_priority_level */

  uint32_t DMA_M2M;                /*!< Specifies if the DMAy Channelx will be used in memory-to-memory transfer.
                                        This parameter can be a value of @ref DMA_memory_to_memory */
}DMA_InitTypeDef;
1.数据从哪里来,要到哪里去
1.1外设地址,DMA_CPAR

地址从外设得来,一般情况下是从外设的数据寄存器而来

1.2存储器地址,DMA_CMAR

1.3传输方向,DMA_CCR:DIR

 

uint32_t DMA_PeripheralBaseAddr;     //外设地址

  uint32_t DMA_MemoryBaseAddr;       //存储器地址

  uint32_t DMA_DIR;                  //传输方向

 

 M-->M的控制位

2.结构体成员取值

 在固件库头文件中:stm32f10x_dma.h

/** @defgroup DMA_data_transfer_direction 
  * @{
  */

#define DMA_DIR_PeripheralDST              ((uint32_t)0x00000010)
#define DMA_DIR_PeripheralSRC              ((uint32_t)0x00000000)
#define IS_DMA_DIR(DIR) (((DIR) == DMA_DIR_PeripheralDST) || \
                         ((DIR) == DMA_DIR_PeripheralSRC))
3.数据要传多少,传的单位是什么
 uint32_t DMA_BufferSize;            //传输数目
                                        

  uint32_t DMA_PeripheralInc;        //外设地址增量模式

  uint32_t DMA_MemoryInc;            //存储器地址增量模式

  uint32_t DMA_PeripheralDataSize;   //外设数据宽度

  uint32_t DMA_MemoryDataSize;       //存储器数据宽度
3.1传输数目,DMA_CNDTR

3.2外设地址是否递增,DMA_CCRx:PINC
3.3存储器地址是否递增,DMA_CCRx:MINC

 

3.4外设数据宽度,DMA_CCRx:PSIZE 

标签:Specifies,DMA,21,--,DIR,memory,uint32,外设
From: https://blog.csdn.net/2201_75297369/article/details/143417078

相关文章

  • 足球预测分析工具推荐:AI泊松分布预测系统
    一、引言工欲善其事必先利其器,足球预测准确与否,其要点在于工具的合适性,而在当今时代,足球预测的首选工具就非AI与泊松分布不可了,而鉴于AI系统的可拓展性,AI与泊松分布融合的预测模型已经成为了广大足球预测家与足球精算师的首选工具,因此,本文将介绍此类预测系统的原理以及其预测......
  • SpringBoot送药上门系统s3r30(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景随着互联网的快速发展和人们健康意识的提高,线上购药、送药上门服务逐渐成为人们生活中的重要需求。特别是在疫情期间,为了减少外出和交......
  • AutoDWG DWGViewX 2024
    AutoDWGDWGViewX,比以往更快!DWGViewX是一款ActiveX控件,它可在一个查看器中查看您的DWG、DXF和DWF图纸。它非常简单,您只需一个查看器即可管理所有CAD图纸。DWGViewX在线演示主要特点:查看从R2.5到2025版本的DWG、DXF和DWF。支持相对路径:加载本地磁盘或网......
  • VectorDraw Developer Framework 11.2.1
    VectorDrawDeveloperFramework(VDF)suiteisacombinationofcomponentsdesignedtocovertheneedsofyourapplication.It'smaincomponentisagraphicsengine-librarythatcanbeusedfromdevelopersinordertovisualizetheirapplications.With......
  • 【MySql】 搭建主从复制
    一、概述 主从复制是指将主库的数据变更同步到从库,从而保证主库和从库数据一致,可用于数据备份、失败迁移、读写分离、降低单库读写压力等场景。对于面向大企业的B端产品而言,主从复制技术尤为重要。1.1什么是主从复制主从复制是指将主库的DDL和DML操作通过二进制日志传......
  • 【docker】—— 部署python项目
    使用docker部署python项目这里默认已经安装好docker并进行了相关配置,只演示使用docker打包并部署一个简单的python项目。更多docker基本操作参考:【docker】——docker常用操作下面是准备好的项目和程序:项目结构:项目:DOCKER_PYTHON_TESE文件:main.ipynb代码如下:#......
  • RabbitMQ实现轮询形式消息最大发送失败次数,及详细解析
    RabbitMQ设置消息最大发送失败次数,达到三次后不确认消息(此处根据业务需求可考虑使不确认的消息进入死信交换机)配置文件:spring:rabbitmq:host:192.168.1.248port:5672username:adminpassword:123456virtual-host:powernodepublisher......
  • 机器学习入门基础----白板推导笔记输出
    为了能够建立知识学习后输出体系,开设这个系列,旨在通过记录博客输出学习到的机器学习内容,笔者所学为B站upshuhuai008白板推导系列,记录可能比不上原创,也可能有没理解不严谨的地方,请善意指正。感兴趣的可以去看UP白板-------------------------------------------------------------......
  • 使用机器学习预测FPGA的执行时间与功耗:一种创新的方法
    随着科技的飞速发展,现场可编程门阵列(FPGA)在高性能计算、数据中心、人工智能等领域的应用日益广泛。然而,FPGA设计的复杂性和功耗问题一直是制约其性能提升的关键因素。近年来,机器学习(ML)技术的兴起为FPGA的执行时间与功耗预测提供了新的解决方案。本文将探讨如何使用机器学习进行FPG......
  • java.数据流.study
         (紧接输出流代码,需要与输入流代码中类型对应)  对象字节输入流与对象字节输出流:     可以使用transient可以实现变量不会序列化:  ......