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

  • 相关阅读:
    【剑指offer】3-数组中重复的数字
    自定义管道遇到问题解决方案
    vue的双向绑定示例
    子组件传递给父组件数据
    vue里的共享对象示例
    mysql里的explain介绍
    mysql索引
    修改MySQL字符集
    v-model修饰符示例
    vue下拉列表示例
  • 原文地址:https://www.cnblogs.com/FORFISH/p/5188833.html
Copyright © 2020-2023  润新知