树莓派Pico‌的pio的dma

main.c

c 复制代码
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/dma.h"

// 源数据缓冲区:将要被DMA复制的数据
const char src[] = "Hello, world! (from DMA)";
// 目标数据缓冲区:DMA复制数据的目的地(大小与源缓冲区一致)
char dst[count_of(src)];

int main() {
    // 初始化所有标准输入输出(用于串口打印)
    stdio_init_all();

    // 获取一个空闲的DMA通道,如果没有可用通道则触发panic(程序终止)
    int chan = dma_claim_unused_channel(true);

    // 配置DMA传输参数:
    // 1. 传输数据宽度为8位(1字节)
    // 2. 读取地址自增:每次传输后,读取指针自动指向源缓冲区下一个字节
    // 3. 写入地址自增:每次传输后,写入指针自动指向目标缓冲区下一个字节
    // 4. 不选择数据请求信号(DREQ),DMA将以最快速度进行传输

    // 获取通道默认配置
    dma_channel_config c = dma_channel_get_default_config(chan);
    // 设置传输数据大小为8位
    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通道
    dma_channel_configure(
            chan,          // 要配置的DMA通道
            &c,            // 上面创建的配置参数
            dst,           // 初始写入地址(目标缓冲区起始位置)
            src,           // 初始读取地址(源缓冲区起始位置)
            count_of(src), // 传输次数:等于源数据的字节数(每次传输1字节)
            true           // 是否立即启动传输:是
    );

    // 可选操作:在DMA传输期间,CPU可以去执行其他任务
    // 本示例中CPU无其他工作,因此阻塞等待DMA传输完成
    dma_channel_wait_for_finish_blocking(chan);

    // DMA已完成数据复制:将源缓冲区(src)的数据复制到了目标缓冲区(dst)
    // 从目标缓冲区读取数据并打印
    puts(dst);
}

CMakeLists.txt

bash 复制代码
cmake_minimum_required(VERSION 3.13)

include(pico_sdk_import.cmake)

project(pio_squarewave C CXX ASM)
pico_sdk_init()

add_executable(pio_squarewave
        main.c
)

pico_generate_pio_header(pio_squarewave ${CMAKE_CURRENT_LIST_DIR}/uart_rx.pio)

target_link_libraries(pio_squarewave  pico_multicore hardware_dma   pico_stdlib hardware_pio)

pico_add_extra_outputs(pio_squarewave)
相关推荐
GeekArch21 小时前
第24讲:Vibe模式代码风格控制——适配Keil/STM32工程规范
人工智能·stm32·单片机·嵌入式硬件·mcu·决策树·ai编程
sramdram2 天前
低功耗MCU微控制器在动态血糖仪(CGM)中的应用方案
单片机·嵌入式硬件·mcu·mcu微控制器
GeekArch5 天前
第8讲:裸机单片机项目——Vibe快速迭代的最优边界
c语言·stm32·单片机·嵌入式硬件·mcu·物联网·ai编程
GeekArch6 天前
第5讲:嵌入式场景二范式决策树:什么情况快写、什么情况严写
人工智能·stm32·单片机·mcu·物联网·决策树·机器学习
不想努力只想躺平的菜鸟ing7 天前
2. UART与TTL UART、CMOS UART、RS232、RS422、RS485、tod
mcu
wuyk55511 天前
38.什么是C语言?从语法到工程落地的工程师视角解读
c语言·开发语言·stm32·单片机·mcu·51单片机
MounRiver_Studio14 天前
RISC-V IDE MRS2调试秘籍(三):通过栈帧可视化模块定位栈溢出、栈内存非法篡改等运行时错误
mcu·risc-v·代码调试
MounRiver_Studio14 天前
RISC-V IDE MRS2调试秘籍(一):通过Memory内存导出对比,锁定隐性内存异常代码
mcu·调试技巧·risc-v·代码调试
sramdram14 天前
灵动高性能32位MCU空调解决方案
单片机·嵌入式硬件·mcu·32位mcu
sramdram16 天前
低功耗MCU芯片电机控制专用
单片机·嵌入式硬件·mcu·低功耗mcu·mcu芯片