历史上的今天
今天是:2025年01月31日(星期五)
2019年01月31日 | 【stm32f103】DMA应用memory to memory(寄存器版)
2019-01-31 来源:eefocus
注释:此文档是利用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
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;
}
程序运行效果

史海拾趣
|
编译,连接,都通过了,也生成了EXE;(,我是移植的代码,作了修改:wince开发系列问题——1有详细描述如何解决问题的,可能问题出现自我解决问题的方法) 但是悲剧的是: 在模拟器里跑不成,问题如下 void CbmpView::OnDraw(CDC* ...… 查看全部问答> |
|
由于七月外地的比赛,拖了好多天,一直到7月底才开始动工,这个初步情况如下: 1.EEWORLD购买ADI所有的芯片已经到位 2.所有芯片资料都已经阅读和理解完毕 3.所有原理图和PCB已经设计完成并已经制板,开始进入了焊接 ...… 查看全部问答> |
|
我想向大家请教一下,51单片机的数据传输方式是由输入设备先经过存储器再到数据处理器,还是反过来呢? 如果是前一种的话,数据处理之后就直接存储还是先到地主找数据再返回到存储器,由存储器向输出设备?请各位大虾多多打救啊。… 查看全部问答> |
|
昨天申请的样片到了,今天淘宝的最小系统也到了,一个人在实验室焊贴片 这是我第一次焊贴片,焊了4块,有两块焊的很完美,还有两块修修补补也成功了 两个块MSP430F149,两块MSP430F168,引脚是兼容的,用的一种板子 实验室有热风台,开始以为 ...… 查看全部问答> |
|
fatutil.dll 这个看有些人实现多fat 分区会用到这个dll ,在SLC nandflash 上,我现在要做这个功能,但是行不通,这个fatutil.dll 什么用的?… 查看全部问答> |
|
移动电源电路设计: 输入1:3.3到4.2V,输出5V,这个是电池逆变电路 输入2:4.5V到5.5V,输出3.7V,这个是电池充电电路 设计步骤: 第一步,选择两个输入和两个输出,添加电源和负载 第二步,编辑优化设计参数 第三步,检视和编辑项目设计 ...… 查看全部问答> |




