使用HAL_DCMI_Start_DMA(&g_dcmi_handle, DCMI_MODE_CON
tiNUOUS, (uint32_t)p_jpeg_data_buf, 15*1024*4);
启动后,只有链表1、2生效,链表3无报错但是无效
/**
* @brief DMA Linked-list DCMIQueue configuration
* @param None
* @retval None
*/
HAL_StatusTypeDef MX_DCMIQueue_Config(void)
{
HAL_StatusTypeDef ret = HAL_OK;
/* DMA node configuration declaration */
DMA_NodeConfTypeDef pNodeConfig;
/* Set node configuration */
pNodeConfig.NodeType = DMA_GPDMA_LINEAR_NODE;//DMA_GPDMA_2D_NODE;//GPDMA二维寻址
pNodeConfig.Init.Request = GPDMA1_REQUEST_DCMI;
pNodeConfig.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;//DMA传输硬件协议,单个传输或者块传输
pNodeConfig.Init.Direction = DMA_PERIPH_TO_MEMORY;//数据搬运方向,外设到内存
pNodeConfig.Init.SrcInc = DMA_SINC_FIXED;//外设地址非自增
pNodeConfig.Init.DestInc = DMA_DINC_INCREMENTED;//内存地址自增
pNodeConfig.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_WORD;//32位
pNodeConfig.Init.DestDataWidth = DMA_DEST_DATAWIDTH_WORD;
pNodeConfig.Init.SrcBurstLength = 1;
pNodeConfig.Init.DestBurstLength = 1;
pNodeConfig.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT0;
pNodeConfig.Init.TransferEventMode = DMA_TCEM_EACH_LL_ITEM_TRANSFER;//DMA_TCEM_BLOCK_TRANSFER;//传输完成事件产生方式
pNodeConfig.RepeatBlockConfig.RepeatCount = 1;//通道重复次数
pNodeConfig.RepeatBlockConfig.SrcAddrOffset = 0;
pNodeConfig.RepeatBlockConfig.DestAddrOffset = 0;
pNodeConfig.RepeatBlockConfig.BlkSrcAddrOffset = 0;
pNodeConfig.RepeatBlockConfig.BlkDestAddrOffset = 0;
pNodeConfig.TriggerConfig.TriggerPolarity = DMA_TRIG_POLARITY_MASKED;//电平边沿,无
pNodeConfig.DataHandlingConfig.DataExchange = DMA_EXCHANGE_NONE;//不开启,字节序交换
pNodeConfig.DataHandlingConfig.DataAlignment = DMA_DATA_RIGHTALIGN_ZEROPADDED;//如果源的数据和目标内存数据宽度不一致,字节对齐的方式
pNodeConfig.SrcAddress = 0;
pNodeConfig.DstAddress = 0;
pNodeConfig.DataSize = 0;
/* Build DCMINode1 Node */
ret |= HAL_DMAEx_List_BuildNode(&pNodeConfig, &DCMINode1);
/* Insert DCMINode1 to Queue */
ret |= HAL_DMAEx_List_InsertNode_Tail(&DCMIQueue, &DCMINode1);
// printf("DCMIQueue.State = %u rn", DCMIQueue.State);
// printf("DCMIQueue.ErrorCode = %u rn", DCMIQueue.ErrorCode);
// printf("DCMIQueue.NodeNumber = %u rn", DCMIQueue.NodeNumber);
/******************************************************************/
pNodeConfig.SrcAddress = (uint32_t)p_jpeg_data_buf + 15*1024*4*1;
pNodeConfig.DstAddress = (uint32_t)&g_dcmi_handle.Instance->DR;
pNodeConfig.DataSize = 15*1024*4;
/* Build DCMINode2 Node */
ret |= HAL_DMAEx_List_BuildNode(&pNodeConfig, &DCMINode2);
/* Insert DCMINode2 to Queue */
ret |= HAL_DMAEx_List_InsertNode_Tail(&DCMIQueue, &DCMINode2);
/******************************************************************/
pNodeConfig.SrcAddress = (uint32_t)p_jpeg_data_buf + 15*1024*4*2;
pNodeConfig.DstAddress = (uint32_t)&g_dcmi_handle.Instance->DR;
pNodeConfig.DataSize = 15*1024*4;
/* Build DCMINode3 Node */
ret |= HAL_DMAEx_List_BuildNode(&pNodeConfig, &DCMINode3);
/* Insert DCMINode3 to Queue */
ret |= HAL_DMAEx_List_InsertNode_Tail(&DCMIQueue, &DCMINode3);
ret |= HAL_DMAEx_List_SetCircularModeConfig(&DCMIQueue, &DCMINode1);//GPDMA链表开启循环模式
//printf("ret2 = %d rn", ret);//返回值是0,hal_ok
return ret;
}