void Start_DMA_Playback() { #if 0 // old demo code if (DMA_Playback_Count == 0) return; #endif DMAMUX0->CHCFG[0] = DMAMUX_CHCFG_SOURCE(54); // initialize source and destination pointers DMA0->DMA[0].SAR = DMA_SAR_SAR((uint32_t) Reload_DMA_Source); DMA0->DMA[0].DAR = DMA_DAR_DAR((uint32_t) (&(DAC0->DAT[0]))); // byte count DMA0->DMA[0].DSR_BCR = DMA_DSR_BCR_BCR(Reload_DMA_Byte_Count); // verify done flag is cleared DMA0->DMA[0].DSR_BCR &= ~DMA_DSR_BCR_DONE_MASK; DMAMUX0->CHCFG[0] |= DMAMUX_CHCFG_ENBL_MASK; // start the timer running TPM0_Start(); }
//====================================================================== //函数名称:DMA_Init() //函数功能:初始化1个DMA模块 //输 入:DMA_Struct_TypeDef *DMA_Struct 需要初始化的DMA结构体地址 //输 出:无 //返 回: 0 : 成功 // -1 : 失败 // -2 : 传输字节数超出范围(<0x0FFFFF) //====================================================================== int DMA_Init(DMA_Struct_TypeDef *DMA_Struct) { if ((*DMA_Struct).DMA_BytesCount > 0x0FFFFF) return (-2); const DMAMUX_x_TypeDef DMAMUX_x = DMAMUX_x_GET((*DMA_Struct).DMAMUX_Source); switch (DMAMUX_x) { case DMAMUX0: SIM_SCGC6 |= SIM_SCGC6_DMAMUX_MASK; break; default: return (-1); } SIM_SCGC7 |= SIM_SCGC7_DMA_MASK; DMAMUX_CHCFG_REG(DMAMUXx[DMAMUX_x], (*DMA_Struct).DMA_CHn) = 0; DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) = 0; DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) &= ~DMA_DCR_DMOD_MASK; const DMAMUX_SRC_TypeDef DMAMUX_SRC = DMAMUX_SRC_GET((*DMA_Struct).DMAMUX_Source); if (DMAMUX_SRC == DMA_SoftTrig) { DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) &= ~DMA_DCR_ERQ_MASK; } else { DMAMUX_CHCFG_REG(DMAMUXx[DMAMUX_x], (*DMA_Struct).DMA_CHn) |= DMAMUX_CHCFG_SOURCE(DMAMUX_SRC); if ((*DMA_Struct).DMAMUX_Trig == DMA_Periodic) DMAMUX_CHCFG_REG(DMAMUXx[DMAMUX_x], (*DMA_Struct).DMA_CHn) |= DMAMUX_CHCFG_TRIG_MASK; else DMAMUX_CHCFG_REG(DMAMUXx[DMAMUX_x], (*DMA_Struct).DMA_CHn) &= ~DMAMUX_CHCFG_TRIG_MASK; } //Source DMA_SAR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) = DMA_SAR_SAR((*DMA_Struct).DMA_Source.DMA_Addr); DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) &= ~DMA_DCR_SSIZE_MASK; DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) |= DMA_DCR_SSIZE((*DMA_Struct).DMA_Source.Data_Size); if ((*DMA_Struct).DMA_Source.Addr_INC == DMA_ADDR_INC) DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) |= DMA_DCR_SINC_MASK; else DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) &= ~DMA_DCR_SINC_MASK; DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) &= ~DMA_DCR_SMOD_MASK; DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) |= DMA_DCR_SMOD((*DMA_Struct).DMA_Source.Addr_MOD); //Destination DMA_DAR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) = DMA_SAR_SAR((*DMA_Struct).DMA_Destination.DMA_Addr); DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) &= ~DMA_DCR_DSIZE_MASK; DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) |= DMA_DCR_DSIZE((*DMA_Struct).DMA_Destination.Data_Size); if ((*DMA_Struct).DMA_Destination.Addr_INC == DMA_ADDR_INC) DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) |= DMA_DCR_DINC_MASK; else DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) &= ~DMA_DCR_DINC_MASK; DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) |= DMA_DCR_DMOD((*DMA_Struct).DMA_Destination.Addr_MOD); DMA_DSR_BCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) &= ~DMA_DSR_BCR_BCR_MASK; DMA_DSR_BCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) |= DMA_DSR_BCR_BCR((*DMA_Struct).DMA_BytesCount); if ((*DMA_Struct).DMA_CycleSteal == DMA_CycleSteal) DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) &= ~DMA_DCR_CS_MASK; else DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) |= DMA_DCR_CS_MASK; if (DMAMUX_SRC == DMA_SoftTrig) DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) |= DMA_DCR_START_MASK; else DMA_DCR_REG(DMAx[0], (*DMA_Struct).DMA_CHn) |= DMA_DCR_ERQ_MASK; //DMAMUX_CHCFG_REG(DMAMUXx[DMAMUX_x], (*DMA_Struct).DMA_CHx) |= DMAMUX_CHCFG_ENBL_MASK; return (0); }