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