这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » ADSP-21489怎么实现DMA功能?

共2条 1/1 1 跳转至

ADSP-21489怎么实现DMA功能?

工程师
2024-01-17 19:59:39     打赏

请问ADSP-21489怎么实现DMA功能?
看了一下例程和手册,还是不太明白怎么操作DMA,请问在C语言下,以UART为例,怎么实现DMA接收串口数据到指定的数组里或者单个变量上?能贴个代码不?




关键词: ADSP-21489     DMA    

助工
2024-01-17 20:00:13     打赏
2楼

ADSP-21489是ADI公司生产的一款数字信号处理器(DSP)产品。实现DMA功能时,可以通过配置DMA的控制寄存器和源/目的地址来实现数据的传输。

以下是一个使用DMA接收UART数据的示例代码:

```c
#include
#include
#include
#include
#include "adi_initialize.h"
#include "adi_uart.h"
#include "adi_dma.h"

// UART相关配置
#define UART_DEVICE_NUM         0
#define UART_FLOW_CONTROL      false
#define UART_BITRATE           115200
#define UART_WORD_LENGTH       ADI_UART_WORDLEN_8BITS
#define UART_PARITY            ADI_UART_PARITY_NONE
#define UART_STOP_BITS         ADI_UART_ONE_STOPBIT

// DMA相关配置
#define DMA_CHANNEL_NUM        0
#define DMA_NUM_TRANSFERS      1
#define DMA_DATA_WIDTH         2   // 数据宽度:2字节(16位)
#define DMA_DATA_TRANSFER_SIZE sizeof(uint16_t) // 数据传输单位大小

// 数据接收缓冲区
#define BUFFER_SIZE            100
uint16_t buffer[BUFFER_SIZE];

// DMA完成中断标志
volatile bool dmaTransferCompleteFlag = false;

// DMA回调函数
static void dmaCallback(void *pCBParam, uint32_t Event, void *pArg)
{
    if (Event == ADI_DMA_EVENT_TRANSFER_COMPLETE)
    {
        dmaTransferCompleteFlag = true;
    }
}

int main(void)
{
    // 系统初始化
    adi_initComponents();

    // 初始化UART
    if (adi_uart_Open(UART_DEVICE_NUM, ADI_UART_DIR_RX, NULL, NULL, &uartDevice) != ADI_UART_SUCCESS)
    {
        printf("UART open failedn");
        return -1;
    }

    if (adi_uart_ConfigData(UART_DEVICE_NUM, UART_WORD_LENGTH, UART_PARITY, UART_STOP_BITS) != ADI_UART_SUCCESS)
    {
        printf("UART configuration failedn");
        return -1;
    }

    if (adi_uart_SetBitrate(UART_DEVICE_NUM, UART_BITRATE) != ADI_UART_SUCCESS)
    {
        printf("UART bitrate configuration failedn");
        return -1;
    }

    // 初始化DMA
    if (adi_dma_Init(NULL) != ADI_DMA_SUCCESS)
    {
        printf("DMA initialization failedn");
        return -1;
    }

    // 配置DMA传输
    ADI_DMA_TRANSFER dmaTransfer = {
        .DestAddr = (void *)buffer,
        .DestAddrMode = ADI_DMA_ADDR_MODE_LINEAR,
        .SrcAddr = ADI_UART_IRQ_RXDATA_UART0,
        .SrcAddrMode = ADI_DMA_ADDR_MODE_PERIPHERAL,
        .DataWidth = DMA_DATA_WIDTH,
        .BytesPerElement = DMA_DATA_TRANSFER_SIZE,
        .ElementCount = BUFFER_SIZE,
        .IncrementDestAddr = true,
        .InterruptOnCompletion = true,
        .UseBurstMode = true,
        .EnableCircularMode = false,
        .CallbackFcn = dmaCallback,
        .CallbackRefCon = NULL
    };

    // 配置DMA传输通道
    if (adi_dma_ChannelAllocate(DMA_CHANNEL_NUM, dmaTransfer.DestAddrMode, NULL) != ADI_DMA_SUCCESS)
    {
        printf("DMA channel allocation failedn");
        return -1;
    }

    if (adi_dma_SetChannelConfig(DMA_CHANNEL_NUM, ADI_DMA_MODE_BASIC, true) != ADI_DMA_SUCCESS)
    {
        printf("DMA channel configuration failedn");
        return -1;
    }

    // 开始DMA传输
    dmaTransferCompleteFlag = false;
    if (adi_dma_SubmitTransfer(DMA_CHANNEL_NUM, &dmaTransfer) != ADI_DMA_SUCCESS)
    {
        printf("DMA transfer submission failedn");
        return -1;
    }

    // 等待DMA传输完成
    while (!dmaTransferCompleteFlag)
    {
        // 可以添加其他处理逻辑
    }

    // 关闭UART和DMA
    adi_uart_Close(UART_DEVICE_NUM);
    adi_dma_Close(DMA_CHANNEL_NUM);

    return 0;
}
```

以上代码实现了使用DMA接收UART数据,并将数据存储在指定的数组中。在代码中,首先通过`adi_uart_Open`打开UART设备,然后配置UART的通信参数。接下来,初始化DMA并配置DMA传输通道和传输参数。最后,通过`adi_dma_SubmitTransfer`提交传输,等待传输完成后,关闭UART和DMA。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]