news 2026/5/9 12:27:49

GD32中的DMA使用教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GD32中的DMA使用教程

一、概述

  • 平台:GD32F4XX
  • 资源:DMA,当前系列的DMA可分为DMA0和DMA1,每个DMA各有8个通道,总共16个通道可以映射到外设,提供使用
  • 数据:长度最大65536,支持8位,16位和32位的数据宽度

二、外设请求

三、查表

在手册中获取到DMA的外设请求表后,就需要根据“外设功能”去查表,以SPI2为例

  1. 在表格中搜索SPI2_RX,出现在两个位置:位置A---通道0,位置B---通道2;
  2. 在表格中搜索SPI2_TX,出现在两个位置:位置A---通道5,位置B---通道7;
  3. 确定通道号:TX---DMA0_CH5,请求来源000,RX---DMA0_CH0,请求来源000

四、DMA初始化配置

void dma_spi2_slave_tx_config(uint8_t *buffer, uint32_t len){ /* 1. 使能 DMA 时钟 */ rcu_periph_clock_enable(RCU_DMA0); /* 2. 复位通道 */ dma_deinit(DMA0, DMA_CH5); /* 3. 关键配置:查表得出的 PERIEN 值 */ // 根据你的表:SPI2_TX 在通道 5 对应的 PERIEN 是 000 // 库函数通常定义为 DMA_PERIPH_SELECT_P0、DMA_PERIPH_SELECT_P1... 或直接传入 0 dma_periph_select_config(DMA0, DMA_CH5, DMA_PERIPH_SELECT_P0); /* 4. 常规初始化 */ dma_parameter_struct dma_init_struct; dma_struct_para_init(&dma_init_struct); dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI2); dma_init_struct.memory_addr = (uint32_t)buffer; dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; // TX是内存到外设 // ... 其他内存地址、长度、增量模式配置 ... dma_init_struct.number = len; dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; dma_init(DMA0, DMA_CH5, &dma_init_struct); /* 5. 使能通道 */ dma_channel_enable(DMA0, DMA_CH5); }

五、外设初始化配置---SPI为例

/* 2. 配置 SPI2 为从机模式 */ void spi2_slave_config(void) { spi_parameter_struct spi_init_struct; rcu_periph_clock_enable(RCU_SPI2); // 注意:从机模式下 GPIO 也要正确配置,SCK/MOSI/NSS 为输入,MISO 为推挽复用输出 spi_init_struct.device_mode = SPI_SLAVE; // 设为从机 spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; spi_init_struct.nss = SPI_NSS_HARD; // 通常从机由硬件 NSS 选中 spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; // 需与主机一致 spi_init_struct.endian = SPI_ENDIAN_MSB; spi_init(SPI2, &spi_init_struct); // 开启 SPI 的 DMA 发送触发 spi_dma_enable(SPI2, SPI_DMA_TRANSMIT); spi_enable(SPI2); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 12:26:42

CANN/ops-tensor算子开发指南

算子开发指南 【免费下载链接】ops-tensor ops-tensor 是 CANN (Compute Architecture for Neural Networks)算子库中提供张量类计算的基础算子库,采用模块化设计,支持灵活的算子开发和管理。 项目地址: https://gitcode.com/ca…

作者头像 李华
网站建设 2026/5/9 12:26:38

CANN/ops-math矩阵对角线生成算子

MatrixDiagV3 【免费下载链接】ops-math 本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-math 产品支持情况 产品是否支持 Ascend 950PR/Ascend 950DT √ Atlas A3 训练系列产品/Atlas A3 推理…

作者头像 李华
网站建设 2026/5/9 12:25:28

从热图到文本:多模态可解释AI的技术原理与实践路径

1. 项目概述:为什么我们需要“看得懂”的AI决策?在人工智能,特别是深度学习模型日益渗透到医疗诊断、自动驾驶、金融风控等关键领域的今天,一个核心的信任危机也随之浮现:我们如何相信一个“黑箱”做出的决定&#xff…

作者头像 李华
网站建设 2026/5/9 12:21:33

CANN/shmem安全声明

安全声明 【免费下载链接】shmem CANN SHMEM 是面向昇腾平台的多机多卡内存通信库,基于OpenSHMEM 标准协议,实现跨设备的高效内存访问与数据同步。 项目地址: https://gitcode.com/cann/shmem 安全加固 加固须知 本文中列出的安全加固措施为基本…

作者头像 李华
网站建设 2026/5/9 12:20:27

CANN/runtime TDT队列基础示例

0_simple_queue 【免费下载链接】runtime 本项目提供CANN运行时组件和维测功能组件。 项目地址: https://gitcode.com/cann/runtime 概述 本样例演示 TDT Queue 的基础队列能力,覆盖 QueueAttr 配置、属性读取,以及 Queue 创建和销毁流程。 产品…

作者头像 李华
网站建设 2026/5/9 12:20:21

CANN/ops-cv最近邻上采样反向API

aclnnUpsampleNearest1dBackward 【免费下载链接】ops-cv 本项目是CANN提供的图像处理、目标检测相关的算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-cv 📄 查看源码 产品支持情况 产品是否支持 Ascend 950PR/Asc…

作者头像 李华