/** * @brief 使能Major LoopLink 功能 * @note 当一个通道结束MajorLoopLink后 自动开始另一个通道的传输 * @param[in] chl DMA通道号 * @arg HW_DMA_CH0 * @arg HW_DMA_CH1 * @arg HW_DMA_CH2 * @arg HW_DMA_CH3 * @param[in] linkChl 需要连接到通道号 * \param[in] flag enable or disable * \arg 0 disable * \arg 1 enable * @retval None */ void DMA_EnableMajorLink(uint8_t chl , uint8_t linkChl, bool flag) { if(flag) { /* enable major loop link */ DMA0->TCD[chl].CSR |= DMA_CSR_MAJORELINK_MASK; /* set chl */ DMA0->TCD[chl].CSR &= ~DMA_CSR_MAJORLINKCH_MASK; DMA0->TCD[chl].CSR |= DMA_CSR_MAJORLINKCH(linkChl); } else { DMA0->TCD[chl].CSR &= ~DMA_CSR_MAJORELINK_MASK; } }
void EDMA_TcdSetChannelLink(edma_tcd_t *tcd, edma_channel_link_type_t type, uint32_t linkedChannel) { assert(tcd != NULL); assert(((uint32_t)tcd & 0x1FU) == 0); assert(linkedChannel < FSL_FEATURE_EDMA_MODULE_CHANNEL); if (type == kEDMA_MinorLink) /* Minor link config */ { uint32_t tmpreg; /* Enable minor link */ tcd->CITER |= DMA_CITER_ELINKYES_ELINK_MASK; tcd->BITER |= DMA_BITER_ELINKYES_ELINK_MASK; /* Set likned channel */ tmpreg = tcd->CITER & (~DMA_CITER_ELINKYES_LINKCH_MASK); tmpreg |= DMA_CITER_ELINKYES_LINKCH(linkedChannel); tcd->CITER = tmpreg; tmpreg = tcd->BITER & (~DMA_BITER_ELINKYES_LINKCH_MASK); tmpreg |= DMA_BITER_ELINKYES_LINKCH(linkedChannel); tcd->BITER = tmpreg; } else if (type == kEDMA_MajorLink) /* Major link config */ { uint32_t tmpreg; /* Enable major link */ tcd->CSR |= DMA_CSR_MAJORELINK_MASK; /* Set major linked channel */ tmpreg = tcd->CSR & (~DMA_CSR_MAJORLINKCH_MASK); tcd->CSR = tmpreg | DMA_CSR_MAJORLINKCH(linkedChannel); } else /* Link none */ { tcd->CITER &= ~DMA_CITER_ELINKYES_ELINK_MASK; tcd->BITER &= ~DMA_BITER_ELINKYES_ELINK_MASK; tcd->CSR &= ~DMA_CSR_MAJORELINK_MASK; } }