RP2040 PICOSDK食用指南——DMA2中断

/**
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

// 使用DMA在内存中的两个缓冲区之间复制数据

#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/dma.h"
#include "hardware/irq.h"

// 数据将从src复制到dst
const char src[] = "Hello, world! (from DMA)";
char dst[count_of(src)];

int chan = 0;

void dma_handler() {
    // 清除中断请求
    dma_hw->ints0 = 1u << chan;
    // 打印dst内容
    puts(dst);
}

int main() {
    stdio_init_all();

    // 获取一个空闲通道,如果没有则触发panic()
    chan = dma_claim_unused_channel(true);

    // 8位数据传输。读写地址在每次传输后都会递增
    // (分别指向src或dst中的下一个位置)。
    // 未选择DREQ,因此DMA会以最快速度传输。

    dma_channel_config c = dma_channel_get_default_config(chan);
    channel_config_set_transfer_data_size(&c, DMA_SIZE_8);
    channel_config_set_read_increment(&c, true);
    channel_config_set_write_increment(&c, true);

    dma_channel_configure(
        chan,          // 要配置的通道
        &c,            // 我们刚刚创建的配置
        dst,           // 目标地址
        src,           // 源头地址
        count_of(src), // 传输次数;本例中每次传输1字节
        true           // 立即启动
    );

    // 告诉DMA通道完成块传输时触发IRQ线0
    dma_channel_set_irq0_enabled(chan, true);

    // 配置处理器在DMA IRQ 0触发时执行dma_handler()
    irq_set_exclusive_handler(DMA_IRQ_0, dma_handler);
    irq_set_enabled(DMA_IRQ_0, true);

    // 主循环保持运行状态
    while (true){}
}

前文的标准流程

DMA IRQ设置,完成块传输时的设置

设置DMA回调

启动回调

 

posted @ 2025-07-06 22:58  mcwhirr  阅读(44)  评论(0)    收藏  举报