洋桃开发板笔记(七 ) 初步了解DMA——直接存储器访问


初步了解DMA——直接存储器访问

杜洋工作室 www.DoYoung.net

洋桃电子 www.DoYoung.net/YT

  • 在此声明一下所有代码均为杜洋工作室的不允许复制,转发以及在商业上的行为等,本人只是在此程序上进行理解和注释。

上一次的笔记是在洋桃开发板上进行Flash闪存的使用,主要配合其他外设。对Flash的基本了解有兴趣可以去看看:
https://blog.csdn.net/qq_40546576/article/details/99695256
本次主要讲的是了解DMA。由于本次特殊,需要截取部分图片进行讲解,可能造成了观看不适,请大家谅解!谢谢。


DMA主要是可以直接访问数据,不需要通过CPU。可以外设和内存之间相互访问,也可以内存与内存之间访问。
很不幸STM32不是只有一个DMA,居然有2个DMA,分别为DMA1与DMA2。
接下来我们介绍STM32F10xxx参考手册

了解《STM32F10xxx参考手册》

麻烦大家多看看《STM32F10xxx参考手册》,这个样子会直接查看手册,大家就会对不同的芯片都会游刃有余。
在这里插入图片描述
我用的是洋桃开发板,里面是STM32F103C8T6的Flash闪存为32K字节,属于小容量的。

官方介绍

在这里插入图片描述

主要特征

在这里插入图片描述
在这里插入图片描述
STM32的DMA1有7个通道,DMA2有5个通道,相信大家看了上面的介绍因该了解这个通道个数,呢么每个通道也有各自的用处的,下面展示DMA1每个通道可以干什么(接收哪些请求)
在这里插入图片描述
呢么DMA2的每个通道又有什么用处呢,下面展示DMA2每个通道接收哪些请求
在这里插入图片描述

DMA的固件库使用

接下来这个才是我们真正要用的必须掌握,前面均可以了解。
我们需要选择的DMA配置
官方固件库内定义的(stm32f10x_dmah)

typedef struct
{
  uint32_t DMA_PeripheralBaseAddr; /*!< Specifies the peripheral base address for DMAy Channelx. */
  uint32_t DMA_MemoryBaseAddr;     /*!< Specifies the memory base address for DMAy Channelx. */
  uint32_t DMA_DIR;                /*!< Specifies if the peripheral is the source or destination.
                                        This parameter can be a value of @ref DMA_data_transfer_direction */
  uint32_t DMA_BufferSize;         /*!< Specifies the buffer size, in data unit, of the specified Channel. 
                                       The data unit is equal to the configuration set in DMA_PeripheralDataSize
                                     or DMA_MemoryDataSize members depending in the transfer direction. */
  uint32_t DMA_PeripheralInc;      /*!< Specifies whether the Peripheral address register is incremented or not.
                                        This parameter can be a value of @ref DMA_peripheral_incremented_mode */
  uint32_t DMA_MemoryInc;          /*!< Specifies whether the memory address register is incremented or not.
                                        This parameter can be a value of @ref DMA_memory_incremented_mode */
  uint32_t DMA_PeripheralDataSize; /*!< Specifies the Peripheral data width.
                                        This parameter can be a value of @ref DMA_peripheral_data_size */
  uint32_t DMA_MemoryDataSize;     /*!< Specifies the Memory data width.
                                        This parameter can be a value of @ref DMA_memory_data_size */
  uint32_t DMA_Mode;               /*!< Specifies the operation mode of the DMAy Channelx.
                                        This parameter can be a value of @ref DMA_circular_normal_mode.
                                       @note: The circular buffer mode cannot be used if the memory-to-memory
                                              data transfer is configured on the selected Channel */
  uint32_t DMA_Priority;           /*!< Specifies the software priority for the DMAy Channelx.
                                        This parameter can be a value of @ref DMA_priority_level */
  uint32_t DMA_M2M;                /*!< Specifies if the DMAy Channelx will be used in memory-to-memory transfer.
                                        This parameter can be a value of @ref DMA_memory_to_memory */
}DMA_InitTypeDef;
/***********************************************************************************************************************/
//上面为官方的英文翻译一下(个人理解):

typedef struct
{
  uint32_t DMA_PeripheralBaseAddr; /*外设地址*/
  uint32_t DMA_MemoryBaseAddr;     /*存储器地址 */
  uint32_t DMA_DIR;                /*数据传输方向*/
  uint32_t DMA_BufferSize;         /*数据量,类似数组长度*/
  uint32_t DMA_PeripheralInc;      /*外设地址增量*/
  uint32_t DMA_MemoryInc;          /*存储器地址增量*/
  uint32_t DMA_PeripheralDataSize; /*外设数据大小,字,半字,字节*/
  uint32_t DMA_MemoryDataSize;     /*存储器数据大小*/
  uint32_t DMA_Mode;               /*模式,传输为一次,还是循环传输 */
  uint32_t DMA_Priority;           /*优先级*/
  uint32_t DMA_M2M;         /*是否为存储器传输到存储器*/
}DMA_InitTypeDef;
//注:M2M的表达和P2P表达方法一样P是点,2的英语发音为to,也就是点对点,我们这里M2M则为内存对内存

接下来我们单独拿出洋桃家的代码进行分析,他家入门100步视频没有专门介绍DMA部分,但是提及了和解释ADC中的DMA相关的代码。我们截取部分在ADC中的DMA初始化程序,大家可以了解一下。可能不适合大家的代码需求,不能直接复制使用!!

void ADC_DMA_Init(void){ //DMA初始化设置
	DMA_InitTypeDef DMA_InitStructure;   //定义DMA初始化结构体
	DMA_DeInit(DMA1_Channel1);    //复位DMA通道1
	DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //定义DMA通道外设基地址=ADC1_DR_Address
	DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_DMA_IN; //!!!定义DMA通道ADC数据存储器(其他函数可直接读此变量即是ADC值)
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设为源地址
	DMA_InitStructure.DMA_BufferSize = 2;//!!!定义DMA缓冲区大小(根据ADC采集通道数量修改)
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//当前外设寄存器地址不变
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//!!! 当前存储器地址:Disable不变,Enable递增(用于多通道采集)
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度16位
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //定义存储器数据宽度16位
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA通道操作模式位环形缓冲模式
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道优先级高
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止DMA通道存储器到存储器传输
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);//初始化DMA通道1
	DMA_Cmd(DMA1_Channel1, ENABLE); //使能DMA通道1
}

上面程序还需要一个开启时钟程序,程序可以放在初始化程序中也可以放在其他程序,但是一定是在整个初始化过程中开启。
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟
洋桃家放在GPIO初始化中,而秉火家放在DMA初始化中,其实一样的,但不可以缺少!!!


下面我们了解stm32的ADC的使用,还有DAC的。
最后用ADC和DMA做一些小东西


参考来源:

  • Google搜寻引擎等等
  • 杜洋工作室 www.DoYoung.net
  • 洋桃电子 www.DoYoung.net/YT
  • STM32库开发实战指南 基于STM32F103(第二版)
  • 《stm32f1xx 参考手册》

### 回答1: 洋桃iot(YoungTek IoT)开发板资料包是为开发者提供的一套包含相关学习资料和资源的综合套件。该资料包可以帮助开发者学习和使用洋桃iot开发板进行物联网应用的开发。 洋桃iot开发板资料包通常包含以下内容: 一、开发板硬件手册:介绍了洋桃iot开发板的各个硬件接口和功能,以及相关的操作和使用方法。开发者可以通过该手册了解开发板的硬件架构和特性。 二、开发板软件说明:介绍了开发板的软件部分,包括操作系统、驱动程序和开发工具等。开发者可以通过该说明学习如何使用开发板的软件部分。 三、开发板示例代码:提供了一些常见的物联网应用的示例代码,包括传感器数据采集、数据传输和远程控制等。开发者可以通过学习这些示例代码,了解如何使用洋桃iot开发板进行应用开发。 四、开发板编程教程:提供了一些基本的编程教程,包括C语言和Python等常用的编程语言。开发者可以通过学习这些教程,了解如何使用洋桃iot开发板进行编程和应用开发。 五、技术支持:洋桃iot开发板资料包通常还提供技术支持,开发者可以通过官方网站或者在线社区等途径获取技术支持和解答问题。 综上所述,洋桃iot开发板资料包提供了一套丰富的学习资源,帮助开发者快速入门并掌握洋桃iot开发板使用,从而进行物联网应用的开发。 ### 回答2: 洋桃IoT开发板是一种集成了物联网技术的开发板,它的资料包包括以下内容: 1. 开发板说明书:详细介绍了洋桃IoT开发板的硬件结构、接口定义、功能特点,以及如何进行开发和调试。 2. 开发工具:提供了适用于洋桃IoT开发板的开发工具,包括编程软件、调试工具等,方便开发者进行项目开发和调试。 3. 示例代码:提供了一些常见的示例代码,涵盖了物联网应用的基本功能,如传感器数据采集、网络通信、云平台连接等,开发者可以根据自己的需求进行修改和扩展。 4. 电路原理图:提供了洋桃IoT开发板的电路原理图,方便开发者深入理解开发板的硬件设计和接口电路连接。 5. 相关资料和参考文档:提供了一些与洋桃IoT开发板相关的资料和参考文档,如芯片手册、通信协议等,帮助开发者更好地了解使用开发板洋桃IoT开发板具有良好的兼容性和易用性,开发者可以基于此开发板快速开发物联网应用,并实现硬件与软件的高度整合和互联互通。通过使用洋桃IoT开发板,开发者可以更加方便地实现物联网产品的开发和部署,加快产品上市和推广的速度。 ### 回答3: 洋桃iot开发板是一款功能强大且易于使用的物联网开发板。该开发板提供了丰富的资料包,用于帮助开发人员快速上手和开发物联网应用。 首先,洋桃iot开发板资料包中包含了详细的硬件说明书。该说明书介绍了开发板的主要硬件组成、连接方式以及引脚定义等信息,让开发人员了解开发板的结构和功能。 其次,资料包中还包括了示例代码和开发工具。开发人员可以通过这些示例代码快速入门,了解如何使用洋桃iot开发板进行基本的物联网应用开发。开发工具则提供了一个集成开发环境,方便开发人员编写、调试和上传代码到洋桃iot开发板。 此外,洋桃iot开发板资料包中还提供了丰富的教程和文档。这些教程和文档从不同层面介绍了物联网的基础知识、使用洋桃iot开发板的方法和技巧,以及常见问题的解决方法。开发人员可以通过这些资源深入学习和理解物联网的原理和应用。 最后,洋桃iot开发板资料包还包括了团队的技术支持渠道。开发人员可以通过官方网站、社区论坛或邮件联系技术支持团队,提出问题或寻求帮助。这样可以确保开发过程中遇到的问题得到及时解决,提高开发效率。 总之,洋桃iot开发板资料包提供了全面的资源和支持,为开发人员提供了便利。借助这些资料和工具,开发人员可以快速开发出高质量的物联网应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mannixcsdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值