[Atmel] 跑一下XMEGA-B1程序(10)DMA

[复制链接]
 楼主| ddllxxrr 发表于 2015-12-30 21:33 | 显示全部楼层 |阅读模式
本帖最后由 ddllxxrr 于 2016-1-4 20:48 编辑

DMA是可以省去CPU而在,外设与外设,外设与内存,内存与内存,内存与外设之间的数据传输。

首先,在没有加入DMA模块之前在ASF列表点开DMA,当然也可加入后在ASF EXPLORER中开打,找到快速指导



根据快速指导完成程序:

首先设置如下:


突发长度:1字节
传输记数:1024
源:在RAM中的缓冲
目地:在RAM中的缓冲
源和目地地址装载模式工:传输结束
源各目地地址方向模式:递增



  1. #include <asf.h>

  2. #define DMA_CHANNEL     0
  3. #define DMA_BUFFER_SIZE 1024
  4. static uint8_t source[DMA_BUFFER_SIZE];
  5. static uint8_t destination[DMA_BUFFER_SIZE];
  6. static void dma_init(void)
  7. {
  8.         struct dma_channel_config dmach_conf;
  9.         memset(&dmach_conf, 0, sizeof(dmach_conf));
  10.         dma_channel_set_burst_length(&dmach_conf, DMA_CH_BURSTLEN_1BYTE_gc);
  11.         dma_channel_set_transfer_count(&dmach_conf, DMA_BUFFER_SIZE);
  12.         dma_channel_set_src_reload_mode(&dmach_conf,
  13.         DMA_CH_SRCRELOAD_TRANSACTION_gc);
  14.         dma_channel_set_dest_reload_mode(&dmach_conf,
  15.         DMA_CH_DESTRELOAD_TRANSACTION_gc);
  16.         dma_channel_set_src_dir_mode(&dmach_conf, DMA_CH_SRCDIR_INC_gc);
  17.         dma_channel_set_source_address(&dmach_conf,
  18.         (uint16_t)(uintptr_t)source);
  19.         dma_channel_set_dest_dir_mode(&dmach_conf, DMA_CH_DESTDIR_INC_gc);
  20.         dma_channel_set_destination_address(&dmach_conf,
  21.         (uint16_t)(uintptr_t)destination);
  22.         dma_enable();
  23.         dma_channel_write_config(DMA_CHANNEL, &dmach_conf);
  24.         dma_channel_enable(DMA_CHANNEL);
  25. }

  26. int main (void)
  27. {
  28.         /* Insert system clock initialization code here (sysclk_init()). */

  29.         //sysclk_init();
  30.         
  31.         
  32.         sysclk_init();
  33.         dma_init();
  34.         
  35.         dma_channel_trigger_block_transfer(DMA_CHANNEL);
  36.         do {} while (dma_get_channel_status(DMA_CHANNEL) != DMA_CH_TRANSFER_COMPLETED);
  37.                
  38.         while(1);        
  39.         
  40. }
为了看清运行结果又把源数组赋值:
  1. #include <asf.h>

  2. #define DMA_CHANNEL     0
  3. #define DMA_BUFFER_SIZE 1024
  4. static uint8_t source[DMA_BUFFER_SIZE];
  5. static uint8_t destination[DMA_BUFFER_SIZE];
  6. static void dma_init(void)
  7. {
  8.         struct dma_channel_config dmach_conf;
  9.         memset(&dmach_conf, 0, sizeof(dmach_conf));
  10.         dma_channel_set_burst_length(&dmach_conf, DMA_CH_BURSTLEN_1BYTE_gc);
  11.         dma_channel_set_transfer_count(&dmach_conf, DMA_BUFFER_SIZE);
  12.         dma_channel_set_src_reload_mode(&dmach_conf,
  13.         DMA_CH_SRCRELOAD_TRANSACTION_gc);
  14.         dma_channel_set_dest_reload_mode(&dmach_conf,
  15.         DMA_CH_DESTRELOAD_TRANSACTION_gc);
  16.         dma_channel_set_src_dir_mode(&dmach_conf, DMA_CH_SRCDIR_INC_gc);
  17.         dma_channel_set_source_address(&dmach_conf,
  18.         (uint16_t)(uintptr_t)source);
  19.         dma_channel_set_dest_dir_mode(&dmach_conf, DMA_CH_DESTDIR_INC_gc);
  20.         dma_channel_set_destination_address(&dmach_conf,
  21.         (uint16_t)(uintptr_t)destination);
  22.         dma_enable();
  23.         dma_channel_write_config(DMA_CHANNEL, &dmach_conf);
  24.         dma_channel_enable(DMA_CHANNEL);
  25. }

  26. int main (void)
  27. {
  28.         /* Insert system clock initialization code here (sysclk_init()). */

  29.         //sysclk_init();
  30.         uint32_t i;
  31.         
  32.         sysclk_init();
  33.         dma_init();
  34.         for(i=0;i<1024;i++)
  35.         {
  36.              source[i]=i;
  37.         }
  38.         dma_channel_trigger_block_transfer(DMA_CHANNEL);
  39.         do {} while (dma_get_channel_status(DMA_CHANNEL) != DMA_CH_TRANSFER_COMPLETED);
  40.                
  41.         while(1);        
  42.         
  43. }

运行结果:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2403

主题

6994

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2403

主题

6994

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部