17.DMA-2440

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的机制。

posted @ 2016-02-14 11:07  cestlavie  阅读(314)  评论(0编辑  收藏  举报