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回调
启动回调
浙公网安备 33010602011771号