GD32F4xx系列DMA应用解析:实现高效内存与外设数据传输
1. 引言
在嵌入式开发中,DMA(直接内存访问)技术是提升系统效率的关键。本文基于GD32F4xx微控制器,通过实例代码解析如何配置DMA实现内存到内存、外设到内存的高效数据传输,并结合USART通信展示动态DMA应用。
2. DMA基础
作用:无需CPU干预,直接在存储器和外设间传输数据。
优势:
减少CPU占用率
支持大数据块高速传输
多种传输模式(内存↔外设、内存↔内存)
3. 关键代码解析
3.1 DMA内存到内存传输
// 配置DMA1通道0
void DMA_config() {
rcu_periph_clock_enable(RCU_DMA1);
dma_deinit(DMA1, DMA_CH0);
dma_single_data_parameter_struct dma_config;
dma_single_data_para_struct_init(&dma_config);
dma_config.direction = DMA_MEMORY_TO_MEMORY;
dma_config.periph_addr = (uint32_t)src; // 源地址
dma_config.memory0_addr = (uint32_t)dst; // 目标地址
dma_config.periph_inc = DMA_PERIPH_INCREASE_ENABLE;
dma_config.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_config.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;
dma_config.number = 21; // 传输数据量
dma_config.priority = DMA_PRIORITY_LOW;
dma_single_data_mode_init(DMA1, DMA_CH0, &dma_config);
// 使能传输完成中断
dma_interrupt_enable(DMA1, DMA_CH0, DMA_CHXCTL_FTFIE);
nvic_irq_enable(DMA1_Channel0_IRQn, 2, 2);
}
3.2 中断处理
void DMA1_Channel0_IRQHandler() {
if (dma_interrupt_flag_get(DMA1, DMA_CH0, DMA_INT_FLAG_FTF)) {
printf("DMA传输完成!数据:%s\r\n", dst);
dma_interrupt_flag_clear(DMA1, DMA_CH0, DMA_INT_FLAG_FTF);
}
}
4. USART接收动态DMA应用
// USART接收回调中动态配置DMA
void Usart0_on_recv(uint8_t* data, uint32_t len) {
dma_periph_address_config(DMA1, DMA_CH0, (uint32_t)data); // 更新源地址
dma_transfer_number_config(DMA1, DMA_CH0, len); // 设置数据长度
dma_channel_enable(DMA1, DMA_CH0); // 启动传输
}
优势:实时适应不同数据长度,避免CPU参与数据搬运。
5. SysTick定时器配置
void systick_config(void) {
// 1MHz中断频率(1us计数)
if (SysTick_Config(SystemCoreClock / 1000000U)) {
while(1); // 初始化失败处理
}
NVIC_SetPriority(SysTick_IRQn, 0x00U); // 最高优先级
}
// 提供微秒级延时
void delay_1us(uint32_t count) {
delay = count;
while(delay != 0);
}
6. 应用场景
高速数据采集:ADC采样数据直接存储至内存
通信协议处理:USART接收数据包DMA传输
图形处理:LCD显存快速更新
7. 常见问题
Q1:DMA传输不完成?
检查时钟使能和外设映射关系
确认传输长度和地址递增设置
Q2:如何动态修改DMA参数?
在传输前调用dma_periph_address_config和dma_transfer_number_config更新
Q3:中断优先级冲突?
通过nvic_irq_enable合理分配优先级,关键外设使用更高优先级
8. 总结
本文通过实例演示了GD32F4xx的DMA配置方法,结合SysTick和USART实现高效数据传输。DMA技术能显著提升系统实时性,在资源受限的嵌入式场景中具有重要价值。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_69851948/article/details/147111598
|