|

楼主 |
发表于 2019-6-13 17:37:22
|
显示全部楼层
下面是MDMA的测试代码部分:
已经开启最大性能了

- /*
- *********************************************************************************************************
- * 函 数 名: MDMA_SpeedTest
- * 功能说明: MDMA性能测试
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void MDMA_IRQHandler(void)
- {
- HAL_MDMA_IRQHandler(&MDMA_Handle);
- }
- static void MDMA_TransferCompleteCallback(MDMA_HandleTypeDef *hmdma)
- {
- TransferCompleteDetected = 1;
- }
- void MDMA_SpeedTest(void)
- {
- /* MDMA配置 **********************************************************************/
- __HAL_RCC_MDMA_CLK_ENABLE();
- MDMA_Handle.Instance = MDMA_Channel0;
- MDMA_Handle.Init.Request = MDMA_REQUEST_SW; /* 软件触发 */
- MDMA_Handle.Init.TransferTriggerMode = MDMA_BLOCK_TRANSFER; /* 块传输 */
- MDMA_Handle.Init.Priority = MDMA_PRIORITY_HIGH; /* 优先级高*/
- MDMA_Handle.Init.Endianness = MDMA_LITTLE_ENDIANNESS_PRESERVE; /* 小端 */
- MDMA_Handle.Init.SourceInc = MDMA_SRC_INC_DOUBLEWORD; /* 源地址自增,双字,即8字节 */
- MDMA_Handle.Init.DestinationInc = MDMA_DEST_INC_DOUBLEWORD; /* 目的地址自增,双字,即8字节 */
- MDMA_Handle.Init.SourceDataSize = MDMA_SRC_DATASIZE_DOUBLEWORD; /* 源地址数据宽度双字,即8字节 */
- MDMA_Handle.Init.DestDataSize = MDMA_DEST_DATASIZE_DOUBLEWORD; /* 目的地址数据宽度双字,即8字节 */
- MDMA_Handle.Init.DataAlignment = MDMA_DATAALIGN_PACKENABLE; /* 小端,右对齐 */
- MDMA_Handle.Init.SourceBurst = MDMA_SOURCE_BURST_128BEATS; /* 源数据突发传输,128次 */
- MDMA_Handle.Init.DestBurst = MDMA_DEST_BURST_128BEATS; /* 源数据突发传输,128次 */
-
- MDMA_Handle.Init.BufferTransferLength = 128; /* 每次传输128个字节 */
- MDMA_Handle.Init.SourceBlockAddressOffset = 0; /* 用于block传输,地址偏移0 */
- MDMA_Handle.Init.DestBlockAddressOffset = 0; /* 用于block传输,地址偏移0 */
- /* 初始化MDMA */
- if(HAL_MDMA_Init(&MDMA_Handle) != HAL_OK)
- {
- Error_Handler(__FILE__, __LINE__);
- }
- /* 设置传输完成回调和中断及其优先级配置 */
- HAL_MDMA_RegisterCallback(&MDMA_Handle, HAL_MDMA_XFER_CPLT_CB_ID, MDMA_TransferCompleteCallback);
- HAL_NVIC_SetPriority(MDMA_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(MDMA_IRQn);
- /* AXI SRAM的64KB数据传输测试 ***********************************************/
- TransferCompleteDetected = 0;
- HAL_MDMA_Start_IT(&MDMA_Handle,
- (uint32_t)0x24000000,
- (uint32_t)(0x24000000 + 64*1024),
- 64*1024,
- 1);
- start = DWT_CYCCNT;
- while(TransferCompleteDetected == 0) {}
- end = DWT_CYCCNT;
- cnt = end - start;
-
- //64*1024/(cnt/400/1000/1000)/1024/1024 = 64*1000*1000*400/1024/cnt = 25000000/cnt
- printf("MDMA---AXI SRAM内部互传64KB数据耗时 = %dus %dMB/S\r\n", cnt/400, 25000000/cnt);
-
- /* D2域SRAM1的64KB数据传输测试 ***********************************************/
- TransferCompleteDetected = 0;
- HAL_MDMA_Start_IT(&MDMA_Handle,
- (uint32_t)0x30000000,
- (uint32_t)(0x30000000 + 64*1024),
- 64*1024,
- 1);
- start = DWT_CYCCNT;
- while(TransferCompleteDetected == 0) {}
- end = DWT_CYCCNT;
- cnt = end - start;
- printf("MDMA---D2域SRAM1内部互传64KB数据耗时 = %dus %dMB/S\r\n", cnt/400, 25000000/cnt);
-
- /* AXI SRAM向SDRAM的64KB数据传输测试 ***********************************************/
- TransferCompleteDetected = 0;
- HAL_MDMA_Start_IT(&MDMA_Handle,
- (uint32_t)0x24000000,
- (uint32_t)0xC0000000,
- 64*1024,
- 1);
- start = DWT_CYCCNT;
- while(TransferCompleteDetected == 0) {}
- end = DWT_CYCCNT;
- cnt = end - start;
- printf("MDMA---AXI SRAM传输64KB数据到SDRAM耗时 = %dus %dMB/S\r\n", cnt/400, 25000000/cnt);
-
- /* SDRAM的64KB数据传输测试 ***********************************************/
- TransferCompleteDetected = 0;
- HAL_MDMA_Start_IT(&MDMA_Handle,
- (uint32_t)0xC0000000,
- (uint32_t)(0xC0000000 + 64*1024),
- 64*1024,
- 1);
- start = DWT_CYCCNT;
- while(TransferCompleteDetected == 0) {}
- end = DWT_CYCCNT;
- cnt = end - start;
- printf("MDMA---SDRAM内部互传64KB数据耗时 = %dus %dMB/S\r\n", cnt/400, 25000000/cnt);
- }
复制代码
|
|