微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > SAM4E单片机之旅——20、DMAC之使用Multi-buffer进行内存拷贝

SAM4E单片机之旅——20、DMAC之使用Multi-buffer进行内存拷贝

时间:04-24 来源:互联网 点击:

 = 51;

src2[0] = 52; src2[1] = 53; src2[2] = 54;

设置LLI。

注意,要确保LLI的实例在整个程序的运行过程中都是有效的。比如如果LLI是储存在函数的栈中的话,那么函数退出后,该LLI即无效了。所以可以选择在堆中分配LLI实例的空间,或是将其定义为全局变量,也可以在main函数中定义实例。

LLI first_lli, last_lli;

InitLLI(&first_lli, (void*)src1, 2, &last_lli);

InitLLI(&last_lli, (void*)src2, 3, 0);

启用DMAC。

// PMC

PMC->PMC_PCER0 = 1 << ID_DMAC;

DMAC->DMAC_GCFG =

DMAC_GCFG_ARB_CFG_ROUND_ROBIN; // 轮转优先级

DMAC->DMAC_EN = DMAC_EN_ENABLE;

配置通道。

// 使用的通道为通道0

#define DMAC_CH 0

// 使DSCR指向first_lli

DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_DSCR =

(uint32_t)(void*)(&first_lli);

// 设置目标地址

DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_DADDR =

(uint32_t)(void*) dst;

// 设置CTRLB,使通道从LLI中更新源地址

DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLB =

DMAC_CTRLB_SRC_DSCR_FETCH_FROM_MEM

| DMAC_CTRLB_DST_DSCR_FETCH_DISABLE;

// 配置CFG寄存器

DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CFG =

DMAC_CFG_SOD_DISABLE

| DMAC_CFG_FIFOCFG_ALAP_CFG

;

启用通道。

DMAC->DMAC_CHER = DMAC_CHER_ENA0 << DMAC_CH;

等待通道关闭,即传输完成。

const uint32_t check_bit = DMAC_CHSR_ENA0 << DMAC_CH;

while( (DMAC->DMAC_CHSR & check_bit) != 0);

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top