首页 > 其他分享 >stm32f429iDisc AD规则组多通道+DMA转运

stm32f429iDisc AD规则组多通道+DMA转运

时间:2024-07-11 13:31:36浏览次数:12  
标签:DMA ENABLE AD 多通道 InitStructure ADC ADC1 GPIO

扫描模式+非连续触发

uint16_t Adc_Value[5] = {0};
DMA_InitTypeDef DMA_InitStructure;
void AD_Init(void){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
	
// -------------------------------------GPIO配置---------------------------------------
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
// ---------------------------------------ADC配置----------------------------------------
	ADC_CommonInitTypeDef ADC_CommonInitStructure;
	ADC_InitTypeDef ADC_InitStructure;
	
	ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
	ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1; // DMA配置
	ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_8Cycles; 
	
	ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;  // 分辨率
	ADC_InitStructure.ADC_ScanConvMode = ENABLE;  // 扫描
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;  // 非连续
	ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; // 无外部触发ADC
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO; // 触发事件:因无外部触发,无用配置
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_NbrOfConversion = 5; // ADC转换通道数
	ADC_CommonInit(&ADC_CommonInitStructure);
	ADC_Init(ADC1, &ADC_InitStructure);
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_84Cycles); // 配置通道和采样周期
	ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_84Cycles); // 配置通道和采样周期
	ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 3, ADC_SampleTime_84Cycles); // 配置通道和采样周期
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 4, ADC_SampleTime_84Cycles); // 配置通道和采样周期
	ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 5, ADC_SampleTime_84Cycles); // 配置通道和采样周期
// --------------------------------------DMA配置----------------------------------------
	DMA_InitStructure.DMA_Channel = DMA_Channel_0;
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
	DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Adc_Value;
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
	DMA_InitStructure.DMA_BufferSize = 5;
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;
	DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
//	DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
//	DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; 
	DMA_Init(DMA2_Stream0, &DMA_InitStructure);
	
	DMA_Cmd(DMA2_Stream0, ENABLE);
	ADC_DMACmd(ADC1, ENABLE);
	
	ADC_Cmd(ADC1, ENABLE);
}
// ----------------------------------main()中循环调用------------------------------------
void AD_ValueTransfer(void){
	DMA_Cmd(DMA2_Stream0, DISABLE);
	ADC_DMACmd(ADC1, DISABLE);
	DMA_Init(DMA2_Stream0, &DMA_InitStructure);
	ADC_DMACmd(ADC1, ENABLE);
	DMA_Cmd(DMA2_Stream0, ENABLE);
	
	ADC_SoftwareStartConv(ADC1); //软件触发ADC1,此时ADC1进入采样转换状态
	while(DMA_GetFlagStatus(DMA2_Stream0,DMA_FLAG_TCIF0) == RESET);
	DMA_ClearFlag(DMA2_Stream0,DMA_FLAG_TCIF0);
}
// ------------------------------------获取转换值--------------------------------------
uint16_t Get_Adc_Value(uint8_t i){
	return Adc_Value[i];
}

扫描模式+连续触发

uint16_t Adc_Value[5] = {0};
DMA_InitTypeDef DMA_InitStructure;
void AD_Init(void){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
	
// -------------------------------------GPIO配置---------------------------------------
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
// ---------------------------------------ADC配置----------------------------------------
	ADC_CommonInitTypeDef ADC_CommonInitStructure;
	ADC_InitTypeDef ADC_InitStructure;
	
	ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
	ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1; // DMA配置
	ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_8Cycles; 
	
	ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;  // 分辨率
	ADC_InitStructure.ADC_ScanConvMode = ENABLE;  // 扫描
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  // 连续
	ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; // 无外部触发ADC
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO; // 触发事件:因无外部触发,无用配置
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_NbrOfConversion = 5; // ADC转换通道数
	ADC_CommonInit(&ADC_CommonInitStructure);
	ADC_Init(ADC1, &ADC_InitStructure);
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_84Cycles); // 配置通道和采样周期
	ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_84Cycles); // 配置通道和采样周期
	ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 3, ADC_SampleTime_84Cycles); // 配置通道和采样周期
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 4, ADC_SampleTime_84Cycles); // 配置通道和采样周期
	ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 5, ADC_SampleTime_84Cycles); // 配置通道和采样周期
// --------------------------------------DMA配置----------------------------------------
	DMA_InitStructure.DMA_Channel = DMA_Channel_0;
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
	DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Adc_Value;
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
	DMA_InitStructure.DMA_BufferSize = 5;
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;
	DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
//	DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
//	DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; 
	DMA_Init(DMA2_Stream0, &DMA_InitStructure);
	
	DMA_Cmd(DMA2_Stream0, ENABLE);
	ADC_DMACmd(ADC1, ENABLE);
	ADC_Cmd(ADC1, ENABLE);

    ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
	ADC_SoftwareStartConv(ADC1); //软件触发ADC1,此时ADC1进入采样转换状态
}
// -------------------------------main()中直接获取转换值---------------------------------
uint16_t Get_Adc_Value(uint8_t i){
	return Adc_Value[i];
}

标签:DMA,ENABLE,AD,多通道,InitStructure,ADC,ADC1,GPIO
From: https://blog.csdn.net/qq_39683145/article/details/140349324

相关文章

  • Kubernetes安装-kubeadm方式
    环境1.软件版本系统版本centos7.9(内核采用4.19)docker20.10.15kubeadm1.22.172.ip划分主机名ip地址系统配置kubeadm-master10.103.236.2012core_2gkubeadm-node0110.103.236.2021core_2gkubeadm-node0210.103.236.2031core_2gkubeadm......
  • c#/.net HttpContext.Request.BodyReader(PipeReader)的读取方式
    publicasyncTask<string>GetString(){//防止中间件已经读取过数据Request.Body.Position=0;do{ReadResultreadResult=awaitRequest.BodyReader.ReadAsync();t......
  • 01.前后端分离中台框架后端 Admin.Core 学习-介绍与配置说明
    合集-Admin.Core(6) 1.01.前后端分离中台框架后端Admin.Core学习-介绍与配置说明2023-08-202.02.前后端分离中台框架前端admin.ui.plus学习-介绍与简单使用2023-08-213.03.前后端分离中台框架zhontai项目代码生成器的使用2023-08-224.04.使用githubactions+dock......
  • 使用中台 Admin.Core 实现了一个Razor模板的通用代码生成器
    前言前面使用Admin.Core的代码生成器生成了通用代码生成器的基础模块分组,模板,项目,项目模型,项目字段的基础功能,本篇继续完善,实现最核心的模板生成功能,并提供生成预览及代码文件压缩下载准备首先清楚几个模块的关系,如何使用,简单画一个流程图前面完成了基础的模板组,模板管......
  • 算法金 | DL 骚操作扫盲,神经网络设计与选择、参数初始化与优化、学习率调整与正则化、
    大侠幸会,在下全网同名「算法金」0基础转AI上岸,多个算法赛Top「日更万日,让更多人享受智能乐趣」今日216/10000抱个拳,送个礼神经网络设计与选择参数初始化与优化学习率调整与正则化数据预处理与标准化训练过程与监控特定模型技巧其他训练技巧1.神经网络设计......
  • k8s集群安装-kubeadm安装
    kubeadm安装集群准备工作角色IP组件k8s-master192.168.1.20kube-apiserver,kube-controller-manager,kube-scheduler,docker,etcdk8s-node01192.168.1.18kubelet,kube-proxy,docker,etcdk8s-node02192.168.1.19kubelet,kube-proxy,docker,etcddocker版......
  • 提速下载,不再等待!2024Internet Download Manager超实用评测
    ......
  • 互联网下载管家Internet Download Manager提速下载,IDM神器助你秒下大文件!
    嘿!亲爱的下载达人们,你们还在为慢吞吞的下载速度而苦恼吗?......
  • 7.10日工作总结双区BootLoad
    今日把昨天遇到的问题解决了,昨天的问题果然还是在FLASH区刷写上,存在两个问题导致APP1区上刷写的程序不对,第一处问题出现在把APP2程序上的无效空间(如00H-600H,不是程序正常数据,程序地址从600H开始计数,但是KEIL生成的HEX转BIN文件,前600H也有数据虽然都是0,但是在IAP写入过程中需要删掉......
  • 几何着色器 Geometry Shader
    参考: 【UnityShader入门】4、几何着色器GeometryShaders之结构解析_shader编译目标级别-CSDN博客GeometryShader(Unity几何着色器)_unitygeometryshader-CSDN博客Unity几何着色器详解-知乎(zhihu.com) /*[maxvertexcount(N)]:用来指定几何着色器单次调用所输出......