dma crc,令人吃惊的性能,计算1k个值竟然在0.2us内完成

2019-12-13 18:23发布

本帖最后由 myxiaonia 于 2015-3-12 00:51 编辑

dma实在太强大,stm32f1的crc计算,使用dma传输,在72m主频下,1k次竟然在0.2us内完成。。。。。。。。。。作为对比的软件传递方法,用时128us,这个差距,简直爆出翔了

不敢私藏代码,愿把测试代码奉上,希望对大家有用(计时是用的mdk调试模式时寄存器窗口中的时间值)

  1. #define CRC_START(src, len)     CRC->CR = CRC_CR_RESET;                 
  2.                                {DMA_Channel_TypeDef *ps = DMA2_Channel1;  
  3.                                                                 while(ps->CCR & DMA_CCR1_EN);   
  4.                                 ps->CMAR         = (uint32_t)src;   
  5.                                 ps->CNDTR         = len;            
  6.                                 ps->CCR     |= DMA_CCR1_EN; }


  7. void CRC_DMA_Configuration(void)
  8. {
  9.     RCC->AHBENR          |= 0
  10.                          | RCC_AHBENR_CRCEN
  11.                          | RCC_AHBENR_DMA2EN
  12.                          ;
  13.     DMA2_Channel1->CPAR   = (uint32_t)&CRC->DR;
  14.         DMA2_Channel1->CCR         = 0
  15.                          | DMA_CCR1_MEM2MEM              //M2M模式传送
  16.                          | DMA_CCR1_PLVH                 //优先级最高
  17.                          | DMA_CCR1_MSIZE32              //外设位宽32位
  18.                          | DMA_CCR1_PSIZE32              //缓冲区位宽32位
  19.                          | DMA_CCR1_MINC                //缓冲区地址自增
  20. //                         | DMA_CCR1_PINC                //外设地址不变
  21. //                         | DMA_CCR1_CIRC                //非循环模式
  22.                          | DMA_CCR1_DIR                 //存储器到外设
  23.                          | DMA_CCR1_TEIE                //传输错误中断
  24. //                         | DMA_SxCR_HTIE
  25.                          | DMA_CCR_TCIE                //开启传输完成中断
  26. //                         | DMA_SxCR_EN                  //DMA流使能
  27.                          ;
  28. }


  29. void DMA2_Channel1_IRQHandler(void)
  30. {
  31.     DMA_Channel_TypeDef *pch = DMA2_Channel1;
  32.     DMA_TypeDef *pdma = DMA2;
  33.    
  34.     pch->CCR    &=~DMA_CCR1_EN;
  35.     pdma->IFCR   = DMA_IFCR_CGIF1;
  36. }

  37. uint32_t clc_crc(const uint32_t *ptr,uint32_t length)
  38. {
  39.         CRC->CR=CRC_CR_RESET;
  40.         for( ; length; --length)
  41.                 CRC->DR = *ptr++;
  42.         return CRC->DR;
  43. }

  44. int main(void)
  45. {
  46.     NVIC_SetPriority(DMA2_Channel1_IRQn,NVIC_EncodePriority(3,6,0));
  47.         NVIC_EnableIRQ(DMA2_Channel1_IRQn);
  48.         CRC_DMA_Configuration();
  49.         while(1)
  50.         {
  51.                 clc_crc((uint32_t *)0x2000c000,1024);
  52.                 CRC_START((void *)0x2000c000,1024);
  53.         }
  54. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
40条回答
myxiaonia
1楼-- · 2019-12-13 21:51
NJ8888 发表于 2015-3-12 08:32
怎么可能,dma也要靠时钟,DMA的时钟不会快于你的系统时钟72MHz,13ns*1000=13us呐,反正我不信 ...

其实我也不相信,太不可思议了。。。。。我现在在项目代码测试的话,dma传输1K是160us,比软件传输还慢了,其中这个才是符合预期的,网上有人比较过dma代替memcpy,速度也是比不上的

我也很奇怪怎么会相差这么多,但是crc计算值确实是对的,我现在把这个测试例程发上来,大家看看到底哪里出了问题,为什么会这么快
xl1736
2楼-- · 2019-12-14 00:05
 精彩回答 2  元偷偷看……
ghostxdy
3楼-- · 2019-12-14 03:06
感谢Lz的思路与数据.
感觉只有电子跟计算机的这么晚还不睡。
myxiaonia
4楼-- · 2019-12-14 06:22
ghostxdy 发表于 2015-3-12 02:25
感谢Lz的思路与数据.
感觉只有电子跟计算机的这么晚还不睡。

早上还这么早上班了,是不是很悲摧
lryxr2507
5楼-- · 2019-12-14 07:08
myxiaonia 发表于 2015-3-12 07:30
早上还这么早上班了,是不是很悲摧

收藏.可怜的电工.睡得比狗晚,起的比鸡早.
cyr_hongfeng
6楼-- · 2019-12-14 08:53
睡那么晚研究这点东西,以后身体垮了,会后悔的

一周热门 更多>