基于STM32F103C8T6的DMA直接存储器存取

#一、DMA简介
#二、STM32存储器映像
#三、DMA基本结构
#四、项目代码

一、DMA简介

  • DMA(Direct Memory Access)直接存储器存储
  • DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省CPU的资源
  • 12个独立可配置的通道:DMA1(7个通道),DMA2(5个通道)
  • 每个通道都支持软件触发和特定的硬件触发
  • STM32F103C8T6 DMA资源:DMA1(7个通道)

在这里插入图片描述

二、STM32存储器映像

在这里插入图片描述

  • FLASH在DMA中只能读取不能写入,即FLASH只能作为外设或者存储器的起点,或可通过配置FLASH接口控制器进行写入
  • SRAM可以任意读写

三、DMA基本结构

在这里插入图片描述

  • 1.数据的地址及传输方向
  • uint32_t DMA_PeripheralBaseAddr; //外设地址
  • uint32_t DMA_MemoryBaseAddr; //存储器地址->建立数组 ,采用数组地址
  • uint32_t DMA_DIR //传输方向
  • 2.数据的大小及其传输单位
  • uint32_t DMA_BufferSize; //传输数目
  • uint32_t DMA_PeripheralInc; //外设地址增量模式
  • uint32_t DMA_MemoryInc; //存储器地址增量模式
  • uint32_t DMA_PeripheralDataSize; //外设数据宽度
  • uint32_t DMA_MemoryDataSize; //存储器数据宽度
  • 3.传输模式、优先级及存储器到存储器的模式
  • uint32_t DMA_Mode; //模式选择
  • uint32_t DMA_Priority; //通道优先级
  • uint32_t DMA_M2M; //存储器到存储器模式

1)外设地址的查询:

外设数据寄存器地址=外设寄存器基本地址加数据寄存器偏移地址

如:USART1串口的数据寄存器地址

USART1寄存器基地址
在这里插入图片描述
在这里插入图片描述

USART1数据寄存器偏移地址(数据手册查找)

在这里插入图片描述

USART1的数据寄存器地址=基地址+偏移地址

在这里插入图片描述

2)传输方向(DIR):

  • 内存到内存

  • 内存到外设

  • 外设到外设

  • 外设到内存

  • DMA_DIR_PeripheralDST -> 外设作为目标地址

  • DMA_DIR_PeripheralSRC -> 外设作为源

3)传输数目

  • 传输数目主要是通过传输计数器来实现计数工作,在DMA失能(Cmd_Disable)的时候可以设定计数次数,即一次完成多少次传输

4)增量模式

  • 增量即完成一次数据传输后自动将数据地址加一,便于传输下一个数据
  • 外设数据寄存器不选择增量
  • 存储器地址选择增量,不选择自增数据则在第一个位置被一直覆盖

5)数据宽度

  • DMA_PeripheralDataSize_Byte (8位)

  • DMA_PeripheralDataSize_HalfWord (16位)

  • DMA_PeripheralDataSize_Word (32位)

  • 根据外设数据寄存器和存储器选择大小

  • 一般有外设数据寄存器的选择8位Byte

  • 存储器与存储器之间传输则选择32位Word

6)模式选择

  • DMA_Mode_Circular ->循环模式
  • 当传输结束时,硬件自动将传输计数器重装,继续进行下一轮的传输
  • DMA_Mode_Normal ->单次模式
  • 当DMA完成一次传输后,DMA停止传送,即发送一次数据

7)通道选择

在这里插入图片描述

8)通道优先级

软件:每个通道的优先级可以在DMA_CCRx寄存器中设置,有四个等级:

  • 最高优先级
  • 高优先级
  • 中等优先级
  • 低优先级

硬件:如果2个请求有相同的软件优先级,则低编号的通道比较高编号的通道有较高的优先级,如:软件优先级相同,通道2优先于通道3
在大容量产品和互联型产品集中,DMA1控制器拥有高于DMA2控制器优先级

9)存储器到存储器模式

  • 存储器到存储器传输则需要使能
  • 其他情况失能即可

四、项目代码

DMA.C

#include "stm32f10x.h"
#include "DMA.h"

//const 关键字把数组Buffer定义为常量类型,表示数据存储在内部的Flash中
const uint32_t SRC_Buffer[BUFFER_SIZE]={
   
	
	0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
	0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,
	0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30,
	0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40
	
};

//定义DMA传输的目标存储器,存储在内部SRAM
uint32_t DST_Buffer[BUFFER_SIZE];

uint8_t SendBuf[SEND_SIZE];
/*
typedef struct
{
  
    //1.数据的输入与输出
		uint32_t DMA_PeripheralBaseAddr;         //外设地址 
		uint32_t DMA_MemoryBaseAddr;             //存储器地址
		uint32_t DMA_DIR                         //传输方向
    //2.数据大小及其传输单位
		uint32_t DMA_BufferSize;                 //传输数目
		uint32_t DMA_PeripheralInc;              //外设地址增量模式
		uint32_t DMA_MemoryInc;                  //存储器地址增量模式
		uint32_t DMA_PeripheralDataSize;         //外设数据宽度
		uint32_t DMA_MemoryDataSize;             //存储器数据宽度
    //3.传输结束
		uint32_t DMA_Mode;                       //模式选择
		uint32_t DMA_Priority;                   //通道优先级
		uint32_t DMA_M2M;           
STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器芯片,具有丰富的外设资源和强大的性能。DMA(Direct Memory Access,直接内存访问)是STM32F103C8T6芯片中的一个重要功能模块,用于实现高速数据传输。在DMA的配置中,需要设置一些参数来指定数据的地址、传输方向、大小、传输模式等。 在引用\[1\]中,给出了一些与DMA相关的参数及其含义,包括外设地址、存储器地址、传输方向、传输数目、地址增量模式、数据宽度、模式选择、通道优先级等。 在引用\[2\]中,给出了一个DMA的初始化函数DMA_MTM_Init()和USART的DMA初始化函数USART_DMA_Init()的声明。 在引用\[3\]中的main.c文件中,包含了一些头文件,包括DMA.h,说明在该文件中使用了DMA相关的函数和变量。在main函数中,初始化了一个发送缓冲区SendBuf,并将其填充为字符'o',然后进行USART和DMA的初始化,并使能USART的DMA传输请求。 综上所述,stm32f103c8t6dma是指在STM32F103C8T6芯片中使用DMA进行数据传输的相关配置和使用。 #### 引用[.reference_title] - *1* *2* *3* [基于STM32F103C8T6DMA直接存储器存取](https://blog.csdn.net/weixin_72921448/article/details/127971795)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值