当前位置: 首页 > news >正文

S32 Design Studio PE工具配置DMA

工具配置

DMA位置跟设备不一样,在Referenced_components里面。

Configurations里面就默认配置就行

channels是比较重要的,一条信号传输用到一个通道。可以选择UART、ADC、CAN之类的,这里用在了SPI通讯里面。

生成代码

在 Generated_Code\dmaController1.c里面,对应刚才配置的信息。

edma_state_t dmaController1_State;edma_chn_state_t dmaController1Chn0_State;edma_chn_state_t dmaController1Chn1_State;edma_chn_state_t * const edmaChnStateArray[] = {&dmaController1Chn0_State,&dmaController1Chn1_State
};edma_channel_config_t dmaController1Chn0_Config = {//通道0配置.channelPriority = EDMA_CHN_DEFAULT_PRIORITY,.virtChnConfig = EDMA_CHN0_NUMBER,.source = EDMA_REQ_LPSPI0_RX,.callback = NULL,.callbackParam = NULL,.enableTrigger = false
};
edma_channel_config_t dmaController1Chn1_Config = {//通道1配置.channelPriority = EDMA_CHN_DEFAULT_PRIORITY,.virtChnConfig = EDMA_CHN1_NUMBER,.source = EDMA_REQ_LPSPI0_TX,.callback = NULL,.callbackParam = NULL,.enableTrigger = false
};
const edma_channel_config_t * const edmaChnConfigArray[] = {//通道数组&dmaController1Chn0_Config,&dmaController1Chn1_Config
};const edma_user_config_t dmaController1_InitConfig0 = {//控制器配置.chnArbitration = EDMA_ARBITRATION_FIXED_PRIORITY,.haltOnError = false
};

接口使用

EDMA_DRV_Init

初始化接口,基本上调用这个就能把DMA用起来,里面的参数都是自动生成的。

EDMA_DRV_Init(&dmaController1_State,&dmaController1_InitConfig0,edmaChnStateArray, edmaChnConfigArray,EDMA_CONFIGURED_CHANNELS_COUNT);

函数原型

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_Init* Description   : Initializes the eDMA module.** Implements    : EDMA_DRV_Init_Activity*END**************************************************************************/
status_t EDMA_DRV_Init(edma_state_t *edmaState,const edma_user_config_t *userConfig,edma_chn_state_t * const chnStateArray[],const edma_channel_config_t * const chnConfigArray[],uint32_t chnCount)
{uint32_t index = 0U;DMA_Type *edmaRegBase = NULL;IRQn_Type irqNumber = NotAvail_IRQn;status_t edmaStatus = STATUS_SUCCESS;status_t chnInitStatus = STATUS_SUCCESS;
#if defined (CUSTOM_DEVASSERT) || defined (DEV_ERROR_DETECT)uint32_t freq = 0U;status_t clockManagerStatus = STATUS_SUCCESS;
#endif/* Check the state and configuration structure pointers are valid */DEV_ASSERT((edmaState != NULL) && (userConfig != NULL));/* Check the module has not already been initialized */DEV_ASSERT(s_virtEdmaState == NULL);#if defined (CUSTOM_DEVASSERT) || defined (DEV_ERROR_DETECT)/* Check that eDMA and DMAMUX modules are clock gated on */for (index = 0U; index < (uint32_t)DMA_INSTANCE_COUNT; index++){clockManagerStatus = CLOCK_SYS_GetFreq(s_edmaClockNames[index], &freq);DEV_ASSERT(clockManagerStatus == STATUS_SUCCESS);}
#ifdef FEATURE_DMAMUX_AVAILABLEfor (index = 0U; index < (uint32_t)DMAMUX_INSTANCE_COUNT; index++){clockManagerStatus = CLOCK_SYS_GetFreq(s_dmamuxClockNames[index], &freq);DEV_ASSERT(clockManagerStatus == STATUS_SUCCESS);}
#endif /* FEATURE_DMAMUX_AVAILABLE */
#endif /* (CUSTOM_DEVASSERT) || defined (DEV_ERROR_DETECT) *//* Save the runtime state structure for the driver */s_virtEdmaState = edmaState;/* Clear the state structure. */EDMA_DRV_ClearStructure((uint8_t *)s_virtEdmaState, sizeof(edma_state_t));/* Init all DMA instances */for(index = 0U; index < (uint32_t)DMA_INSTANCE_COUNT; index++){edmaRegBase = s_edmaBase[index];/* Init eDMA module on hardware level. */EDMA_Init(edmaRegBase);#ifdef FEATURE_DMA_HWV3/* Set arbitration mode */EDMA_SetChannelArbitrationMode(edmaRegBase, userConfig->chnArbitration);
#else /* FEATURE_DMA_HWV3 *//* Set arbitration mode */EDMA_SetChannelArbitrationMode(edmaRegBase, userConfig->chnArbitration);
#if (FEATURE_DMA_CHANNEL_GROUP_COUNT > 0x1U)        EDMA_SetGroupArbitrationMode(edmaRegBase, userConfig->groupArbitration);EDMA_SetGroupPriority(edmaRegBase, userConfig->groupPriority);
#endif /* (FEATURE_DMA_CHANNEL_GROUP_COUNT > 0x1U) */
#endif /* FEATURE_DMA_HWV3 *//* Set 'Halt on error' configuration */EDMA_SetHaltOnErrorCmd(edmaRegBase, userConfig->haltOnError);}#if defined FEATURE_DMA_HAS_ERROR_IRQ/* Enable the error interrupts for eDMA module. */for (index = 0U; index < (uint32_t)FEATURE_DMA_VIRTUAL_ERROR_INTERRUPT_LINES; index++){/* Enable channel interrupt ID. */irqNumber = s_edmaErrIrqId[index];INT_SYS_EnableIRQ(irqNumber);}
#endif/* Register all edma channel interrupt handlers into vector table. */for (index = 0U; index < (uint32_t)FEATURE_DMA_VIRTUAL_CHANNELS_INTERRUPT_LINES; index++){/* Enable channel interrupt ID. */irqNumber = s_edmaIrqId[index];INT_SYS_EnableIRQ(irqNumber);}#ifdef FEATURE_DMAMUX_AVAILABLE/* Initialize all DMAMUX instances */for (index = 0U; index < (uint32_t)DMAMUX_INSTANCE_COUNT; index++){DMAMUX_Init(s_dmaMuxBase[index]);}
#endif/* Initialize the channels based on configuration list */if ((chnStateArray != NULL) && (chnConfigArray != NULL)){for (index = 0U; index < chnCount; index++){chnInitStatus = EDMA_DRV_ChannelInit(chnStateArray[index], chnConfigArray[index]);if (chnInitStatus != STATUS_SUCCESS){edmaStatus = chnInitStatus;}}}return edmaStatus;
}

EDMA_DRV_Deinit

逆初始化接口

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_Deinit* Description   : Deinitialize EDMA.** Implements    : EDMA_DRV_Deinit_Activity*END**************************************************************************/
status_t EDMA_DRV_Deinit(void)
{uint32_t index = 0U;IRQn_Type irqNumber = NotAvail_IRQn;const edma_chn_state_t *chnState = NULL;#if defined FEATURE_DMA_HAS_ERROR_IRQ/* Disable the error interrupts for eDMA module. */for (index = 0U; index < (uint32_t)FEATURE_DMA_VIRTUAL_ERROR_INTERRUPT_LINES; index++){/* Enable channel interrupt ID. */irqNumber = s_edmaErrIrqId[index];INT_SYS_DisableIRQ(irqNumber);}
#endifif (s_virtEdmaState != NULL){/* Release all edma channel. */for (index = 0U; index < (uint32_t)FEATURE_DMA_VIRTUAL_CHANNELS; index++){/* Release all channels. */chnState = s_virtEdmaState->virtChnState[index];if (chnState != NULL){(void) EDMA_DRV_ReleaseChannel(chnState->virtChn);}}for (index = 0U; index < (uint32_t)FEATURE_DMA_VIRTUAL_CHANNELS_INTERRUPT_LINES; index++){/* Disable channel interrupts. */irqNumber = s_edmaIrqId[index];INT_SYS_DisableIRQ(irqNumber);}}s_virtEdmaState = NULL;return STATUS_SUCCESS;
}

EDMA_DRV_ChannelInit

通道初始化,在初始化接口里面有调用,不用再另外调用。

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_ChannelInit* Description   : Initialize EDMA channel.** Implements    : EDMA_DRV_ChannelInit_Activity*END**************************************************************************/
status_t EDMA_DRV_ChannelInit(edma_chn_state_t *edmaChannelState,const edma_channel_config_t *edmaChannelConfig)
{/* Check the state and configuration structure pointers are valid */DEV_ASSERT((edmaChannelState != NULL) && (edmaChannelConfig != NULL));/* Check if the module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check the channel has not already been allocated */DEV_ASSERT(s_virtEdmaState->virtChnState[edmaChannelConfig->virtChnConfig] == NULL);    /* Check if the channel defined by user in the channel configuration structure is valid */DEV_ASSERT(edmaChannelConfig->virtChnConfig < FEATURE_DMA_VIRTUAL_CHANNELS);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(edmaChannelConfig->virtChnConfig);/* Get DMA channel from virtual channel */uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(edmaChannelConfig->virtChnConfig);/* Get virtual channel value */uint8_t virtualChannel = edmaChannelConfig->virtChnConfig;/* Get status */status_t retStatus = STATUS_SUCCESS;/* Load corresponding DMA instance pointer */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];/* Reset the channel state structure to default value. */EDMA_DRV_ClearStructure((uint8_t *)edmaChannelState, sizeof(edma_chn_state_t));#ifdef FEATURE_DMAMUX_AVAILABLE     retStatus = EDMA_DRV_SetChannelRequestAndTrigger(edmaChannelConfig->virtChnConfig, (uint8_t)edmaChannelConfig->source, edmaChannelConfig->enableTrigger);
#endif    /* Clear the TCD registers for this channel */EDMA_TCDClearReg(edmaRegBase, dmaChannel);#ifdef FEATURE_DMAMUX_AVAILABLE if (retStatus == STATUS_SUCCESS)
#endif{/* Set virtual channel state */s_virtEdmaState->virtChnState[virtualChannel] = edmaChannelState;    /* Set virtual channel value */s_virtEdmaState->virtChnState[virtualChannel]->virtChn = virtualChannel;        /* Set virtual channel status to normal */s_virtEdmaState->virtChnState[virtualChannel]->status = EDMA_CHN_NORMAL;/* Enable error interrupt for this channel */EDMA_SetErrorIntCmd(edmaRegBase, dmaChannel, true);        
#ifdef FEATURE_DMA_HWV3/* Put the channel in a priority group, as defined in configuration */EDMA_SetChannelPriorityGroup(edmaRegBase, dmaChannel, edmaChannelConfig->groupPriority);
#endif/* Set the channel priority, as defined in the configuration, only if fixed arbitration mode is selected */if ((EDMA_GetChannelArbitrationMode(edmaRegBase) == EDMA_ARBITRATION_FIXED_PRIORITY) &&(edmaChannelConfig->channelPriority != EDMA_CHN_DEFAULT_PRIORITY)){EDMA_SetChannelPriority(edmaRegBase, dmaChannel, edmaChannelConfig->channelPriority);}/* Install the user callback */retStatus = EDMA_DRV_InstallCallback(edmaChannelConfig->virtChnConfig, edmaChannelConfig->callback, edmaChannelConfig->callbackParam);}return retStatus;
}

EDMA_DRV_InstallCallback

安装回调函数

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_InstallCallback* Description   : Register callback function and parameter.** Implements    : EDMA_DRV_InstallCallback_Activity*END**************************************************************************/
status_t EDMA_DRV_InstallCallback(uint8_t virtualChannel,edma_callback_t callback,void *parameter)
{/* Check the channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check the channel is allocated */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);s_virtEdmaState->virtChnState[virtualChannel]->callback = callback;s_virtEdmaState->virtChnState[virtualChannel]->parameter = parameter;return STATUS_SUCCESS;
}

EDMA_DRV_ReleaseChannel

释放通道软硬件

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_ReleaseChannel* Description   : Free eDMA channel's hardware and software resource.** Implements    : EDMA_DRV_ReleaseChannel_Activity*END**************************************************************************/
status_t EDMA_DRV_ReleaseChannel(uint8_t virtualChannel)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check the DMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Get pointer to channel state */edma_chn_state_t *chnState = s_virtEdmaState->virtChnState[virtualChannel];/* Check that virtual channel is initialized */DEV_ASSERT(chnState != NULL);DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];/* Stop edma channel. */EDMA_SetDmaRequestCmd(edmaRegBase, dmaChannel, false);/* Reset the channel state structure to default value. */EDMA_DRV_ClearStructure((uint8_t *)chnState, sizeof(edma_chn_state_t));s_virtEdmaState->virtChnState[virtualChannel] = NULL;return STATUS_SUCCESS;
}

EDMA_DRV_ClearIntStatus

清除所有中断状态

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_ClearIntStatus* Description   : Clear done and interrupt retStatus.**END**************************************************************************/
static void EDMA_DRV_ClearIntStatus(uint8_t virtualChannel)
{/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_ClearDoneStatusFlag(edmaRegBase, dmaChannel);EDMA_ClearIntStatusFlag(edmaRegBase, dmaChannel);
}

EDMA_DRV_ClearSoftwareTCD

清除软件TCD结构体

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_ClearSoftwareTCD* Description   : Clear the software tcd structure.**END**************************************************************************/
static void EDMA_DRV_ClearSoftwareTCD(edma_software_tcd_t *stcd)
{EDMA_DRV_ClearStructure((uint8_t *)stcd, sizeof(edma_software_tcd_t));
}

EDMA_DRV_IRQHandler

默认的中断处理函数

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_IRQHandler* Description   : EDMA IRQ handler.*END**************************************************************************/
void EDMA_DRV_IRQHandler(uint8_t virtualChannel)
{const edma_chn_state_t *chnState = s_virtEdmaState->virtChnState[virtualChannel];EDMA_DRV_ClearIntStatus(virtualChannel);if (chnState != NULL){if (chnState->callback != NULL){chnState->callback(chnState->parameter, chnState->status);}}
}

EDMA_DRV_ErrorIRQHandler

错误中断处理函数

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_ErrorIRQHandler* Description   : EDMA error IRQ handler*END**************************************************************************/
void EDMA_DRV_ErrorIRQHandler(uint8_t virtualChannel)
{/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_SetDmaRequestCmd(edmaRegBase, dmaChannel, false);edma_chn_state_t *chnState = s_virtEdmaState->virtChnState[virtualChannel];if (chnState != NULL){EDMA_DRV_ClearIntStatus(virtualChannel);EDMA_ClearErrorIntStatusFlag(edmaRegBase, dmaChannel);chnState->status = EDMA_CHN_ERROR;if (chnState->callback != NULL){chnState->callback(chnState->parameter, chnState->status);}}
}

EDMA_DRV_ConfigSingleBlockTransfer

配置信号块传输

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_ConfigSingleBlockTransfer* Description   : Configures a DMA single block transfer.** Implements    : EDMA_DRV_ConfigSingleBlockTransfer_Activity*END**************************************************************************/
status_t EDMA_DRV_ConfigSingleBlockTransfer(uint8_t virtualChannel,edma_transfer_type_t type,uint32_t srcAddr,uint32_t destAddr,edma_transfer_size_t transferSize,uint32_t dataBufferSize)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);#if defined (CUSTOM_DEVASSERT) || defined (DEV_ERROR_DETECT)/* Check if the value passed for 'transferSize' is valid */DEV_ASSERT(EDMA_DRV_ValidTransferSize(transferSize));
#endif/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];uint8_t transferOffset;status_t retStatus = STATUS_SUCCESS;/* Compute the transfer offset, based on transfer size.* The number of bytes transferred in each source read/destination write* is obtained with the following formula:*    source_read_size = 2^SSIZE*    destination_write_size = 2^DSIZE*/transferOffset = (uint8_t) (1U << ((uint8_t)transferSize));/* The number of bytes to be transferred (buffer size) must* be a multiple of the source read/destination write size*/if ((dataBufferSize % transferOffset) != 0U){retStatus = STATUS_ERROR;}if (retStatus == STATUS_SUCCESS){/* Clear transfer control descriptor for the current channel */EDMA_TCDClearReg(edmaRegBase, dmaChannel);  #ifdef FEATURE_DMA_ENGINE_STALL/* Configure the DMA Engine to stall for a number of cycles after each R/W */EDMA_TCDSetEngineStall(edmaRegBase, dmaChannel, EDMA_ENGINE_STALL_4_CYCLES);
#endif#ifdef FEATURE_DMA_HWV3EDMA_SetMinorLoopMappingCmd(edmaRegBase, dmaChannel, false);
#elseEDMA_SetMinorLoopMappingCmd(edmaRegBase, false);
#endif/* Configure source and destination addresses */EDMA_TCDSetSrcAddr(edmaRegBase, dmaChannel, srcAddr);EDMA_TCDSetDestAddr(edmaRegBase, dmaChannel, destAddr);/* Set transfer size (1B/2B/4B/16B/32B) */EDMA_TCDSetAttribute(edmaRegBase, dmaChannel, EDMA_MODULO_OFF, EDMA_MODULO_OFF, transferSize, transferSize);/* Configure source/destination offset. */switch (type){case EDMA_TRANSFER_PERIPH2MEM:EDMA_TCDSetSrcOffset(edmaRegBase, dmaChannel, 0);EDMA_TCDSetDestOffset(edmaRegBase, dmaChannel, (int8_t) transferOffset);break;case EDMA_TRANSFER_MEM2PERIPH:EDMA_TCDSetSrcOffset(edmaRegBase, dmaChannel, (int8_t) transferOffset);EDMA_TCDSetDestOffset(edmaRegBase, dmaChannel, 0);break;case EDMA_TRANSFER_MEM2MEM:EDMA_TCDSetSrcOffset(edmaRegBase, dmaChannel, (int8_t) transferOffset);EDMA_TCDSetDestOffset(edmaRegBase, dmaChannel, (int8_t) transferOffset);break;case EDMA_TRANSFER_PERIPH2PERIPH:EDMA_TCDSetSrcOffset(edmaRegBase, dmaChannel, 0);EDMA_TCDSetDestOffset(edmaRegBase, dmaChannel, 0);break;default:/* This should never be reached - all the possible values have been handled. */break;}/* Set the total number of bytes to be transfered */EDMA_TCDSetNbytes(edmaRegBase, dmaChannel, dataBufferSize);/* Set major iteration count to 1 (single block mode) */EDMA_TCDSetMajorCount(edmaRegBase, dmaChannel, 1U);/* Enable interrupt when the transfer completes */EDMA_TCDSetMajorCompleteIntCmd(edmaRegBase, dmaChannel, true);/* Set virtual channel status to normal */s_virtEdmaState->virtChnState[virtualChannel]->status = EDMA_CHN_NORMAL;    }return retStatus;
}

EDMA_DRV_ConfigMultiBlockTransfer

配置复合信号块传输

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_ConfigMultiBlockTransfer* Description   : Configures a DMA single block transfer.** Implements    : EDMA_DRV_ConfigMultiBlockTransfer_Activity*END**************************************************************************/
status_t EDMA_DRV_ConfigMultiBlockTransfer(uint8_t virtualChannel,edma_transfer_type_t type,uint32_t srcAddr,uint32_t destAddr,edma_transfer_size_t transferSize,uint32_t blockSize,uint32_t blockCount,bool disableReqOnCompletion)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);status_t retStatus = STATUS_SUCCESS;/* Configure the transfer for one data block */retStatus = EDMA_DRV_ConfigSingleBlockTransfer(virtualChannel, type, srcAddr, destAddr, transferSize, blockSize);if (retStatus == STATUS_SUCCESS){DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];/* Set the number of data blocks */EDMA_TCDSetMajorCount(edmaRegBase, dmaChannel, blockCount);/* Enable/disable requests upon completion */EDMA_TCDSetDisableDmaRequestAfterTCDDoneCmd(edmaRegBase, dmaChannel, disableReqOnCompletion);}return retStatus;
}

EDMA_DRV_ConfigLoopTransfer

配置轮询传输

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_ConfigLoopTransfer* Description   : Configures the DMA transfer in a loop.** Implements    : EDMA_DRV_ConfigLoopTransfer_Activity*END**************************************************************************/
status_t EDMA_DRV_ConfigLoopTransfer(uint8_t virtualChannel,const edma_transfer_config_t *transferConfig)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Check the transfer configuration structure is valid */DEV_ASSERT(transferConfig != NULL);/* Check the minor/major loop properties are defined */DEV_ASSERT(transferConfig->loopTransferConfig != NULL);/* If the modulo feature is enabled, check alignment of addresses */DEV_ASSERT((transferConfig->srcModulo == EDMA_MODULO_OFF) ||((transferConfig->srcAddr % (((uint32_t)1U) << (uint32_t)transferConfig->srcModulo)) == 0U));DEV_ASSERT((transferConfig->destModulo == EDMA_MODULO_OFF) ||((transferConfig->destAddr % (((uint32_t)1U) << (uint32_t)transferConfig->destModulo)) == 0U));/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);#ifdef FEATURE_DMA_HWV3/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);
#endifDMA_Type *edmaRegBase = s_edmaBase[dmaInstance];#ifdef FEATURE_DMA_HWV3EDMA_SetMinorLoopMappingCmd(edmaRegBase, dmaChannel, true);
#elseEDMA_SetMinorLoopMappingCmd(edmaRegBase, true);
#endif/* Write the configuration in the transfer control descriptor registers */EDMA_DRV_PushConfigToReg(virtualChannel, transferConfig);/* Set virtual channel status to normal */s_virtEdmaState->virtChnState[virtualChannel]->status = EDMA_CHN_NORMAL;return STATUS_SUCCESS;
}

EDMA_DRV_ConfigScatterGatherTransfer

配置分散或者聚集操作

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_ConfigScatterGatherTransfer* Description   : Configure eDMA for scatter/gather operation** Implements    : EDMA_DRV_ConfigScatterGatherTransfer_Activity*END**************************************************************************/
status_t EDMA_DRV_ConfigScatterGatherTransfer(uint8_t virtualChannel,edma_software_tcd_t *stcd,edma_transfer_size_t transferSize,uint32_t bytesOnEachRequest,const edma_scatter_gather_list_t *srcList,const edma_scatter_gather_list_t *destList,uint8_t tcdCount)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Check the input arrays for scatter/gather operation are valid */DEV_ASSERT((stcd != NULL) && (srcList != NULL) && (destList != NULL));#if defined (CUSTOM_DEVASSERT) || defined (DEV_ERROR_DETECT)/* Check if the value passed for 'transferSize' is valid */DEV_ASSERT(EDMA_DRV_ValidTransferSize(transferSize));
#endifuint8_t i = 0U;uint16_t transferOffset = 0U;uint32_t stcdAlignedAddr = STCD_ADDR(stcd);edma_software_tcd_t *edmaSwTcdAddr = (edma_software_tcd_t *)stcdAlignedAddr;edma_loop_transfer_config_t edmaLoopConfig;edma_transfer_config_t edmaTransferConfig;status_t retStatus = STATUS_SUCCESS;/* Set virtual channel status to normal */s_virtEdmaState->virtChnState[virtualChannel]->status = EDMA_CHN_NORMAL;    /* Compute the transfer offset, based on transfer size.* The number of bytes transferred in each source read/destination write* is obtained with the following formula:*    source_read_size = 2^SSIZE*    destination_write_size = 2^DSIZE*/transferOffset = (uint16_t) (1UL << ((uint16_t)transferSize));/* The number of bytes to be transferred on each request must* be a multiple of the source read/destination write size*/if ((bytesOnEachRequest % transferOffset) != 0U){retStatus = STATUS_ERROR;}/* Clear the configuration structures before initializing them. */EDMA_DRV_ClearStructure((uint8_t *)(&edmaTransferConfig), sizeof(edma_transfer_config_t));EDMA_DRV_ClearStructure((uint8_t *)(&edmaLoopConfig), sizeof(edma_loop_transfer_config_t));/* Configure the transfer for scatter/gather mode. */edmaTransferConfig.srcLastAddrAdjust = 0;edmaTransferConfig.destLastAddrAdjust = 0;edmaTransferConfig.srcModulo = EDMA_MODULO_OFF;edmaTransferConfig.destModulo = EDMA_MODULO_OFF;edmaTransferConfig.srcTransferSize = transferSize;edmaTransferConfig.destTransferSize = transferSize;edmaTransferConfig.minorByteTransferCount = bytesOnEachRequest;edmaTransferConfig.interruptEnable = true;edmaTransferConfig.scatterGatherEnable = true;edmaTransferConfig.loopTransferConfig = &edmaLoopConfig;edmaTransferConfig.loopTransferConfig->srcOffsetEnable = false;edmaTransferConfig.loopTransferConfig->dstOffsetEnable = false;edmaTransferConfig.loopTransferConfig->minorLoopChnLinkEnable = false;edmaTransferConfig.loopTransferConfig->majorLoopChnLinkEnable = false;/* Copy scatter/gather lists to transfer configuration*/for (i = 0U; (i < tcdCount) && (retStatus == STATUS_SUCCESS); i++){edmaTransferConfig.srcAddr = srcList[i].address;edmaTransferConfig.destAddr = destList[i].address;if ((srcList[i].length != destList[i].length) || (srcList[i].type != destList[i].type)){retStatus = STATUS_ERROR;break;}edmaTransferConfig.loopTransferConfig->majorLoopIterationCount = srcList[i].length/bytesOnEachRequest;switch (srcList[i].type){case EDMA_TRANSFER_PERIPH2MEM:/* Configure Source Read. */edmaTransferConfig.srcOffset = 0;/* Configure Dest Write. */edmaTransferConfig.destOffset = (int16_t) transferOffset;break;case EDMA_TRANSFER_MEM2PERIPH:/* Configure Source Read. */edmaTransferConfig.srcOffset = (int16_t) transferOffset;/* Configure Dest Write. */edmaTransferConfig.destOffset = 0;break;case EDMA_TRANSFER_MEM2MEM:/* Configure Source Read. */edmaTransferConfig.srcOffset = (int16_t) transferOffset;/* Configure Dest Write. */edmaTransferConfig.destOffset = (int16_t) transferOffset;break;case EDMA_TRANSFER_PERIPH2PERIPH:/* Configure Source Read. */edmaTransferConfig.srcOffset = 0;/* Configure Dest Write. */edmaTransferConfig.destOffset = 0;break;default:/* This should never be reached - all the possible values have been handled. */break;}/* Configure the pointer to next software TCD structure; for the last one, this address should be 0 */if (i == ((uint8_t)(tcdCount - 1U))){edmaTransferConfig.scatterGatherNextDescAddr = 0U;}else{edma_software_tcd_t * ptNextAddr = &edmaSwTcdAddr[i];edmaTransferConfig.scatterGatherNextDescAddr = ((uint32_t) ptNextAddr);}if (i == 0U){/* Push the configuration for the first descriptor to registers */EDMA_DRV_PushConfigToReg(virtualChannel, &edmaTransferConfig);}else{/* Copy configuration to software TCD structure */EDMA_DRV_PushConfigToSTCD(&edmaTransferConfig, &edmaSwTcdAddr[i - 1U]);}}return retStatus;
}

EDMA_DRV_StartChannel

开启通道,这个在SPI里面调用到

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_StartChannel* Description   : Starts an eDMA channel.** Implements    : EDMA_DRV_StartChannel_Activity*END**************************************************************************/
status_t EDMA_DRV_StartChannel(uint8_t virtualChannel)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Enable requests for current channel */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_SetDmaRequestCmd(edmaRegBase, dmaChannel, true);return STATUS_SUCCESS;
}

EDMA_DRV_StopChannel

暂停通道

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_StopChannel* Description   : Stops an eDMA channel.** Implements    : EDMA_DRV_StopChannel_Activity*END**************************************************************************/
status_t EDMA_DRV_StopChannel(uint8_t virtualChannel)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Disable requests for current channel */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_SetDmaRequestCmd(edmaRegBase, dmaChannel, false);return STATUS_SUCCESS;
}

EDMA_DRV_SetChannelRequestAndTrigger

设置通道请求和触发

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_SetChannelRequestAndTrigger* Description   : Sets DMA channel request source in DMAMUX and controls*                 the DMA channel periodic triggering.** Implements    : EDMA_DRV_SetChannelRequestAndTrigger_Activity*END**************************************************************************/
status_t EDMA_DRV_SetChannelRequestAndTrigger(uint8_t virtualChannel,uint8_t request,bool enableTrigger)
{/* Check the virtual channel number is valid */DEV_ASSERT(virtualChannel < (uint32_t)FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);#ifdef FEATURE_DMAMUX_AVAILABLE/* Retrieve the DMAMUX instance serving this request */uint8_t dmaMuxInstance = (uint8_t)FEATURE_DMAMUX_REQ_SRC_TO_INSTANCE(request);/* Get request index for the corresponding DMAMUX instance */uint8_t dmaMuxRequest = (uint8_t)FEATURE_DMAMUX_REQ_SRC_TO_CH(request);/* Get DMAMUX channel for the selected request */uint8_t dmaMuxChannel = (uint8_t)FEATURE_DMAMUX_DMA_CH_TO_CH(virtualChannel);/* Retrieve the appropriate DMAMUX instance */DMAMUX_Type *dmaMuxRegBase = s_dmaMuxBase[dmaMuxInstance];/* Set request and trigger */DMAMUX_SetChannelCmd(dmaMuxRegBase, dmaMuxChannel, false);DMAMUX_SetChannelSource(dmaMuxRegBase, dmaMuxChannel, dmaMuxRequest);
#ifdef FEATURE_DMAMUX_HAS_TRIG	DMAMUX_SetChannelTrigger(dmaMuxRegBase, dmaMuxChannel, enableTrigger);
#else(void)enableTrigger;	
#endif	DMAMUX_SetChannelCmd(dmaMuxRegBase, dmaMuxChannel, true);return STATUS_SUCCESS;
#else(void)virtualChannel;    (void)request;(void)enableTrigger;    return STATUS_UNSUPPORTED;
#endif
}

EDMA_DRV_ClearTCD

清除TCD结构体

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_ClearTCD* Description   : Clears all registers to 0 for the hardware TCD.** Implements    : EDMA_DRV_ClearTCD_Activity*END**************************************************************************/
void EDMA_DRV_ClearTCD(uint8_t virtualChannel)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Clear the TCD memory */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_TCDClearReg(edmaRegBase, dmaChannel);
}

EDMA_DRV_SetSrcAddr

设置源地址

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_SetSrcAddr* Description   : Configures the source address for the eDMA channel.** Implements    : EDMA_DRV_SetSrcAddr_Activity*END**************************************************************************/
void EDMA_DRV_SetSrcAddr(uint8_t virtualChannel,uint32_t address)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Set channel TCD source address */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_TCDSetSrcAddr(edmaRegBase, dmaChannel, address);
}

EDMA_DRV_SetSrcOffset

设置原地址偏移

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_SetSrcOffset* Description   : Configures the source address signed offset for the eDMA channel.** Implements    : EDMA_DRV_SetSrcOffset_Activity*END**************************************************************************/
void EDMA_DRV_SetSrcOffset(uint8_t virtualChannel,int16_t offset)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Set channel TCD source offset */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_TCDSetSrcOffset(edmaRegBase, dmaChannel, offset);
}

EDMA_DRV_SetSrcReadChunkSize

配置源读数据块大小

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_SetSrcReadChunkSize* Description   : Configures the source read data chunk size (transferred in a read sequence).** Implements    : EDMA_DRV_SetSrcReadChunkSize_Activity*END**************************************************************************/
void EDMA_DRV_SetSrcReadChunkSize(uint8_t virtualChannel,edma_transfer_size_t size)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Set channel TCD source transfer size */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_TCDSetSrcTransferSize(edmaRegBase, dmaChannel, size);
}

EDMA_DRV_SetSrcLastAddrAdjustment

配置源地址最后一次调整

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_SetSrcLastAddrAdjustment* Description   : Configures the source address last adjustment.** Implements    : EDMA_DRV_SetSrcLastAddrAdjustment_Activity*END**************************************************************************/
void EDMA_DRV_SetSrcLastAddrAdjustment(uint8_t virtualChannel,int32_t adjust)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Set channel TCD source last adjustment */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_TCDSetSrcLastAdjust(edmaRegBase, dmaChannel, adjust);
}

EDMA_DRV_SetDestLastAddrAdjustment

配置目标地址最后一次调整

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_SetDestLastAddrAdjustment* Description   : Configures the source address last adjustment.** Implements    : EDMA_DRV_SetDestLastAddrAdjustment_Activity*END**************************************************************************/
void EDMA_DRV_SetDestLastAddrAdjustment(uint8_t virtualChannel,int32_t adjust)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Set channel TCD source last adjustment */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_TCDSetDestLastAdjust(edmaRegBase, dmaChannel, adjust);
}

EDMA_DRV_SetDestAddr

设置目标地址

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_SetDestAddr* Description   : Configures the destination address for the eDMA channel.** Implements    : EDMA_DRV_SetDestAddr_Activity*END**************************************************************************/
void EDMA_DRV_SetDestAddr(uint8_t virtualChannel,uint32_t address)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Set channel TCD destination address */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_TCDSetDestAddr(edmaRegBase, dmaChannel, address);
}

EDMA_DRV_SetDestOffset

设置目标地址偏移

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_SetDestOffset* Description   : Configures the destination address signed offset for the eDMA channel.** Implements    : EDMA_DRV_SetDestOffset_Activity*END**************************************************************************/
void EDMA_DRV_SetDestOffset(uint8_t virtualChannel,int16_t offset)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Set channel TCD destination offset */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_TCDSetDestOffset(edmaRegBase, dmaChannel, offset);
}

EDMA_DRV_SetDestWriteChunkSize

配置写入目标地址数据块大小

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_SetDestWriteChunkSize* Description   : Configures the destination data chunk size (transferred in a write sequence).** Implements    : EDMA_DRV_SetDestWriteChunkSize_Activity*END**************************************************************************/
void EDMA_DRV_SetDestWriteChunkSize(uint8_t virtualChannel,edma_transfer_size_t size)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Set channel TCD source transfer size */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_TCDSetDestTransferSize(edmaRegBase, dmaChannel, size);
}

EDMA_DRV_SetMinorLoopBlockSize

配置通道的每个服务请求中传输的字节数

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_SetMinorLoopBlockSize* Description   : Configures the number of bytes to be transferred in each service request of the channel.** Implements    : EDMA_DRV_SetMinorLoopBlockSize_Activity*END**************************************************************************/
void EDMA_DRV_SetMinorLoopBlockSize(uint8_t virtualChannel,uint32_t nbytes)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Set channel TCD minor loop block size */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_TCDSetNbytes(edmaRegBase, dmaChannel, nbytes);
}

EDMA_DRV_SetMajorLoopIterationCount

配置主循环迭代的次数

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_SetMajorLoopIterationCount* Description   : Configures the number of major loop iterations.** Implements    : EDMA_DRV_SetMajorLoopIterationCount_Activity*END**************************************************************************/
void EDMA_DRV_SetMajorLoopIterationCount(uint8_t virtualChannel,uint32_t majorLoopCount)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Set the major loop iteration count */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_TCDSetMajorCount(edmaRegBase, dmaChannel, majorLoopCount);
}

EDMA_DRV_GetRemainingMajorIterationsCount

返回剩余的主循环迭代计数

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_GetRemainingMajorIterationsCount* Description   : Returns the remaining major loop iteration count.** Implements    : EDMA_DRV_GetRemainingMajorIterationsCount_Activity*END**************************************************************************/
uint32_t EDMA_DRV_GetRemainingMajorIterationsCount(uint8_t virtualChannel)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Retrieve the number of minor loops yet to be triggered */const DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];uint32_t count = EDMA_TCDGetCurrentMajorCount(edmaRegBase, dmaChannel);return count;
}

EDMA_DRV_SetScatterGatherLink

配置下一个TCD的内存地址

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_SetScatterGatherLink* Description   : Configures the memory address of the next TCD, in scatter/gather mode.** Implements    : EDMA_DRV_SetScatterGatherLink_Activity*END**************************************************************************/
void EDMA_DRV_SetScatterGatherLink(uint8_t virtualChannel,uint32_t nextTCDAddr)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Configures the memory address of the next TCD */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_TCDSetScatterGatherLink(edmaRegBase, dmaChannel, nextTCDAddr);
}

EDMA_DRV_DisableRequestsOnTransferComplete

在TCD的主循环完成后禁用/启用DMA请求

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_DisableRequestsOnTransferComplete* Description   : Disables/Enables the DMA request after the major loop completes for the TCD.** Implements    : EDMA_DRV_DisableRequestsOnTransferComplete_Activity*END**************************************************************************/
void EDMA_DRV_DisableRequestsOnTransferComplete(uint8_t virtualChannel,bool disable)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Disables/Enables the DMA request upon TCD completion */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_TCDSetDisableDmaRequestAfterTCDDoneCmd(edmaRegBase, dmaChannel, disable);
}

EDMA_DRV_ConfigureInterrupt

使能失能通道中断

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_ConfigureInterrupt* Description   : Disables/Enables the channel interrupt requests.** Implements    : EDMA_DRV_ConfigureInterrupt_Activity*END**************************************************************************/
void EDMA_DRV_ConfigureInterrupt(uint8_t virtualChannel,edma_channel_interrupt_t intSrc,bool enable)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Disables/Enables the channel interrupt requests. */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];switch (intSrc){case EDMA_CHN_ERR_INT:/* Enable channel interrupt request when error conditions occur */EDMA_SetErrorIntCmd(edmaRegBase, dmaChannel, enable);break;case EDMA_CHN_HALF_MAJOR_LOOP_INT:/* Enable channel interrupt request when major iteration count reaches halfway point */EDMA_TCDSetMajorHalfCompleteIntCmd(edmaRegBase, dmaChannel, enable);break;case EDMA_CHN_MAJOR_LOOP_INT:/* Enable channel interrupt request when major iteration count reaches zero */EDMA_TCDSetMajorCompleteIntCmd(edmaRegBase, dmaChannel, enable);break;default:/* This branch should never be reached if driver API is used properly */break;}
}

EDMA_DRV_CancelTransfer

取消传输

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_CancelTransfer* Description   : Cancels the running transfer for this channel.** Implements    : EDMA_DRV_CancelTransfer_Activity*END**************************************************************************/
void EDMA_DRV_CancelTransfer(bool error)
{/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);uint32_t dmaInstance = 0U;for(dmaInstance = 0U; dmaInstance < (uint32_t)DMA_INSTANCE_COUNT; dmaInstance++){/* Cancel the running transfer. */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];if (error){EDMA_CancelTransferWithError(edmaRegBase);}else{EDMA_CancelTransfer(edmaRegBase);}}
}

EDMA_DRV_TriggerSwRequest

触发DMA请求

/*FUNCTION************************************************************************ Function Name : EDMA_DRV_TriggerSwRequest* Description   : Triggers a sw request for the current channel.** Implements    : EDMA_DRV_TriggerSwRequest_Activity*END**************************************************************************/
void EDMA_DRV_TriggerSwRequest(uint8_t virtualChannel)
{/* Check that virtual channel number is valid */DEV_ASSERT(virtualChannel < FEATURE_DMA_VIRTUAL_CHANNELS);/* Check that eDMA module is initialized */DEV_ASSERT(s_virtEdmaState != NULL);/* Check that virtual channel is initialized */DEV_ASSERT(s_virtEdmaState->virtChnState[virtualChannel] != NULL);/* Get DMA instance from virtual channel */uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);/* Get DMA channel from virtual channel*/uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);/* Trigger the channel transfer. */DMA_Type *edmaRegBase = s_edmaBase[dmaInstance];EDMA_TriggerChannelStart(edmaRegBase, dmaChannel);
}

相关文章:

S32 Design Studio PE工具配置DMA

工具配置 DMA位置跟设备不一样&#xff0c;在Referenced_components里面。 Configurations里面就默认配置就行 channels是比较重要的&#xff0c;一条信号传输用到一个通道。可以选择UART、ADC、CAN之类的&#xff0c;这里用在了SPI通讯里面。 生成代码 在 Generated_Code\dm…...

【Effective C++】36绝不重新定义继承而来的non-virtual 函数

例子如下&#xff1a; class B { public:void mf(); };class D : public B {};D x; // x是一个类型为D的对象 // 方式一 B* pB &x // 获得一个pB 指向 x pB->mf(); // 经由指针调用mf// 方式二 D* pD &x // 获得一个指针指向x pD->mf(); // 经由指针调用mf我…...

STM32-DMA数据转运

DMA进行转运的条件 1&#xff1a;开关控制&#xff0c;DMA_CMD必须使能2&#xff1a;传输计数器必须大于03&#xff1a;触发源必须有触发的信号...

Vue 3 + TypeScript 项目中全局挂载并使用工具函数

一、proxy方式 1.封装日期选择工具函数&#xff1a; 在untils文件夹下新建index.ts,并导出工具函数 /*** 获取不同类型日期* param&#xff1a;类型 dateVal: 是否指定*/ export function getSystemDate(param: any, dateVal: any) {let systemDate dateVal ? new Date(da…...

第二门课:改善深层神经网络<超参数调试、正则化及优化>-超参数调试、Batch正则化和程序框架

文章目录 1 调试处理2 为超参数选择合适的范围3 超参数调试的实践4 归一化网络的激活函数5 将Batch Norm拟合进神经网络6 Batch Norm为什么会奏效&#xff1f;7 测试时的Batch Norm8 SoftMax回归9 训练一个SoftMax分类器10 深度学习框架11 TensorFlow 1 调试处理 需要调试的参…...

漫谈微服务网关

一、什么是服务网关 服务网关 路由转发 过滤器 1、路由转发&#xff1a;接收一切外界请求&#xff0c;转发到后端的微服务上去&#xff1b; 2、过滤器&#xff1a;在服务网关中可以完成一系列的横切功能&#xff0c;例如权限校验、限流以及监控等&#xff0c;这些都可以通过…...

进击的PostgreSQL

目录 前言 一、什么是PostgreSQL 1.PostgreSQL的定义 2.PostgreSQL功能和特性 2.1数据类型 2.2数据完整性 2.3并发性、性能 2.4可靠性、灾难恢复 2.5安全 2.6扩展 2.7国际化、文本搜索 二、部署PostgreSQL 1.下载与安装 2.配置数据库 3.配置远程访问 4.修改配置…...

本地gitlab-runner的创建与注册

引言 之前通过一些方式在本地创建runner&#xff0c;时而会出现一些未知的坑&#xff0c;所以写下本文记录runner可以无坑创建的方式。 以下注册runner到相应仓库的前提是已经在本地安装了gitlab-runner 具体安装方式见官网 本地gitlab-runner安装常用的指令 查看gitlab r…...

《UE5_C++多人TPS完整教程》学习笔记28 ——《P29 Mixamo 动画(Mixamo Animations)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P29 Mixamo动画&#xff08;Mixamo Animations&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者…...

剑指offer力扣题集

剑指offer Krahets前辈整理的题解&#xff0c;这个博客为了方便自己刷题和复习&#xff0c;加油&#xff01; 01. 数组中重复的数字 力扣链接 02. 二维数组中的查找 力扣链接 03. 替换空格 力扣链接 04. 从尾到头打印链表 力扣链接 05. 重建二叉树 力扣链接好难 -_-…...

【商业|数据科学主题会议推荐】2024年商业分析与数据科学国际学术会议(ICBADS 2024)

【商业|数据科学主题会议推荐】2024年商业分析与数据科学国际学术会议&#xff08;ICBADS 2024) 征稿主题 &#xff08;以下主题包括但不限于&#xff09; 多媒体决策 决策理论与决策科学 数字市场设计与运营 降维 电子商务 道德决策 财务分析 群体决策与软件 医疗保…...

爬虫技术实战案例解析

目录 前言 案例背景 案例实现 案例总结 结语 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊爬虫技术实战案例解析&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1…...

Git 使用笔记

基本操作&#xff1a; 初始化 &#xff08;git init&#xff09; 使用背景和作用&#xff1a; 在本地建立一个文件夹后&#xff0c;基于这个文件夹进行git 操作&#xff0c;赋予git操作本文件夹的权限 。查看当前文件夹状态&#xff08;git status&#xff09; 每次打开文件夹…...

python -- 语法与变量

你好, 我是木木, 目前正在做两件事   1. 沉淀自己的专业知识   2. 探索了解各种副业项目&#xff0c;同时将探索过程进行分享&#xff0c;帮助自己以及更多朋友找到副业, 做好副业 文末有惊喜 语法的简要说明 每种语言都有自己的语法&#xff0c;不管是自然语言&#xff08;…...

24计算机考研调剂 | 太原科技大学

2024年太原科技大学 力学专业 接收研究生调剂通告 考研调剂招生信息 招生专业&#xff1a; 080100&#xff08;力学&#xff09; 01先进材料变形行为及力学性能 02 计算力学及其应用 03结构动力学与无损检测 04复合材料断裂理论与结构设计 补充内容 调剂考生基本要求 &…...

Leetcode 204. 计数质数 java题解

https://leetcode.cn/problems/count-primes/description/ 法一 class Solution {public int countPrimes(int n) {int count0;for(int i2;i<n;i){//判断i是否质数boolean ftrue;for(int j1;j*j<i;j){//因子if(j!1&&j!i&&(i%j0)){ffalse;break;}}if(f){…...

机器学习——终身学习

终身学习 AI不断学习新的任务&#xff0c;最终进化成天网控制人类终身学习&#xff08;LLL&#xff09;&#xff0c;持续学习&#xff0c;永不停止的学习&#xff0c;增量学习 用线上收集的资料不断的训练模型 问题就是对之前的任务进行遗忘&#xff0c;在之前的任务上表现不好…...

一次完整的 HTTP 请求所经历的步骤

1&#xff1a; DNS 解析(通过访问的域名找出其 IP 地址&#xff0c;递归搜索)。 2&#xff1a; HTTP 请求&#xff0c;当输入一个请求时&#xff0c;建立一个 Socket 连接发起 TCP的 3 次握手。如果是 HTTPS 请求&#xff0c;会略微有不同。 3&#xff1a; 客户端向服务器发…...

OpenGL学习笔记【1】——简介

一、OpenGL概念 OpenGL (Open Graphics Library&#xff0c;译名&#xff1a;开放式图形库开放式图形库) 是一种用于渲染 2D 和 3D 图形的跨语言、跨平台的编程接口(API)。 二、OpenGL跨语言 OpenGL 是一个 C 语言库&#xff0c;因此理解 C 语言&#xff08;或 C&#xff09;的…...

C语言课后作业 20 题+考研上机应用题

题目 1: 计算圆的面积 描述&#xff1a; 输入圆的半径&#xff0c;计算并输出圆的面积。 题目 2: 判断一个年份是否为闰年 描述&#xff1a; 输入一个年份&#xff0c;判断并输出该年份是否为闰年。 题目 3: 计算并输出斐波那契数列的前10个数 描述&#xff1a; 输出斐波那…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...