查看: 2595|回复: 9

[求助] 最近在学习KL46 DMA,想做一个测试DMA传输速率的代码,求教

[复制链接]

该用户从未签到

2

主题

9

帖子

0

新手上路

Rank: 1

积分
44
最后登录
2015-7-1
发表于 2015-6-19 11:59:12 | 显示全部楼层 |阅读模式
最近在学习KL46  DMA,想做一个测试DMA传输速率的代码,但是无奈本人水平有限(高中生),一直没有成功,还有高人指点,如果有现成的代码参考就更好啦,多谢多谢
我知道答案 目前已有9人回答
回复

使用道具 举报

该用户从未签到

2

主题

9

帖子

0

新手上路

Rank: 1

积分
44
最后登录
2015-7-1
 楼主| 发表于 2015-6-19 12:53:13 | 显示全部楼层
急啊  在线等
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-6-19 17:34:30 | 显示全部楼层
楼主是想用DMA传输什么?
源是什么,目的模块是什么?
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16706
    最后登录
    1970-1-1
    发表于 2015-6-19 23:22:07 | 显示全部楼层
    初学者,帮顶
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    9

    帖子

    0

    新手上路

    Rank: 1

    积分
    44
    最后登录
    2015-7-1
     楼主| 发表于 2015-6-22 14:18:09 | 显示全部楼层
    FSL_TICS_ZJJ 发表于 2015-6-19 17:34
    楼主是想用DMA传输什么?
    源是什么,目的模块是什么?

    就是简单的想测试下DMA的传输效率,可以是内存到内存,或者是ADC、UART之类的都可以
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2015-6-23 09:38:52 | 显示全部楼层
    daheishan 发表于 2015-6-22 14:18
    就是简单的想测试下DMA的传输效率,可以是内存到内存,或者是ADC、UART之类的都可以 ...

    现成的代码没有,你需要自己去做,不过关于效率的测试,你可以使用内部的systick去测,看看使用DMA从源开始,到目的接到之后,一共耗掉多少个systick时钟。
    具体你可以参考官方的BME代码。
    官方例程讲解第十九篇:Kinetis KL25 BME例程1
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    9

    帖子

    0

    新手上路

    Rank: 1

    积分
    44
    最后登录
    2015-7-1
     楼主| 发表于 2015-6-26 15:08:25 | 显示全部楼层
    FSL_TICS_ZJJ 发表于 2015-6-23 09:38
    现成的代码没有,你需要自己去做,不过关于效率的测试,你可以使用内部的systick去测,看看使用DMA从源开 ...

    您好,按照您提高的例程改了下,功能是这样的: 先将PTA5设置成输出,然后利用DMA向PTA5赋值1拉高,输出高电平,比较与总线形式赋值的时间差距,仿真在dma_init()出错,提示硬件错误,如下图 QQ截图20150626150835.png
    例程代码如下,麻烦帮忙看下哪里不对,多谢了
    1. #include "common.h"
    2. #include "BME.h"
    3. #include "systick.h"

    4. #ifdef CMSIS
    5. #include "start.h"
    6. #endif

    7. /* Function Declarations */
    8. void logic_op_demo_with_normalc(void);
    9. void logic_op_with_dma(void);
    10. void dma_init(void);
    11. /********************************************************************/
    12. int main (void)
    13. {
    14.        
    15. #ifdef CMSIS  // If we are conforming to CMSIS, we need to call start here
    16.     start();
    17. #endif
    18.        
    19.         dma_init();

    20.         //Logic operation with normal C
    21.         systick_init();       
    22.         logic_op_demo_with_normalc();
    23.         systick_disable();
    24.        
    25.         //Logical operation with BME C macro
    26.         systick_init();       
    27.         logic_op_with_dma();
    28.         systick_disable();
    29.                
    30.         return 0;
    31. }
    32. /********************************************************************/
    33. void dma_init(void)
    34. {     
    35.               uint32 *SOURCE_ADDRESS = (uint32 *)0x20000000;
    36.        *SOURCE_ADDRESS = 0X20;
    37.       // Config DMA Mux for UART0 operation
    38.       // Disable DMA Mux channel first
    39.       DMAMUX0_CHCFG0 = 0x00;
    40.            
    41.       // Clear pending errors and/or the done bit
    42.       if (((DMA_DSR_BCR0 & DMA_DSR_BCR_DONE_MASK) == DMA_DSR_BCR_DONE_MASK)
    43.            | ((DMA_DSR_BCR0 & DMA_DSR_BCR_BES_MASK) == DMA_DSR_BCR_BES_MASK)
    44.            | ((DMA_DSR_BCR0 & DMA_DSR_BCR_BED_MASK) == DMA_DSR_BCR_BED_MASK)
    45.            | ((DMA_DSR_BCR0 & DMA_DSR_BCR_CE_MASK) == DMA_DSR_BCR_CE_MASK))
    46.         DMA_DSR_BCR0 |= DMA_DSR_BCR_DONE_MASK;
    47.       
    48.       // Set Source Address (this is the DATA ADDRESS)
    49.       DMA_SAR0 = 0x20000000;
    50.       
    51.       // Set BCR to know how many bytes to transfer
    52.       DMA_DSR_BCR0 = DMA_DSR_BCR_BCR(4);
    53.       
    54.       // Clear Source size and Destination size fields.  
    55.       DMA_DCR0 &= ~(DMA_DCR_SSIZE_MASK
    56.                     | DMA_DCR_DSIZE_MASK
    57.                     );
    58.       
    59.       // Set DMA as follows:
    60.       //     Source size is byte size
    61.       //     Destination size is byte size
    62.       //     D_REQ cleared automatically by hardware
    63.       //     Destination address will be incremented after each transfer
    64.       //     External Requests are enabled
    65.       DMA_DCR0 |= (DMA_DCR_SSIZE(1)
    66.                    | DMA_DCR_DSIZE(1)
    67.                    | DMA_DCR_D_REQ_MASK
    68.                    | DMA_DCR_ERQ_MASK
    69.                    | DMA_DCR_START_MASK
    70.                    | DMA_DCR_DINC_MASK
    71.                    );
    72.       
    73.       // Set destination address
    74.       DMA_DAR0 = 0x400FF000;   //PORT A DOR ADDRESS
    75.       
    76.       // Enables the DMA channel and select the DMA Channel Source  
    77.       DMAMUX0_CHCFG0 = 0x02; //DMAMUX_CHCFG_ENBL_MASK|DMAMUX_CHCFG_SOURCE(0x31); //0xb1;
    78.       DMAMUX0_CHCFG0 |= DMAMUX_CHCFG_ENBL_MASK;
    79. }


    80. void logic_op_demo_with_normalc(void)
    81. {
    82.     uint32_t cnt_start_value;
    83.     uint32_t cnt_end_value;
    84.        
    85.         uint32_t execution_cycle;        //actual execution cycle
    86.   
    87.     //configure PTA5 as GPIO
    88.     PORTA_PCR5 = PORT_PCR_MUX(1);
    89.   
    90.     //configure PTA5 as output pin
    91.     GPIOA_PDDR |= 0x20;
    92.   
    93.     cnt_start_value = SYST_CVR;
    94.   
    95.     GPIOA_PDOR ^= 0x20;
    96.   
    97.     cnt_end_value = SYST_CVR;
    98.        
    99.         execution_cycle = cnt_start_value - cnt_end_value - overhead;
    100.        
    101. #ifdef DEBUG_PRINT
    102.         printf("systick start value: 0x%x\n\r", cnt_start_value);
    103.         printf("systick end value: 0x%x\n\r", cnt_end_value);
    104.         printf("actual execution cycle for logic operation with normal C code: 0x%x\n\r", execution_cycle);
    105. #endif               
    106. }

    107. void logic_op_with_dma(void)
    108. {
    109.         uint32_t cnt_start_value;
    110.     uint32_t cnt_end_value;
    111.        
    112.         uint32_t execution_cycle;        //actual execution cycle
    113.   
    114.     //configure PTA5 as GPIO
    115.     PORTA_PCR5 = PORT_PCR_MUX(1);
    116.   
    117.     //configure PTA5 as output pin
    118.     GPIOA_PDDR |= 0x20;
    119.   
    120.     cnt_start_value = SYST_CVR;

    121.         //BME_XOR_W(&GPIOA_PDOR, 0x20);
    122.     DMA_DCR0  |= (1 << 16);
    123.        
    124.         cnt_end_value = SYST_CVR;

    125.         execution_cycle = cnt_start_value - cnt_end_value - overhead;
    126.        
    127. #ifdef DEBUG_PRINT
    128.         printf("systick start value: 0x%x\n\r", cnt_start_value);
    129.         printf("systick end value: 0x%x\n\r", cnt_end_value);
    130.         printf("actual execution cycle for logic operation with DMA: 0x%x\n\r", execution_cycle);
    131. #endif               
    132. }
    复制代码



    回复 支持 反对

    使用道具 举报

    该用户从未签到

    24

    主题

    502

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1363
    最后登录
    1970-1-1
    发表于 2015-6-26 16:25:16 | 显示全部楼层
    呵呵,学习了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    9

    帖子

    0

    新手上路

    Rank: 1

    积分
    44
    最后登录
    2015-7-1
     楼主| 发表于 2015-6-29 19:52:24 | 显示全部楼层
    FSL_TICS_ZJJ 发表于 2015-6-23 09:38
    现成的代码没有,你需要自己去做,不过关于效率的测试,你可以使用内部的systick去测,看看使用DMA从源开 ...

    求帮忙看下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    111

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    366
    最后登录
    2017-2-9
    发表于 2016-1-5 12:00:30 | 显示全部楼层
    LZ问题解决了没,我也需要测试DMA传输速率,苦于没有什么好的方法,求帮助
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-23 10:31 , Processed in 0.115229 second(s), 32 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表