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);
- }
|