GD32F470入门教程(十)DMA

18k 词

DMA

简介

DMA控制器提供了一种硬件的方式在外设和存储器之间或者存储器和存储器之间传输数据,而无需MCU的介入,避免了MCU多次进入中断进行大规模的数据拷贝,最终提高整体的系统性能。
每个DMA控制器包含了两个AHB总线接口和8个4字深度的FIFO,使DMA可以高效的传输数据。DMA控制器(DMA0,DMA1)共有16个通道,每个通道可以被分配给一个或多个特定的外设进行数据传输。两个内置的总线仲裁器用来处理DMA请求的优先级问题。
Cortex®-M4内核与DMA控制器都是通过系统总线来处理数据,引入仲裁机制来处理它们之间的竞争关系。当MCU和DMA指定相同的外设的时候,MCU将会在特定的总线周期挂起。总线矩阵使用了轮询的算法保证MCU至少占用了一半的带宽。

主要特征

image-20260227220954230

DMA传输方式

DMA 支持三种传输模式,如下:

  • 外设到存储器:通过 AHB 外设主机接口从外设读取数据,通过 AHB 存储器主机接口向存储器写入数据。比如串口的 DMA 接收,就是从外设到存储器。
  • 存储器到外设:通过 AHB 存储器主机接口从存储器读取数据,通过 AHB 外设主机接口向外设写入数据。比如串口的 DMA 发送,就是存储器到外设。
  • 存储器到存储器:通过 AHB 外设主机接口从存储器读取数据,通过 AHB 存储器主机接口向存储器写入数据。

image-20260227221216172

DMA外设请求

image-20260227221256587

image-20260227221304788

串口DMA发送/接收示例

DMA 最常见的应用场景之一就是串口通信。在大数据量高速传输时,使用中断逐字节接收会占用大量 CPU 资源,而 DMA 可以让外设直接将数据搬运到内存,只在传输完成时通知 CPU。

本示例演示如何使用 USART0 配合 DMA 进行数据的发送和接收。

注意: GD32F4 系列的 DMA 请求映射比较灵活,需要查阅用户手册的 DMA 请求映射表 来确定特定外设对应的 DMA 控制器、数据流 (Stream) 和通道 (Channel)。

假设映射关系如下(具体请查阅数据手册):

  • USART0_TX: DMA1, Stream7, Channel4
  • USART0_RX: DMA1, Stream2, Channel4

1. 变量定义

1
2
3
4
5
6
7
8
#include "gd32f4xx.h"
#include <stdio.h>

#define ARRAYNUM(arr_nan) (sizeof(arr_nan) / sizeof(*(arr_nan)))
#define TRANSMIT_SIZE 100

uint8_t tx_buffer[TRANSMIT_SIZE]; // 发送缓冲区
uint8_t rx_buffer[TRANSMIT_SIZE]; // 接收缓冲区

2. DMA 初始化配置

配置 DMA 需要注意源地址、目标地址、数据宽度、传输方向等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
void dma_config(void)
{
dma_single_data_parameter_struct dma_init_struct;

/* 1. 开启 DMA1 时钟 */
rcu_periph_clock_enable(RCU_DMA1);

/* 2. 复位 DMA Stream */
dma_deinit(DMA1, DMA_CH7); // USART0_TX
dma_deinit(DMA1, DMA_CH2); // USART0_RX

/* ================= 配置 USART0_TX (DMA1, CH7) ================= */
dma_init_struct.periph_addr = (uint32_t)&USART_DATA(USART0); // 外设地址:串口数据寄存器
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; // 外设地址不自增
dma_init_struct.memory0_addr = (uint32_t)tx_buffer; // 内存地址:发送缓冲区
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; // 内存地址自增
dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT; // 数据宽度 8位
dma_init_struct.circular_mode = DMA_CIRCULAR_MODE_DISABLE; // 关闭循环模式(单次发送)
dma_init_struct.direction = DMA_MEMORY_TO_PERIPH; // 方向:内存 -> 外设
dma_init_struct.number = TRANSMIT_SIZE; // 传输数据量
dma_init_struct.priority = DMA_PRIORITY_URGENT; // 优先级

// 初始化 DMA1_CH7 (Stream 7)
dma_single_data_mode_init(DMA1, DMA_CH7, &dma_init_struct);
// 选择通道4 (Channel 4) 作为请求源
dma_channel_subperipheral_select(DMA1, DMA_CH7, DMA_SUBPERI4);

/* ================= 配置 USART0_RX (DMA1, CH2) ================= */
dma_init_struct.periph_addr = (uint32_t)&USART_DATA(USART0);
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.memory0_addr = (uint32_t)rx_buffer;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;
dma_init_struct.circular_mode = DMA_CIRCULAR_MODE_DISABLE; // 根据需求,可设为循环模式
dma_init_struct.direction = DMA_PERIPH_TO_MEMORY; // 方向:外设 -> 内存
dma_init_struct.number = TRANSMIT_SIZE;
dma_init_struct.priority = DMA_PRIORITY_HIGH;

// 初始化 DMA1_CH2 (Stream 2)
dma_single_data_mode_init(DMA1, DMA_CH2, &dma_init_struct);
// 选择通道4 (Channel 4) 作为请求源
dma_channel_subperipheral_select(DMA1, DMA_CH2, DMA_SUBPERI4);

/* 配置 DMA 发送完成中断 (可选) */
dma_interrupt_enable(DMA1, DMA_CH7, DMA_CHXCTL_FTFIE);

/* 使能 DMA 接收通道 (准备好接收数据) */
dma_channel_enable(DMA1, DMA_CH2);

/* 注意:DMA 发送通道 (CH7) 先不使能,等有数据要发时再使能 */
}

3. USART 初始化

除了常规配置外,关键是要使能 USART 的 DMA 发送和接收功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void usart0_config(void)
{
/* 1. 开启时钟和配置GPIO (PA9/TX, PA10/RX) */
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_USART0);

gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9 | GPIO_PIN_10);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9 | GPIO_PIN_10);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9 | GPIO_PIN_10);

/* 2. 配置 USART 参数 */
usart_deinit(USART0);
usart_baudrate_set(USART0, 115200U);
usart_receive_config(USART0, USART_RECEIVE_ENABLE);
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);

/* 3. 关键:使能串口的 DMA 发送和接收 */
usart_dma_transmit_config(USART0, USART_DENT_ENABLE); // 允许串口发送请求DMA
usart_dma_receive_config(USART0, USART_DENR_ENABLE); // 允许串口接收请求DMA

usart_enable(USART0);
}

4. 中断配置与服务函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void nvic_config(void)
{
/* 配置 DMA1_Channel7 (发送完成) 中断优先级 */
nvic_irq_enable(DMA1_Channel7_IRQn, 0, 0);
}

/* DMA1_Channel7 中断服务函数 (发送完成) */
void DMA1_Channel7_IRQHandler(void)
{
/* 检查是否是传输完成标志 */
if(dma_interrupt_flag_get(DMA1, DMA_CH7, DMA_INT_FLAG_FTF)){
/* 清除标志位 */
dma_interrupt_flag_clear(DMA1, DMA_CH7, DMA_INT_FLAG_FTF);

/* 可以在这里设置标志位,通知主循环发送完毕 */
// g_transfer_complete = 1;
}
}

5. 封装发送函数

为了方便使用,我們可以封装着一个启动 DMA 发送的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void usart_dma_send(uint8_t *data, uint16_t len)
{
/* 1. 关闭 DMA 通道,准备重新配置 */
dma_channel_disable(DMA1, DMA_CH7);

/* 2. 清除中断标志(保险起见) */
dma_interrupt_flag_clear(DMA1, DMA_CH7, DMA_INT_FLAG_FTF);

/* 3. 重新设置内存地址和传输数量 */
/* 注意:如果不重新设置地址,DMA会继续从上次结束的地方读或者复位到初始地址 */
dma_memory_address_config(DMA1, DMA_CH7, DMA_MEMORY_0, (uint32_t)data);
dma_transfer_number_config(DMA1, DMA_CH7, len);

/* 4. 开启 DMA 通道,开始发送 */
dma_channel_enable(DMA1, DMA_CH7);
}

6. 主函数调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main(void)
{
// 系统初始化...
nvic_config();
dma_config();
usart0_config();

// 填充发送数据...
for(int i=0; i<TRANSMIT_SIZE; i++) tx_buffer[i] = i;

// 启动第一次发送
usart_dma_send(tx_buffer, TRANSMIT_SIZE);

while(1)
{
// 主循环可以做其他事情,不需要管串口发送
}
}

DMA库函数

库函数名称 库函数描述
dma_deinit 复位 DMA 一个通道的所有寄存器
dma_single_data_mode_init DMA 单数据传输模式初始化
dma_multi_data_mode_init DMA 多数据传输模式初始化
dma_periph_address_config DMA 外设基地址配置
dma_memory_address_config DMA 存储器基地址配置
dma_transfer_number_config DMA 需要传输数据数配置
dma_transfer_number_get DMA 需要传输数据数获取
dma_priority_config DMA 通道传输优先级配置
dma_memory_burst_beats_config 存储器增量突发传输节拍数配置
dma_periph_burst_beats_config 外设增量突发传输节拍数配置
dma_memory_width_config 存储器传输数据宽度配置
dma_periph_width_config 外设传输数据宽度配置
dma_memory_address_generation_config 存储器下地址算法配置
dma_peripheral_address_generation_config 外设地址算法配置
dma_circulation_enable DMA 循环传输模式使能
dma_circulation_disable DMA 循环传输模式失能
dma_channel_enable DMA 通道使能
dma_channel_disable DMA 通道失能
dma_transfer_direction_config DMA 通道数据传输方向配置
dma_switch_buffer_mode_config DMA 存储器传输缓冲区配置
dma_using_memory_get DMA 存储器传输缓冲区获取
dma_channel_subperipheral_select DMA 通道外设使能选择
dma_flow_controller_config DMA 传输控制器配置
dma_switch_buffer_mode_enable DMA 存储切换模式使能
dma_fifo_status_get DMA FIFO 状态获取
dma_flag_get DMA 通道传输标志位获取
dma_flag_clear DMA 通道传输标志位清除
dma_interrupt_flag_get DMA 通道传输中断标志位获取
dma_interrupt_flag_clear DMA 通道传输中断标志位清除
dma_interrupt_enable DMA 中断使能
dma_interrupt_disable DMA 中断失能

一、结构体定义

1. dma_multi_data_parameter_struct

成员名称 功能描述
periph_addr 外设基地址
periph_width 外设数据传输宽度
periph_inc 外设地址生成算法模式
memory0_addr 存储器0基地址
memory0_width 存储器0传输宽度
memory0_inc 存储器0地址生成算法模式
memory0_burst 存储器0增量突发传输
memory1_addr 存储器1基地址
memory1_width 存储器1传输宽度
memory1_inc 存储器1地址生成算法模式
memory1_burst 存储器1增量突发传输
periph_burst 外设增量突发传输
periph_inc 外设增量突发模式
circular_value DMA FIFO寄存器
circular_mode DMA循环模式
direction DMA通道数据传输方向
number DMA需要传输数据数
priority DMA通道优先级

2. dma_single_data_parameter_struct

成员名称 功能描述
periph_addr 外设基地址
periph_inc 外设地址生成算法模式
periph_width 外设数据传输宽度
DMA_CHx(x=0..7) DMA外设选择
memory_addr 存储器基地址
memory_inc 存储器地址生成算法模式
memory_width 外设数据传输宽度
periph_burst 外设增量突发传输
circular_mode DMA循环模式
direction DMA通道数据传输方向
DMA_MTOM DMA外设选择
priority DMA通道优先级

二、DMA库函数详细信息

1. dma_deinit

  • 函数原型void dma_deinit(uint32_t dma_periph, dma_channel_enum channelx)
  • 功能描述:复位DMA一个通道的所有寄存器
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_deinit(DMA0, DMA_CH0);

2. dma_single_data_mode_init

  • 函数原型void dma_single_data_mode_init(uint32_t dma_periph, dma_channel_enum channelx, dma_single_data_parameter_struct *init_struct)
  • 功能描述:DMA单数据传输模式初始化
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • init_struct:指向dma_single_data_parameter_struct的指针
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    2
    dma_single_data_parameter_struct dma_single_data_struct;
    dma_single_data_mode_init(DMA0, DMA_CH0, &dma_single_data_struct);

3. dma_multi_data_mode_init

  • 函数原型void dma_multi_data_mode_init(uint32_t dma_periph, dma_channel_enum channelx, dma_multi_data_parameter_struct *init_struct)
  • 功能描述:DMA多数据传输模式初始化
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • init_struct:指向dma_multi_data_parameter_struct的指针
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    2
    dma_multi_data_parameter_struct dma_multi_data_struct;
    dma_multi_data_mode_init(DMA0, DMA_CH0, &dma_multi_data_struct);

4. dma_periph_address_config

  • 函数原型void dma_periph_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t address)
  • 功能描述:DMA外设基地址配置
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • address:外设基地址
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    2
    #define BASE_ADDR ((uint32_t)0x40004000)
    dma_periph_address_config(DMA0, DMA_CH0, BASE_ADDR);

5. dma_memory_address_config

  • 函数原型void dma_memory_address_config(uint32_t dma_periph, dma_channel_enum channelx, dma_memory_flag memory_flag, uint32_t address)
  • 功能描述:DMA存储器基地址配置
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • memory_flag:存储器选择(DMA_MEMORY0/DMA_MEMORY1
    • address:存储器基地址
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    2
    #define BUF_ADDR ((uint32_t)0x20001000)
    dma_memory_address_config(DMA0, DMA_CH0, DMA_MEMORY0, BUF_ADDR);

6. dma_transfer_number_config

  • 函数原型void dma_transfer_number_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t number)
  • 功能描述:DMA需要传输数据数配置
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • number:需要传输数据数(0~0xffff)
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    2
    #define TRANSFER_NUM 0x400
    dma_transfer_number_config(DMA0, DMA_CH0, TRANSFER_NUM);

7. dma_transfer_number_get

  • 函数原型uint32_t dma_transfer_number_get(uint32_t dma_periph, dma_channel_enum channelx)
  • 功能描述:DMA需要传输数据数获取
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
  • 输出参数:无
  • 返回值:需要传输数据数(0~0xffff)
  • 示例
    1
    2
    uint32_t number = 0;
    number = dma_transfer_number_get(DMA0, DMA_CH0);

8. dma_priority_config

  • 函数原型void dma_priority_config(uint32_t dma_periph, dma_channel_enum channelx, dma_priority_enum priority)
  • 功能描述:DMA通道传输优先级配置
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • priority:优先级(DMA_PRIORITY_LOW/DMA_PRIORITY_MEDIUM/DMA_PRIORITY_HIGH/DMA_PRIORITY_ULTRA_HIGH
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_priority_config(DMA0, DMA_CH0, DMA_PRIORITY_HIGH);

9. dma_memory_burst_beats_config

  • 函数原型void dma_memory_burst_beats_config(uint32_t dma_periph, dma_channel_enum channelx, dma_memory_burst_enum mbeat)
  • 功能描述:存储器增量突发传输节拍数配置
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • mbeat:存储器增量突发传输节拍数(DMA_MEMORY_BURST_SINGLE/DMA_MEMORY_BURST_4_BEAT/DMA_MEMORY_BURST_8_BEAT/DMA_MEMORY_BURST_16_BEAT
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_memory_burst_beats_config(DMA0, DMA_CH0, DMA_MEMORY_BURST_8_BEAT);

10. dma_periph_burst_beats_config

  • 函数原型void dma_periph_burst_beats_config(uint32_t dma_periph, dma_channel_enum channelx, dma_periph_burst_enum pbeat)
  • 功能描述:外设增量突发传输节拍数配置
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • pbeat:外设增量突发传输节拍数(DMA_PERIPH_BURST_SINGLE/DMA_PERIPH_BURST_4_BEAT/DMA_PERIPH_BURST_8_BEAT/DMA_PERIPH_BURST_16_BEAT
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_periph_burst_beats_config(DMA0, DMA_CH0, DMA_PERIPH_BURST_8_BEAT);

11. dma_memory_width_config

  • 函数原型void dma_memory_width_config(uint32_t dma_periph, dma_channel_enum channelx, dma_memory_width_enum mwidth)
  • 功能描述:存储器传输数据宽度配置
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • mwidth:存储器传输数据宽度(DMA_MEMORY_WIDTH_8BIT/DMA_MEMORY_WIDTH_16BIT/DMA_MEMORY_WIDTH_32BIT
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_memory_width_config(DMA0, DMA_CH0, DMA_MEMORY_WIDTH_32BIT);

12. dma_periph_width_config

  • 函数原型void dma_periph_width_config(uint32_t dma_periph, dma_channel_enum channelx, dma_periph_width_enum pwidth)
  • 功能描述:外设传输数据宽度配置
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • pwidth:外设传输数据宽度(DMA_PERIPH_WIDTH_8BIT/DMA_PERIPH_WIDTH_16BIT/DMA_PERIPH_WIDTH_32BIT
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_periph_width_config(DMA0, DMA_CH0, DMA_PERIPH_WIDTH_32BIT);

13. dma_memory_address_generation_config

  • 函数原型void dma_memory_address_generation_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t generation_algorithm)
  • 功能描述:存储器下地址算法配置
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • generation_algorithm:存储器地址生成算法(DMA_MEMORY_INCREASE_ENABLE/DMA_MEMORY_INCREASE_DECREASE/DMA_MEMORY_SAME
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_memory_address_generation_config(DMA0, DMA_CH0, DMA_MEMORY_INCREASE_ENABLE);

14. dma_peripheral_address_generation_config

  • 函数原型void dma_peripheral_address_generation_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t generation_algorithm)
  • 功能描述:外设地址算法配置
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • generation_algorithm:外设地址生成算法(DMA_PERIPH_INCREASE_ENABLE/DMA_PERIPH_INCREASE_DECREASE/DMA_PERIPH_FIX/DMA_PERIPH_FIX_INCREASE
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_peripheral_address_generation_config(DMA0, DMA_CH0, DMA_PERIPH_INCREASE_ENABLE);

15. dma_circulation_enable

  • 函数原型void dma_circulation_enable(uint32_t dma_periph, dma_channel_enum channelx)
  • 功能描述:DMA循环传输模式使能
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_circulation_enable(DMA0, DMA_CH0);

16. dma_circulation_disable

  • 函数原型void dma_circulation_disable(uint32_t dma_periph, dma_channel_enum channelx)
  • 功能描述:DMA循环传输模式失能
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_circulation_disable(DMA0, DMA_CH0);

17. dma_channel_enable

  • 函数原型void dma_channel_enable(uint32_t dma_periph, dma_channel_enum channelx)
  • 功能描述:DMA通道使能
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_channel_enable(DMA0, DMA_CH0);

18. dma_channel_disable

  • 函数原型void dma_channel_disable(uint32_t dma_periph, dma_channel_enum channelx)
  • 功能描述:DMA通道失能
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_channel_disable(DMA0, DMA_CH0);

19. dma_transfer_direction_config

  • 函数原型void dma_transfer_direction_config(uint32_t dma_periph, dma_channel_enum channelx, uint8_t direction)
  • 功能描述:DMA通道数据传输方向配置
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • direction:数据传输方向(DMA_PERIPH_TO_MEMORY/DMA_MEMORY_TO_PERIPH/DMA_MEMORY_TO_MEMORY
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_transfer_direction_config(DMA0, DMA_CH0, DMA_PERIPH_TO_MEMORY);

20. dma_switch_buffer_mode_config

  • 函数原型void dma_switch_buffer_mode_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t memory0_addr, uint32_t memory1_addr)
  • 功能描述:DMA存储器传输缓冲区配置
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • memory0_addr:存储器0基地址
    • memory1_addr:存储器1基地址
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    2
    3
    #define BUF0_ADDR ((uint32_t)0x20001000)
    #define BUF1_ADDR ((uint32_t)0x20002000)
    dma_switch_buffer_mode_config(DMA0, DMA_CH0, BUF0_ADDR, BUF1_ADDR);

21. dma_using_memory_get

  • 函数原型uint32_t dma_using_memory_get(uint32_t dma_periph, dma_channel_enum channelx)
  • 功能描述:DMA存储器传输缓冲区获取
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
  • 输出参数:无
  • 返回值:使用的存储器(DMA_MEMORY0/DMA_MEMORY1
  • 示例
    1
    uint32_t using_memory = dma_using_memory_get(DMA0, DMA_CH0);

22. dma_channel_subperipheral_select

  • 函数原型void dma_channel_subperipheral_select(uint32_t dma_periph, dma_channel_enum channelx, dma_subperipheral_enum sub_periph)
  • 功能描述:DMA通道外设使能选择
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • sub_periph:指定DMA通道的外设(如DMA_SUBPERIO等)
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_channel_subperipheral_select(DMA0, DMA_CH0, DMA_SUBPERIO);

23. dma_flow_controller_config

  • 函数原型void dma_flow_controller_config(uint32_t dma_periph, dma_channel_enum channelx, dma_flow_controller_enum controller)
  • 功能描述:DMA传输控制器配置
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • controller:DMA传输控制器(DMA_FLOW_CONTROLLER_DMA/DMA_FLOW_CONTROLLER_PERIPH
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_flow_controller_config(DMA0, DMA_CH0, DMA_FLOW_CONTROLLER_DMA);

24. dma_switch_buffer_mode_enable

  • 函数原型void dma_switch_buffer_mode_enable(uint32_t dma_periph, dma_channel_enum channelx)
  • 功能描述:DMA存储切换模式使能
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_switch_buffer_mode_enable(DMA0, DMA_CH0);

25. dma_fifo_status_get

  • 函数原型uint32_t dma_fifo_status_get(uint32_t dma_periph, dma_channel_enum channelx)
  • 功能描述:DMA FIFO状态获取
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
  • 输出参数:无
  • 返回值:FIFO状态值
  • 示例
    1
    uint32_t fifo_status = dma_fifo_status_get(DMA0, DMA_CH0);

26. dma_flag_get

  • 函数原型FlagStatus dma_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag)
  • 功能描述:DMA通道传输标志位获取
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • flag:指定获取的标志位(DMA_FLAG_FEE/DMA_FLAG_SDE/DMA_FLAG_TAE/DMA_FLAG_HTF/DMA_FLAG_FTF
  • 输出参数:无
  • 返回值SETRESET
  • 示例
    1
    FlagStatus flag_status = dma_flag_get(DMA0, DMA_CH0, DMA_FLAG_FTF);

27. dma_flag_clear

  • 函数原型void dma_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag)
  • 功能描述:DMA通道传输标志位清除
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • flag:指定清除的标志位(DMA_FLAG_FEE/DMA_FLAG_SDE/DMA_FLAG_TAE/DMA_FLAG_HTF/DMA_FLAG_FTF
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_flag_clear(DMA0, DMA_CH0, DMA_FLAG_FTF);

28. dma_interrupt_flag_get

  • 函数原型FlagStatus dma_interrupt_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt)
  • 功能描述:DMA通道传输中断标志位获取
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • interrupt:指定获取的中断标志位(DMA_INT_FLAG_FEE/DMA_INT_FLAG_SDE/DMA_INT_FLAG_TAE/DMA_INT_FLAG_HTF/DMA_INT_FLAG_FTF
  • 输出参数:无
  • 返回值SETRESET
  • 示例
    1
    2
    3
    if (dma_interrupt_flag_get(DMA0, DMA_CH0, DMA_INT_FLAG_FTF)) {
    // 处理传输完成中断
    }

29. dma_interrupt_flag_clear

  • 函数原型void dma_interrupt_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t interrupt)
  • 功能描述:DMA通道传输中断标志位清除
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • interrupt:指定清除的中断标志位(DMA_INT_FLAG_FEE/DMA_INT_FLAG_SDE/DMA_INT_FLAG_TAE/DMA_INT_FLAG_HTF/DMA_INT_FLAG_FTF
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_INT_FLAG_FTF);

30. dma_interrupt_enable

  • 函数原型void dma_interrupt_enable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t source)
  • 功能描述:DMA中断使能
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • source:DMA中断源(DMA_CHXCTL_SDEIE/DMA_CHXCTL_TAEIE/DMA_CHXCTL_HTFIE/DMA_CHXCTL_FTFIE/DMA_CHXCTL_FEEIE
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_interrupt_enable(DMA0, DMA_CH0, DMA_CHXCTL_FTFIE);

31. dma_interrupt_disable

  • 函数原型void dma_interrupt_disable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t source)
  • 功能描述:DMA中断失能
  • 先决条件:无
  • 被调用函数:无
  • 输入参数
    • dma_periph:DMA外设(DMA0/DMA1
    • channelx:DMA通道(DMA_CH0~`DMA_CH7`)
    • source:DMA中断源(DMA_CHXCTL_SDEIE/DMA_CHXCTL_TAEIE/DMA_CHXCTL_HTFIE/DMA_CHXCTL_FTFIE/DMA_CHXCTL_FEEIE
  • 输出参数:无
  • 返回值:无
  • 示例
    1
    dma_interrupt_disable(DMA0, DMA_CH0, DMA_CHXCTL_FTFIE);
留言