[牛人杂谈] 单片机的DMA该如何学习?

[复制链接]
1903|7
 楼主| gejigeji521 发表于 2024-7-13 16:23 | 显示全部楼层 |阅读模式
学习单片机的DMA(直接存储器访问)可以按照以下步骤进行:

1. 理解基本概念
DMA的基本原理:了解DMA的定义、工作原理及其在单片机中的作用。
优势:了解为什么使用DMA,特别是与传统CPU控制的数据传输相比的优势。
2. 选择合适的单片机
确定你使用的单片机是否支持DMA。例如,STM32、PIC32等单片机都支持DMA。
阅读单片机的数据手册和参考手册,了解DMA控制器的详细信息。
3. 理解DMA的硬件结构
了解DMA控制器的各个部分,例如通道、寄存器等。
了解如何配置和使用DMA通道进行数据传输。
4. 学习相关寄存器
了解DMA相关寄存器的功能和配置方法。
理解如何设置源地址、目的地址、传输数量等。
5. 实践操作
基本例子:从简单的DMA传输例子开始,例如从内存到内存的传输。
复杂应用:逐步挑战更复杂的应用,例如ADC数据采集、UART通信等。
6. 参考资料
官方文档和手册:认真阅读和研究单片机的参考手册和DMA相关章节。
开发板和示例代码:使用开发板运行官方示例代码,理解代码实现和配置方法。
7. 学习相关工具
调试工具:掌握使用调试工具,如JTAG、SWD等,调试和分析DMA的运行情况。
集成开发环境(IDE):熟悉使用常用的IDE,如Keil、STM32CubeIDE等,进行DMA配置和调试。
8. 深入学习和优化
优化性能:研究如何优化DMA传输,提高数据传输效率。
高级特性:了解和使用DMA的高级特性,如环形缓冲区、双缓冲等。
9. 参与社区和项目
技术社区:加入单片机相关的技术社区,如ST社区、Arduino论坛等,与其他开发者交流学习经验。
开源项目:参与或研究开源项目中的DMA应用,从实际项目中获取经验。

 楼主| gejigeji521 发表于 2024-7-13 16:24 | 显示全部楼层
新唐(Nuvoton)公司的部分单片机型号是支持DMA的,特别是在其NuMicro系列中。例如,NuMicro M0/M4系列MCU就支持DMA功能。下面是关于新唐单片机DMA的使用方法的简要介绍。

1. 确认DMA支持情况
首先要确定所使用的NuMicro单片机型号是否支持DMA。可以通过查阅芯片的参考手册和数据手册来确认。

2. DMA基本结构
在NuMicro单片机中,DMA控制器通常有多个通道,每个通道可以独立配置和使用。主要的DMA寄存器包括:

源地址寄存器:设置数据传输的源地址。
目标地址寄存器:设置数据传输的目标地址。
传输计数寄存器:设置数据传输的字节数或数据块数。
控制寄存器:配置DMA通道的工作模式、优先级、传输方向等。
 楼主| gejigeji521 发表于 2024-7-13 16:24 | 显示全部楼层
3. 配置DMA
以下是配置DMA的一般步骤:

3.1. 启动DMA时钟
在使用DMA之前,需要启用DMA控制器的时钟。可以通过设置系统时钟控制寄存器来实现。
  1. // 启用DMA时钟
  2. CLK_EnableModuleClock(PDMA_MODULE);

3.2. 设置DMA通道
选择一个DMA通道,并配置该通道的源地址、目标地址、传输计数和传输模式。
  1. // 选择DMA通道,例如通道0
  2. PDMA_Open(PDMA, (1 << 0));

  3. // 配置DMA传输源地址、目标地址和传输大小
  4. PDMA_SetTransferAddr(PDMA, 0, (uint32_t)&source_buffer, PDMA_SAR_INC, (uint32_t)&dest_buffer, PDMA_DAR_INC);

  5. // 配置传输模式和传输大小
  6. PDMA_SetTransferMode(PDMA, 0, PDMA_MEM, FALSE, 0);
  7. PDMA_SetTransferCnt(PDMA, 0, PDMA_WIDTH_32, BUFFER_SIZE);

3.3. 启动DMA传输
配置完成后,启动DMA传输。
  1. // 启动DMA通道0
  2. PDMA_Trigger(PDMA, 0);
 楼主| gejigeji521 发表于 2024-7-13 16:25 | 显示全部楼层
3.4. 配置中断(可选)
可以配置DMA传输完成中断,以便在传输完成后进行处理。
  1. // 启用DMA传输完成中断
  2. PDMA_EnableInt(PDMA, 0, PDMA_INT_TRANS_DONE);
  3. NVIC_EnableIRQ(PDMA_IRQn);


3.5. 中断处理函数
编写中断处理函数,以处理DMA传输完成事件。

  1. void PDMA_IRQHandler(void) {
  2.     if (PDMA_GET_INT_STATUS(PDMA) & PDMA_INTSTS_TDIF_Msk) {
  3.         // 检查哪个通道完成了传输
  4.         if (PDMA_GET_TD_STS(PDMA) & (1 << 0)) {
  5.             // 清除传输完成标志
  6.             PDMA_CLR_TD_FLAG(PDMA, (1 << 0));

  7.             // 传输完成后的处理代码
  8.         }
  9.     }
  10. }
 楼主| gejigeji521 发表于 2024-7-13 16:25 | 显示全部楼层
参考资料
NuMicro参考手册:详细的DMA配置和使用方法可以在具体型号的NuMicro参考手册中找到。
示例代码:新唐官方提供了丰富的示例代码,可以参考其中的DMA应用示例。
开发工具:使用NuMicro提供的开发工具和IDE(如Keil、IAR、NuEclipse等)进行开发和调试。
 楼主| gejigeji521 发表于 2024-7-13 16:26 | 显示全部楼层
你在使用新唐单片机的时候,使用过DMA外设提高系统传输效率吗
夜晚有三年 发表于 2025-8-30 14:16 | 显示全部楼层
先理解 DMA 原理:直接内存访问,无需 CPU 干预传输数据。再看芯片手册,熟悉通道、触发源,结合例程练配置,调试观察数据流向。
我趴在云边 发表于 2025-9-14 13:38 | 显示全部楼层
学习单片机 DMA 可分三步:先理解 DMA 原理,即不占用 CPU 直接传输数据,减少负荷;再熟悉所用单片机的 DMA 控制器结构、通道、触发源等,参考数据手册;最后通过实例练习,如用 DMA 实现 ADC 数据传输、串口收发,观察 CPU 占用变化,逐步掌握配置方法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

196

主题

2465

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部