SAM4E单片机之旅——20、DMAC之使用Multi-buffer进行内存拷贝
= 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);
- SAM4E单片机之旅——24、使用DSP库求向量数量积(05-08)
- SAM4E单片机之旅——23、在AS6(GCC)中使用FPU(05-02)
- SAM4E单片机之旅——22、GMAC和PHY的介绍与初始化(04-28)
- SAM4E单片机之旅——19、CAN间通信(04-19)
- SAM4E单片机之旅——18、通过AFEC(ADC)获取输入的电压(04-17)
- SAM4E单片机之旅——21、DMAC之USART回显(04-26)