STM32自学☞DMA数据转运以及DMA+AD多通道案例

2024-03-02 14:52

本文主要是介绍STM32自学☞DMA数据转运以及DMA+AD多通道案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、先给大家简单介绍下DMA相关的函数

①DMA_DeInit(); 恢复缺省配置

②DMA_Init(); 初始化

③DMA_StructInit(); 结构初始化

④DMA_Cmd(); 使能

⑤DMA_ITConfig(); 中断输出使能

⑥DMA_SetCurrDataCounter(); 设置当前数据寄存器

⑦DMA_GetCurrDataCounter(); 获取当前寄存器

⑧DMA_GetFlagStatus(); 获取标志位状态  

⑨DMA_ClearFlag(); 清除标志位

⑩DMA_GetITStatus(); 获取中断状态

①①DMA_ClearITPendingBit(); 清除中断挂起位

二、DMA数据转运的案例

dam.c文件

#include "stm32f10x.h"

#include "stm32f10x_dma.h"

#include "dma.h"

uint16_t dma_Size;

void dma_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size)

{

 /*

 初始化步骤:

 1.RCC开启DMA时钟

 2.用DMA_Init,初始化相关参数

 4.给指定的通道使能,完成开关控制

 */

 dma_Size=Size;

 //开启时钟

 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

 //初始化配置

 DMA_InitTypeDef DMA_InitStruct;

 DMA_InitStruct.DMA_PeripheralBaseAddr=AddrA; //外设站点的起始地址

 DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte; //外设站点的数据宽度

 DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Enable; //外设站点的是否自增

 DMA_InitStruct.DMA_MemoryBaseAddr=AddrB; //存储器站点的起始地址

 DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;; //存储器站点的数据宽度

 DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable; //存储器站点的是否自增

 DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralSRC; //传输方向

 DMA_InitStruct.DMA_BufferSize=Size; //缓存区大小,即传输计数器

 DMA_InitStruct.DMA_Mode=DMA_Mode_Normal; //传输模式,即是否使用自动重装

 DMA_InitStruct.DMA_M2M=DMA_M2M_Enable; //选择是否是存储器到存储器,即选择硬件触发还是软件触发

 DMA_InitStruct.DMA_Priority=DMA_Priority_Medium; //优先级

 DMA_Init(DMA1_Channel1,&DMA_InitStruct);

 //使能

 DMA_Cmd(DMA1_Channel1,DISABLE);

}

void adm_Transfer(void)

{

 DMA_Cmd(DMA1_Channel1,DISABLE);

 DMA_SetCurrDataCounter(DMA1_Channel1,dma_Size);

 DMA_Cmd(DMA1_Channel1,ENABLE);

 while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET);

 DMA_ClearFlag(DMA1_FLAG_TC1);

}

dma.h文件

#ifndef _DMA_H

#define _DMA_H

#include "stdint.h"

void dma_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size);

void adm_Transfer(void);

#endif

main.c文件

#include "stm32f10x.h"

#include "delay.h"

#include "OLED.h"

#include "dma.h"

#include "stdint.h"

uint8_t DataA[]={0x01,0x02,0x03,0x04};

uint8_t DataB[]={0,0,0,0};

int main (void)

 OLED_Init();

 dma_Init((uint32_t)DataA,(uint32_t)DataB,4);

 OLED_ShowString(1,1,"DataA");

 OLED_ShowString(3,1,"DataB");

 OLED_ShowHexNum(1,8,(uint32_t)DataA,8);

 OLED_ShowHexNum(3,8,(uint32_t)DataB,8);

 while(1)

 {

  DataA[0]++;

  DataA[1]++;

  DataA[2]++;

  DataA[3]++;

  OLED_ShowHexNum(2,1,DataA[0],2);

  OLED_ShowHexNum(2,4,DataA[1],2);

  OLED_ShowHexNum(2,7,DataA[2],2);

  OLED_ShowHexNum(2,10,DataA[3],2);

  OLED_ShowHexNum(4,1,DataB[0],2);

  OLED_ShowHexNum(4,4,DataB[1],2);

  OLED_ShowHexNum(4,7,DataB[2],2);

  OLED_ShowHexNum(4,10,DataB[3],2);

  delay_ms(1000);

  adm_Transfer();

  OLED_ShowHexNum(2, 1, DataA[0], 2);

  OLED_ShowHexNum(2, 4, DataA[1], 2);

  OLED_ShowHexNum(2, 7, DataA[2], 2);

  OLED_ShowHexNum(2, 10, DataA[3], 2);

  OLED_ShowHexNum(4, 1, DataB[0], 2);

  OLED_ShowHexNum(4, 4, DataB[1], 2);

  OLED_ShowHexNum(4, 7, DataB[2], 2);

  OLED_ShowHexNum(4, 10, DataB[3], 2);

  delay_ms(1000);

 }

}

三、DAM+AD多通道案例

ad.c文件

#include "stm32f10x.h"

#include "stm32f10x_adc.h"

#include "stm32f10x_dma.h"

#include "ad.h"

#include "stdint.h"

uint16_t AD_Value[4];

void ad_Init(void)

{

  //开启时钟

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

 //配置ADCCLK

 RCC_ADCCLKConfig(RCC_PCLK2_Div6);

 //配置GPIO

 GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

 ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);

 ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_55Cycles5);

 ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_55Cycles5);

 ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_55Cycles5);

 //结构体初始化ADC

 ADC_InitTypeDef ADC_InitStruct;

 ADC_InitStruct.ADC_Mode=ADC_Mode_Independent; //工作模式为独立模式

 ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right; //ADC数据为右对齐

 ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //软件触发

 ADC_InitStruct.ADC_ContinuousConvMode=ENABLE; //连续转换  

 ADC_InitStruct.ADC_ScanConvMode=ENABLE; //扫描模式

 ADC_InitStruct.ADC_NbrOfChannel=4; //扫描模式下要用到的通道数为4

 ADC_Init(ADC1,&ADC_InitStruct);

 //初始化配置

 DMA_InitTypeDef DMA_InitStruct;

 DMA_InitStruct.DMA_PeripheralBaseAddr=(uint32_t)&ADC1->DR; //外设站点的起始地址

 DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord; //外设站点的数据宽度

 DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable; //外设站点的是否自增

 DMA_InitStruct.DMA_MemoryBaseAddr=(uint32_t)AD_Value; //存储器站点的起始地址

 DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord; //存储器站点的数据宽度

 DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable; //存储器站点的是否自增

 DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralSRC; //传输方向

 DMA_InitStruct.DMA_BufferSize=4; //缓存区大小,即传输计数器

 DMA_InitStruct.DMA_Mode=DMA_Mode_Circular; //传输模式,即是否使用自动重装

 DMA_InitStruct.DMA_M2M=DMA_M2M_Disable; //选择是否是存储器到存储器,即选择硬件触发还是软件触发

 DMA_InitStruct.DMA_Priority=DMA_Priority_Medium; //优先级

 DMA_Init(DMA1_Channel1,&DMA_InitStruct);

 //使能

 DMA_Cmd(DMA1_Channel1,ENABLE);  

 //开启DMA触发信号

 ADC_DMACmd(ADC1,ENABLE);

 //开启ADC电源

 ADC_Cmd(ADC1,ENABLE);

 //复位校准

 ADC_ResetCalibration(ADC1);

 //等待复位校准

 while(ADC_GetResetCalibrationStatus(ADC1)==SET);

 //开始校准

 ADC_StartCalibration(ADC1);

 //等待开始校准

 while(ADC_GetCalibrationStatus(ADC1)==SET); 

 ADC_SoftwareStartConvCmd(ADC1,ENABLE);

}

ad.h文件

#ifndef _AD_H

#define _AD_H

#include "stdint.h"

extern uint16_t AD_Value[4];

void ad_Init(void);

#endif

main.c文件

#include "stm32f10x.h"

#include "stm32f10x_adc.h"

#include "delay.h"

#include "OLED.h"

#include "ad.h"

int main (void)

 //初始化函数

 OLED_Init();

 ad_Init();

 OLED_ShowString(1,1,"AD0_Value:");

 OLED_ShowString(2,1,"AD1_Value:");

 OLED_ShowString(3,1,"AD2_Value:");

 OLED_ShowString(4,1,"AD3_Value:");

 while(1)

 {

  OLED_ShowNum(1,11,AD_Value[0],4);

  OLED_ShowNum(2,11,AD_Value[1],4);

  OLED_ShowNum(3,11,AD_Value[2],4);

  OLED_ShowNum(4,11,AD_Value[3],4);

  delay_ms(1000);

 }

}

 

这篇关于STM32自学☞DMA数据转运以及DMA+AD多通道案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/766489

相关文章

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内