K70学习笔记(4.edma)

kinets dma是比较难以理解的,


DMA_ERQ 中的使能与DMA_TCD_CSR寄存器中的bit0(start)到底做什么用,还是搞不清楚


先保留一个可以正常工作的dma程序

函数声明:

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->CERQ = (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 = 16;                /* 每次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传输 */
	//| DMA_CSR_START_MASK
}

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

	dma_clk_init();
	dma1_init();
	dma1_start();
函数执行的结果是

dt_buff0[16]个字节发送到dt_buff1中,

按理论上应该是

一次传输量=major_loop*minor_loop

那么应该传输16*16 = 256字节啊,但是实际没有,不知道为什么


你可能感兴趣的:(K70学习笔记(4.edma))