|
我使用mdma从一块内存向另一块内存传输数据
hal_ret = HAL_MDMA_Start_IT(&hmdma_mdma_channel0_sw_0, (uint32_t)test_data, (uint32_t)test_data2, 128, 1);
当BlockCount==1时则能完成传输, BlockCount>1时, mdma的状态就回不到ready
hal_ret = HAL_MDMA_Start_IT(&hmdma_mdma_channel0_sw_0, (uint32_t)test_data, (uint32_t)test_data2, 128, 2);
我的mdma初始化代码如下:
void MX_MDMA_Init(void)
{
/* MDMA controller clock enable */
__HAL_RCC_MDMA_CLK_ENABLE();
/* Local variables */
/* Configure MDMA channel MDMA_Channel0 */
/* Configure MDMA request hmdma_mdma_channel0_sw_0 on MDMA_Channel0 */
hmdma_mdma_channel0_sw_0.Instance = MDMA_Channel0;
hmdma_mdma_channel0_sw_0.Init.Request = MDMA_REQUEST_SW;
hmdma_mdma_channel0_sw_0.Init.TransferTriggerMode = MDMA_BUFFER_TRANSFER;
hmdma_mdma_channel0_sw_0.Init.Priority = MDMA_PRIORITY_VERY_HIGH;
hmdma_mdma_channel0_sw_0.Init.Endianness = MDMA_LITTLE_ENDIANNESS_PRESERVE;
hmdma_mdma_channel0_sw_0.Init.SourceInc = MDMA_SRC_INC_HALFWORD;
hmdma_mdma_channel0_sw_0.Init.DestinationInc = MDMA_DEST_INC_HALFWORD;
hmdma_mdma_channel0_sw_0.Init.SourceDataSize = MDMA_SRC_DATASIZE_HALFWORD;
hmdma_mdma_channel0_sw_0.Init.DestDataSize = MDMA_DEST_DATASIZE_HALFWORD;
hmdma_mdma_channel0_sw_0.Init.DataAlignment = MDMA_DATAALIGN_PACKENABLE;
hmdma_mdma_channel0_sw_0.Init.BufferTransferLength = 128;
hmdma_mdma_channel0_sw_0.Init.SourceBurst = MDMA_SOURCE_BURST_8BEATS;
hmdma_mdma_channel0_sw_0.Init.DestBurst = MDMA_DEST_BURST_8BEATS;
hmdma_mdma_channel0_sw_0.Init.SourceBlockAddressOffset = 0;
hmdma_mdma_channel0_sw_0.Init.DestBlockAddressOffset = 0;
if (HAL_MDMA_Init(&hmdma_mdma_channel0_sw_0) != HAL_OK)
{
Error_Handler();
}
/* MDMA interrupt initialization */
HAL_MDMA_RegisterCallback(&hmdma_mdma_channel0_sw_0, HAL_MDMA_XFER_BUFFERCPLT_CB_ID, HAL_MDMA_XferCpltCallback);
HAL_MDMA_RegisterCallback(&hmdma_mdma_channel0_sw_0, HAL_MDMA_XFER_BLOCKCPLT_CB_ID, HAL_MDMA_XferCpltCallback);
/* MDMA_IRQn interrupt configuration */
__HAL_MDMA_ENABLE_IT(&hmdma_mdma_channel0_sw_0, MDMA_IT_BFTC | MDMA_IT_TE | MDMA_IT_CTC);
HAL_NVIC_SetPriority(MDMA_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(MDMA_IRQn);
}
我最终的目的是将片上RAM的数据写入到SDRAM中, 由于SDRAM写入比较慢, 所有我先放在片上做了缓存, 缓存满后开启一次发送
|
|