正常情况下,变量存储在SRAM中,如果要发送该变量的值到外设,需要调用内核操作,使SRAM中的数据送到外设。
此类型操作过多会导致占用CPU高,整体卡顿。
-->一般外设地址是固定不动的
Fixed address to fixed address
固定地址 到 固定地址
Fixed address to block of addresses
固定地址 到 地址块
Block of addresses to fixed address
地址块 到 地址块
Block of addresses to block of addresses
地址块 到 地址块
Fill data to block of addresses
填充数据到地址块
Data table to specific address
数据表到特定地址
见注释
#include "ti_msp_dl_config.h"
#define DMA_TRANSFER_SIZE_WORDS (16)
//源数据
const uint32_t gSrcData[DMA_TRANSFER_SIZE_WORDS] = {0x00000000, 0x10101010,
0x20202020, 0x30303030, 0x40404040, 0x50505050, 0x60606060, 0x70707070,
0x80808080, 0x90909090, 0xA0A0A0A0, 0xB0B0B0B0, 0xC0C0C0C0, 0xD0D0D0D0,
0xE0E0E0E0, 0xF0F0F0F0};
//目标地址
uint32_t gDstData[DMA_TRANSFER_SIZE_WORDS];
//DMA触发中断标志
volatile bool gChannel0InterruptTaken = false;
//验证结果标志位
volatile bool gVerifyResult = false;
int main(void)
{
SYSCFG_DL_init();
/* Setup interrupts on device */
DL_SYSCTL_disableSleepOnExit();
NVIC_EnableIRQ(DMA_INT_IRQn);
/* Configure DMA source, destination and size */
//设置源地址
DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) &gSrcData[0]);
//设置目的地址
DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) &gDstData[0]);
//设置传输大小--->多少个uint32数据
DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, sizeof(gSrcData) / sizeof(uint32_t));
//使能开启DMA通道
DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
//开始传输
gChannel0InterruptTaken = false;
DL_DMA_startTransfer(DMA, DMA_CH0_CHAN_ID);
/* 等待块传输完成 */
while (gChannel0InterruptTaken == false)
{
__WFE();
}
//此时已经传输完成,可以验证数据是否正确
gVerifyResult = true;
for (int i = 0; i < DMA_TRANSFER_SIZE_WORDS; i++)
{
/*先比较源数据和目的数据是否相同-->比较出true或false
*再将结果和gVerifyResult进行与运算-->false和任意值进行与运算结果为false
*以此达到验证数组内所有值是否相同的目的*/
gVerifyResult &= gSrcData[i] == gDstData[i];
}
/* 完成传输,使LED灯亮 */
DL_GPIO_clearPins(
GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);
/* 断点检测结果 */
__BKPT(0);
while (1) {
__WFI();
}
}
void DMA_IRQHandler(void)
{
switch (DL_DMA_getPendingInterrupt(DMA))
{
//判断哪个DMA通道产生中断
case DL_DMA_EVENT_IIDX_DMACH0:
gChannel0InterruptTaken = true;
break;
default:
break;
}
}
DMA用到了之前发的SPI通讯里面,在合集里能找到。