打印
[Kinetis]

k60 16个通道的dma可以同时使用吗(已解决)

[复制链接]
4272|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangxz|  楼主 | 2014-11-26 11:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
FSL_TICS_Jeremy| | 2014-11-26 14:00 | 只看该作者
你好,楼主!
可以使能16个通道工作的。

使用特权

评论回复
板凳
攻城狮| | 2014-11-26 14:02 | 只看该作者
我手上刚好有个DMA的介绍文档,希望有帮助。
DMA模块详解.pdf (762.58 KB)

使用特权

评论回复
地板
huangxz|  楼主 | 2014-11-26 16:19 | 只看该作者
攻城狮 发表于 2014-11-26 14:02
我手上刚好有个DMA的介绍文档,希望有帮助。

好的,非常谢谢.

使用特权

评论回复
5
huangxz|  楼主 | 2014-11-26 16:49 | 只看该作者
FSL_TICS_Jeremy 发表于 2014-11-26 14:00
你好,楼主!
可以使能16个通道工作的。

您好,这样子dma能工作吗? 我想实现内存之间的拷贝.

uint8_t dt_buff0[16];
uint8_t dt_buff1[16];

void dma_clk_init(void)
{
    /* the corresponding SIM clock gate to be enabled befor the DMAMUX module
    register being initialized */
    SIM->SCGC6 |= SIM_SCGC6_DMAMUX0_MASK;
    /* enable the DMA clock gate in SIM */
    SIM->SCGC7 |= SIM_SCGC7_DMA_MASK;                  /* DMA时钟门控上电默认是打开的,所以这步可加可不加 */
    DMA0->CR = 0;                                      /* 默认配置,需要在DMA被激活之前配置此寄存器 */
       
}

void dma1_init(void)
{
    DMAMUX0->CHCFG[1] =
//  DMAMUX_CHCFG_REG(DMAMUX0, 1) =
        (0
         | DMAMUX_CHCFG_ENBL_MASK              /* 使能DMA通道 */
         //| DMAMUX_CHCFG_TRIG_MASK              /* 打开周期性触发模式,注意只有0~3通道支持 */
         | DMAMUX_CHCFG_SOURCE(63)  /* 指定DMA触发源 */
        );

    DMA0->ERQ &= ~(1 << 1);                                 /* 关闭相应通道的DMA请求,在配置阶段先关闭,再调用myDMA_Start函数开启DMA */

    DMA0->TCD[1].SADDR = (uint32_t)(&dt_buff0[0]);                 /* 分配DMA源地址 */
    DMA0->TCD[1].DADDR = (uint32_t)(&dt_buff1[0]);                 /* 分配DMA目标地址 */
    DMA0->TCD[1].NBYTES_MLNO = 1;                /* 每次minor loop传送1个字节 */
    DMA0->TCD[1].ATTR  =(0
                         |DMA_ATTR_SMOD(0)        /* Source modulo feature disabled */
                         | DMA_ATTR_SSIZE(0)      /* Source size, 8位传送 */
                         | DMA_ATTR_DMOD(0)       /* Destination modulo feature disabled */
                         | DMA_ATTR_DSIZE(0)      /* Destination size, 8位传送 */
                        );
    DMA0->TCD[1].SOFF  = 0x0001;                  /* 每次操作完源地址,源地址增加1 */
    DMA0->TCD[1].DOFF  = 0x0001;                  /* 每次操作完目标地址,目标地址不增加  */
    DMA0->TCD[1].SLAST = 0x00;                    /* DMA完成一次输出之后即major_loop衰减完之后不更改源地址 */
    DMA0->TCD[1].DLAST_SGA = 0x00;                /* DMA完成一次输出之后即major_loop衰减完之后不更改目标地址 */
    //22.3.27 TCD Current Minor Loop Link, Major Loop Count (Channel Linking Disabled)
    DMA0->TCD[1].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(16); /* 1个major loop, 即一次传输量=major_loop*minor_loop,最大为2^15=32767 */
    //22.3.31 TCD Beginning Minor Loop Link, Major Loop Count (Channel Linking Disabled)
    DMA0->TCD[1].BITER_ELINKNO = DMA_CITER_ELINKNO_CITER(16); /* BITER应该等于CITER */

    DMA0->TCD[1].CSR = 0;                         /* 先清零CSR,之后再设置 */
    DMA0->INT &=~(1<<1);                          /* 关闭DMA相应通道的传输完成中断,与TCD_CSR_INTMAJOR或者TCD_CSR_INTHALF搭配 */
    DMA0->TCD[1].CSR &= ~DMA_CSR_INTMAJOR_MASK;   /* 关闭DMA major_loop完成中断 */
    DMA0->TCD[1].CSR |= DMA_CSR_DREQ_MASK;        /* major_loop递减为0时自动关闭DMA,即只进行一次DMA传输 */
}

void dma1_start(void)
{
        int i;
        for(i=0; i<16; i++)
        {
                dt_buff0[i] = i;
        }
        DMA0->SERQ = (1 << 1);
}

使用特权

评论回复
6
FSL_TICS_Jeremy| | 2014-11-26 16:54 | 只看该作者
你好,楼主!
至少从你给出的代码里,没看到有什么比较明显的错误!

使用特权

评论回复
7
huangxz|  楼主 | 2014-11-26 16:58 | 只看该作者
FSL_TICS_Jeremy 发表于 2014-11-26 16:54
你好,楼主!
至少从你给出的代码里,没看到有什么比较明显的错误!

您好,确实,我也没看 出什么问题,就是不工作, 执行了dma1_start()以后,dt_buff[1]的全是0,没有拷贝成功

我还是不明白,内存之间的拷贝,数据源怎么选择,我是选DMA MUX吗,比如我在上面的代码里面用的是63


使用特权

评论回复
8
FSL_TICS_Jeremy| | 2014-11-26 17:27 | 只看该作者
huangxz 发表于 2014-11-26 16:58
您好,确实,我也没看 出什么问题,就是不工作, 执行了dma1_start()以后,dt_buff[1]的全是0,没有拷贝成功

  ...

你好,
我知道,选择63,表示Always enabled,没有什么问题啊。

使用特权

评论回复
9
huangxz|  楼主 | 2014-11-27 17:33 | 只看该作者
FSL_TICS_Jeremy 发表于 2014-11-26 17:27
你好,
我知道,选择63,表示Always enabled,没有什么问题啊。

您好,哪种源叫dma mux源?

使用特权

评论回复
10
FSL_TICS_Jeremy| | 2014-11-28 09:37 | 只看该作者
huangxz 发表于 2014-11-27 17:33
您好,哪种源叫dma mux源?

你好,
翻译成中文的话,就不太好让你理解,我截取了文中的一段对此的说明,可以帮助你理解。

使用特权

评论回复
11
huangxz|  楼主 | 2014-11-28 10:23 | 只看该作者
FSL_TICS_Jeremy 发表于 2014-11-28 09:37
你好,
翻译成中文的话,就不太好让你理解,我截取了文中的一段对此的说明,可以帮助你理解。

就是这16个"总是打开的槽"指的是哪些源,感觉指的就是memory地址空间.
但是没有看到哪里明确说明.

使用特权

评论回复
12
FSL_TICS_Jeremy| | 2014-11-28 11:51 | 只看该作者
huangxz 发表于 2014-11-28 10:23
就是这16个"总是打开的槽"指的是哪些源,感觉指的就是memory地址空间.
但是没有看到哪里明确说明. ...

你好,
我的理解就是不需要硬件触发源,相当于软件触发源,完全有使用者控制啊。
硬件触发的通道也是可以做memory地址间的数据传送的。

使用特权

评论回复
13
FSL_TICS_A| | 2014-12-1 10:38 | 只看该作者
你好,楼主!
如果没有问题,请结贴。
谢谢理解。

使用特权

评论回复
14
huangxz|  楼主 | 2014-12-1 11:28 | 只看该作者
FSL_TICS_A 发表于 2014-12-1 10:38
你好,楼主!
如果没有问题,请结贴。
谢谢理解。

ok,呵呵,还没没有理解这个,希望能够有更加明确的说明.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:醒来才发现,一切都是一场梦

176

主题

4917

帖子

11

粉丝