为了快速传送一个数据块,使用 DMA 传送程序(Mem to Mem 16bits) 测量了一下传送的时间,128个16b数据大约用了12us (72Mhz 时钟)。 换句话来说,STM32 DMA 性能为10M/s
又使用memcpy 来比对一下,用时约4us ,显然memcpy 要快很多。
btw, 在ST的手册里面未见对DMA性能的表述。
----------------------------------
DMA传送数据的速度不会比CPU直接传送数据快,因为总
线频率没有变。
当CPU也在运行执行指令时,DMA传送数据的速度会比CPU直接传送数据慢,这是因为DMA与CPU分时使用同一条总线的缘故。
----------------------------------
有一个专门讲DMA性能的手册的,你可以在官网上找到的
里面对DMA的性能描述得很清楚
AN2548 Using the STM32F101xx and STM32F103xx DMA controller
----------------------------------------
这个说法有点问题
DMA数据传送是memory->memory
memcpy是memory -> cpu_internal_register -> memory
memcpy快应该是因为1. memcpy采用了ldm/stm指令,这个对提高速度很有帮助 2. 总线仲裁偏袒cpu core
---------------------------------------
恩............ DMA控制器并不在memory之内?我想你的意思是指MASTER DMA吧,像PCI那样。但即使是legacy dma,由dma controller通过硬件的方式存取memory在通常情况下也应该比cpu快,因为不需要取指/解码/执行这样的流程。不过stm32的 controller不支持bust mode确实对其速度有很大影响,而ldm/stm指令实际上起到了bust mode的作用,可以在一次取指/解码/执行过程中操作多个数据。如果controller支持burst,相信就可以超越memcpy的速度了。目前来看stm32 dma的速度确实不如memcpy,其最大的好处在于cpu可以不参与其过程。
-----------------------------------
非常同意byeyear 的解释,顺便问一句,其他品牌的M3的DMA是否也不支持 burst 模式?
------------------------------------
DMA并不一定快,只是提高了有效代码的运行效率。
关键字:stm32 DMA 性能资料
引用地址:
stm32 DMA性能资料
推荐阅读最新更新时间:2024-03-16 14:38
STM32每次下载后正常运行,但是断电或复位后程序运行就无法正常运行的解决办法
STM32每次下载程序后能正常运行,但是断电或复位后程序运行就无法正常运行,大概解决办法如下 1、查看boot0和boot1是否都正常接地 2、查询其他外设是否卡死在其中一个里面了, 我遇到的问题是有一个模块有电源控制部分,因为接的电容容量比较大,充电的时间比较长,所以需要进行延时,等待充电完成,才能对模块进行一些列的操作
[单片机]
STM32工程不同系列芯片间的移植
1. 芯片容量的确定,往往容易疏忽。 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、 STM32F102xx和 STM32F103xx微控制器。 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、 STM32F102xx和 STM32F103xx微控制器。 大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控 制器。 互联型产品是指STM32F105xx和STM32F107xx微控制器。 2. 居动文件的选择,不同芯片选择不同的居动文件。 官方库中STM32F10x_StdPeriph_Lib_V3.5.0\L
[单片机]
Keil调试STM32中解析main开始前的工作
Cortex M3的内核有三种启动方式,其分别是: A.通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处; B.通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处; C.通过boot引脚设置可以将中断向量表定位于内置Bootloader区, Cortex-M3内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断入口向量地址,这样在Cortex-M3内核复位后,会自动从起始地址的下一个32位空间取出复位中断入口向量,跳转执行复位中断服务程序。Co
[单片机]
STM32-串口实验学习笔记
USART1_IRQHandler(void)函数: 当串口1发生了相应的中断,就会跳到改函数执行。这里设计了一个小小的接收协议(系统并未定义):通过这个函数,配合一个数组USART_RX_BUF ,一个接收状态寄存器USART_RX_STA实现对串口的数据的接收管理。USART_RX_BUF 最大值为64,也就是一次接收的数据最大不能超过64字节。USART_RX_STA是一个接收状态寄存器,其各位的定义如表所示: (注意:这个是作者设计的协议,怎样判断串口接收一组数据完毕?由于每次接收的数据长度不一样,少的就3个8位数据,多的时候有十多个,这个数据个数是不定的,且没规律的数据,有什么好的方法让它接收完
[单片机]
STM32的嵌套中断系统NVIC和RCC详细整理
STM32的嵌套中断系统NVIC和RCC详细整理 用的是stm32f103的最新3.5的库。 一、综述: 1、STM32 (Cortex-M3) 中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。 1. 何为占先式优先级(pre-emption priority) 高占先式优先级的中断事件会打断当前的主程序/中断程序运行—抢断式优先响应,俗称中断嵌套。 2. 何为副优先级(subpriority) 在占先式优先级相同的情况下,高副优先级的中断优先被响应; 在占先式优先级相同的情况下,如果有
[单片机]
图文教你理解单片机STM32时钟
众所周知STM32有5个时钟源HSI、HSE、LSI、LSE、PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的。 其中,高速时钟(HSE和HSI)提供给 芯片 主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中可以看出高速时钟也可以提供给RTC。内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号. 高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16MHz,我们一般采用8M
[单片机]
意法半导体:低功耗策略的延伸
“现在低功耗看起来是个非常热门的词,但实际上我们04年左右就已经制定这个策略了。”意法半导体大中国区微控制器市场经理James表示。伴随着云计算概念的普及,智能家居再一次被人们所关注,而意法半导体显然不愿意错过终端处理器市场。 STM32L低功耗处理器发布 STM32L处理器是意法半导体最新发布的一款基于Cortex-M3 32位内核的低功耗处理器,与之前的STM32其他系列产品相比,最大的特点是采用了EnergyLite超低功耗平台。 究竟何为EnergyLite呢?意法半导体单片机部市场经理张军辉解释道,“EnergyLite包含两部分,一个是意法半导体独创的130nm技术的抄底漏电流工艺,另外则是与S
[单片机]
一种基于STM32利用始终定时实现延迟的方法
传统上我们常用delay函数进行延迟,然而这种方式有一个很大的弊端那就是需要占用相当长的时钟周期,此时原本该用于计算各类复杂算法的计算内核都要随着系统一起停下来,很不经济也容易造成问题处理不及时的后果。 事实上,我们只需要利用时钟中断的方式,利用一个全局变量作为标志为即可具体程序如下: u8 time3_tmp = 0;//时钟标志 u8 fun_flag;//服务函数标志 void Timer3_Config(void)//配置 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStruture; ////////重定义结构体 TIM_DeInit(TIM3);
[单片机]