实测STM32 DMA的数据传输速率不如CPU

测试平台:STM32F407ZGT6

测试内容:用CPU和DMA同样搬运32KB的数据(内存到内存),对比搬运耗时

测试代码:

1.DMA初始化

void SRAM_DMA_Config(u8 *sbuf,u8 *aimbuf,u32 bufsize)
{
  DMA_InitTypeDef  DMA_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
	
	while (DMA_GetCmdStatus(DMA2_Stream3) != DISABLE){}//等待DMA可配置 
		
  DMA_DeInit(DMA2_Stream3);//清空之前该stream3上的所有中断标志
 
  DMA_InitStructure.DMA_Channel = DMA_Channel_4;  //通道选择
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)sbuf;//DMA外设地址
  DMA_InitStructure.DMA_Memory0BaseAddr = (u32)aimbuf;//DMA 存储器0地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;//存储器到外设模式
  DMA_InitStructure.DMA_BufferSize = bufsize;//数据传输量
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//外设非增量模式
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据长度:32位
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存储器数据长度:32位
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式 
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;//最高优先级
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;   //FIFO使能      
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;//全FIFO
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC4;//外设突发4次传输
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_INC4;//存储器突发4次传输
  DMA_Init(DMA2_Stream3, &DMA_InitStructure);//初始化DMA Stream

//	DMA_FlowControllerConfig(DMA2_Stream3,DMA_FlowCtrl_Peripheral);//外设流控制 
	 
//  DMA_Cmd(DMA2_Stream3 ,ENABLE);//开启DMA传输

}

2.DMA传输开始

void sram_dma_start(u32 ndtr)
{
	DMA_Cmd(DMA2_Stream3, DISABLE);                      //关闭DMA传输 
	
	while (DMA_GetCmdStatus(DMA2_Stream3) != DISABLE){}	//确保DMA可以被设置  
		
	DMA_SetCurrDataCounter(DMA2_Stream3,ndtr);          //数据传输量  
	
	DMA_Cmd(DMA2_Stream3, ENABLE);                      //开启DMA传输
	
	while(((DMA2->LISR&(1<<27))==RESET));	//等待传输完成
}

3.测试主程序

printf("copy_buf1=%x %x %x %x %x %x %x\n",copy_buf1[0],copy_buf1[1],copy_buf1[2],copy_buf1[3],copy_buf1[wr_size-7],copy_buf1[wr_size-6],copy_buf1[wr_size-5]);
	SRAM_DMA_Config(copy_buf,copy_buf1,wr_size);
	printf("copy start:%dKB\n",wr_size/1024);
	t3cnt=0;
	sram_dma_start(wr_size);
//	memcpy(copy_buf1,copy_buf,wr_size);
	printf("copy end:%lld\n",t3cnt);
	printf("buf1=%x %x %x %x %x %x %x\n",copy_buf1[0],copy_buf1[1],copy_buf1[2],copy_buf1[3],copy_buf1[wr_size-7],copy_buf1[wr_size-6],copy_buf1[wr_size-5]);
	
	TIM_Cmd(TIM3,DISABLE);

测试结果:

1.DMA

 耗时580us;

2.CPU

耗时430us;

总结: 使用DMA只是省CPU并不省时间

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
对于STM32L431RCT6的DMA配置,可以参考以下步骤和函数: 1. 首先,使用STM32 CubeMX生成源码,选择STM32L431RCT6作为主芯片,并配置串口(UART)和DMA。 引用中提到的步骤是选择主芯片型号和生成新建项目。 2. 在生成的代码中,使用HAL_UART_Init()函数初始化串口,并配置相应的参数,如波特率、数据位等。 3. 使用HAL_UART_Transmit_DMA()函数和HAL_UART_Receive_DMA()函数来配置串口的DMA发送和接收。 引用中提到的函数是HAL_UART_Transmit_DMA()和HAL_UART_Receive_DMA(),分别用于串口DMA模式发送和接收。 4. 在DMA传输完成后,可以使用HAL_UART_DMAStop()函数停止DMA传输。 总结: 配置STM32L431RCT6的DMA,需要使用STM32 CubeMX生成源码,并使用相关函数进行串口和DMA的配置。具体包括使用HAL_UART_Init()函数初始化串口,使用HAL_UART_Transmit_DMA()函数和HAL_UART_Receive_DMA()函数配置串口的DMA发送和接收,最后使用HAL_UART_DMAStop()函数停止DMA传输。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [嵌入式软硬件+STM32L431RCT6+串口DMA收发+STM32新手学习+MCU验证+使用STM32CubeMX](https://download.csdn.net/download/zhej2014/87693942)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [(实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究(ADC)](https://blog.csdn.net/zhej2014/article/details/124361037)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [(实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(DMA)](https://blog.csdn.net/zhej2014/article/details/123976018)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值