[Atmel] 用SAM-BA或JLINK跑ATSAM4E16的程序(5)DMA传输

[复制链接]
 楼主| ddllxxrr 发表于 2015-11-2 21:15 | 显示全部楼层 |阅读模式
本程序是通过向一个二维数组有DMA传输来完成的,从而熟悉一下DMA.

首先加入DMA模块,然后通过ASF EXPLORER找到文档。根据例程的提示形成文件:







这个程序可以看出,只是用了二维数组的前二组,就是第一组向第二组传数据,其中第一组是源,第二组是目地。





通过截图可以观察到,数据已经传输成功。


程序如下:
  1. #include <asf.h>



  2. #define DMA_CH 0
  3. #define DMA_BUF_SIZE    32
  4. uint32_t g_dma_buf[6][DMA_BUF_SIZE];



  5. int main (void)
  6. {
  7.         /* Insert system clock initialization code here (sysclk_init()). */

  8.         board_init();
  9.         pmc_enable_periph_clk(ID_DMAC);
  10.        
  11.        
  12.          uint32_t i;
  13.          uint32_t cfg;
  14.          dma_transfer_descriptor_t desc;
  15.          
  16.          for (i = 0; i < DMA_BUF_SIZE; i++) {
  17.                  g_dma_buf[0][i] = i;
  18.                  g_dma_buf[1][i] = 0;
  19.          }
  20.          
  21.          dmac_init(DMAC);
  22.          dmac_set_priority_mode(DMAC, DMAC_PRIORITY_ROUND_ROBIN);
  23.          dmac_enable(DMAC);
  24.          
  25.           cfg = DMAC_CFG_SOD_ENABLE |
  26.           DMAC_CFG_AHB_PROT(1) |
  27.           DMAC_CFG_FIFOCFG_ALAP_CFG;
  28.           dmac_channel_set_configuration(DMAC, DMA_CH, cfg);
  29.           
  30.           
  31.           desc.ul_source_addr = (uint32_t) g_dma_buf[0];
  32.           desc.ul_destination_addr = (uint32_t) g_dma_buf[1];
  33.           
  34.            desc.ul_ctrlA = DMAC_CTRLA_BTSIZE(DMA_BUF_SIZE) |
  35.            DMAC_CTRLA_SRC_WIDTH_WORD |
  36.            DMAC_CTRLA_DST_WIDTH_WORD;
  37.           
  38.            desc.ul_ctrlB = DMAC_CTRLB_SRC_DSCR_FETCH_DISABLE |
  39.            DMAC_CTRLB_DST_DSCR_FETCH_DISABLE |
  40.            DMAC_CTRLB_FC_MEM2MEM_DMA_FC |
  41.            DMAC_CTRLB_SRC_INCR_INCREMENTING |
  42.            DMAC_CTRLB_DST_INCR_INCREMENTING;
  43.           
  44.            desc.ul_descriptor_addr = 0;
  45.            dmac_channel_single_buf_transfer_init(DMAC, DMA_CH, &desc);
  46.           
  47.            dmac_channel_enable(DMAC, DMA_CH);
  48.           
  49.              while (!dmac_channel_is_transfer_done(DMAC, DMA_CH)) {
  50.              }
  51.           
  52.           
  53.        

  54.         /* Insert application code here, after the board has been initialized. */
  55. }



本帖子中包含更多资源

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

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

本版积分规则

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

2403

主题

6994

帖子

68

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