码迷,mamicode.com
首页 > 其他好文 > 详细

17.DMA-2440

时间:2016-02-14 11:37:40      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:

17.DMA-2440

首先在前面的实例中,在dev文件夹下增加dma.c文件,然后把它加入到该目录的Makefile里面:

技术分享

技术分享

这样就框架就好了,接下来打开dma.c来实现:

首先打开2440的芯片手册:

我们要操作的是串口0,对应的是通道0:

技术分享

对应的源寄存器:

技术分享

对应的控制寄存器:

技术分享

该寄存器只有两个位:

技术分享

可以看到DMA控制寄存器的[1]位是绝对用的是AHB,还是APB总线。这是从第一章的原理图:

技术分享

可以看到内存用的是AHB总线。

所以源地址的源寄存器应该被设置为:

技术分享

技术分享

目的地址:

技术分享

目的地址的控制寄存器:

技术分享

技术分享

目的寄存器的控制寄存器有三位:

[2]位是控制中断产生的时机,这里选择的是默认,就是设置为0,当计数到0的时候产生中断。

[1]位是选择是AHB或者APB去存放位置,这里是串口,是APB:[1]=1.

技术分享

[0]位是控制在数据传输的过程中,目的地址是否需要变化。这是就一个串口接收数据,所以地址不用变化,所以[0]=1。

技术分享

 

上面是DMA发送和接受的寄存器设置,还有一个DMA控制寄存器的设置:

技术分享

这里是DCON0寄存器的[26:24]:

技术分享

是设置DMA源的,这是使用的是UART0,所以[26:24]=001。

[23]位是表示DMA源是软件还是硬件,这是我们是串口,是硬件,所以是1:

技术分享

[22]位控制的是,当你发送完数据后是否重新发送,这里是不用重复发送的,所以设置1:

技术分享

TC[19:0]位是用来告诉DMA发送数据的大小,DMA才知道啥时候结束。上面Hello FORFISH的长度为13,所以:

技术分享

最终是:

技术分享

到这里DMA的control寄存器的设置就结束了。

最后的函数:

技术分享

该函数就设置好了DMA控制器,接下来就是要设置打开DMA,当DMA打开之后就可以进行数据传输了。

技术分享

 

技术分享

这里打开DMA只需要将DMASKTRIG0寄存器的[1]位设置为1即可:

技术分享

涉及的寄存器列表:

技术分享

注意:最后一个UTXH0是要该寄存器的地址,而不是寄存器的值。定义的时候注意。

在main.c里调用DMA的操作函数:

技术分享

修改好了之后make:

技术分享

烧写到开发板,NandFlash启动:

技术分享

可以看到,通用DMA的方式,把字符串传递到了串口了,实现DMA的机制。

17.DMA-2440

标签:

原文地址:http://www.cnblogs.com/FORFISH/p/5188833.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!