【stm32f103】DMA应用memory to memory(寄存器版)

注释

此文档是利用DMA实现memory to memory的搬运可能有的人会说直接用memcpy会更方便,确实是这样,但是此文章仅仅是DMA应用的例子,所以不采用memcpy的方法,并且此历程中不配置DMA中断后续在系统讲解USART章节中再讲解DMA中断

一.DMA1所在总线

所以要先ENABLE DMA所在总线时钟
在这里插入图片描述

RCC->AHBENR = RCC_AHBENR_DMA2EN;

二.DMA寄存器

在这里插入图片描述
寄存器可以参考 参考手册,在这里不做详细讨论

三.编程步骤:

1.使能DMA时钟‘
2.配置DMA外设地址(如果是memroy to meory也需要把memory的地址设置成外设地址,但是需要额外配置DMA CCR寄存器的bit14 MEM2MEM 标志)
3.配置DMA内存地址
4.配置传输方向,配置内存地址是否增加,配置外设地址是否增加,配置优先级等等
5.配置传输的数量
6.使能DMA
7.等待传输完成,清楚完成标志位
四.程序讲解源代码

#include <stm32f10x.h>
 
uint8_t source_buffer[20] = "I am source";
uint8_t dest_buffer[20];
 
int main()
{
	RCC->AHBENR = RCC_AHBENR_DMA2EN;
	
	/* 存储器地址 */
	DMA2_Channel4->CMAR = (uint32_t)source_buffer;
	/* 外设地址 */
	DMA2_Channel4->CPAR = (uint32_t)dest_buffer;
	/* 配置优先级 传输方向 内存2内存 外设地址增加 内存地址增加 */
	DMA2_Channel4->CCR = DMA_CCR4_PL | DMA_CCR4_DIR | DMA_CCR4_MEM2MEM | DMA_CCR4_PINC | DMA_CCR4_MINC;
	/* 传输的数据量 */
	DMA2_Channel4->CNDTR = sizeof(source_buffer);
	
	/* 使能DMA */
	DMA2_Channel4->CCR |= DMA_CCR2_EN;
	
	while ((DMA2->ISR & DMA_ISR_TCIF4) == 0);
	DMA2->IFCR = DMA_IFCR_CTCIF4;
	DMA2_Channel4->CCR &= ~DMA_CCR4_EN;
	
}

程序运行效果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值