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