#include "adc.h"
#include "stm32f4xx.h"
__IO uint16_t ADC_ConvertValue[3]={10,10,10};//定义一个数组存储数字电压,ADC_ConvertValue[0]存储ADC1的数据,ADC_ConvertValue[1]存储ADC2的数据
//一定要配置为16位的数据,因为每一次传输的数据都是16位半字的//ADC引脚功能配置-----PB组的引脚存在问题,具体我也不太清楚为什么
static void ADC_GPIO_Config(void)
{GPIO_InitTypeDef  GPIO_InitStructure;//RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟--对应PB1RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟--对应PA5//PA1-ADC1_CH1GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不上下拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化//PA6-ADC2_CH6GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不上下拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化//PA0-ADC3_CH0GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不上下拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
}//ADC模式配置
static void ADC_Mode_Config(void)
{/********DMA配置********/DMA_InitTypeDef DMA_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//开启DMA2时钟,ADC的DMA通道都在DMA2下,查DMA表,在中文参考手册里面
//  DMA_DeInit(DMA2_Stream0);//重置DMA2的流2,在多重ADC模式下,只要配置ADC1的流就行,因为ADC1是主ADCDMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)ADC_CDR_ADDR;//外设基地址:CDR寄存器DMA_InitStructure.DMA_Memory0BaseAddr=(u32)ADC_ConvertValue;//存储器基地址,注意一定要是32位的,其它位数的则必须转换一下DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory;//数据传输方向,外设到存储器DMA_InitStructure.DMA_BufferSize=3;//一次传输数据的量,因为我使用的是ADC的DMA模式1,所以每次都是只传输1个数据DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址不递增DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//存储器地址递增DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//外设传输数据的宽度,16位,半字,2字节DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//存储器的数据大小也要和外设一样,在使用FIFO模式时可以不一样DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//DMA模式,这里选择循环传输DMA_InitStructure.DMA_Priority=DMA_Priority_High;//DMA传输通道优先级设置,因为只使用了一个DMA通道,所以不用管优先级//以下是DMA的FIFO功能配置,是不需要的,所以失能,其它配置不用管DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Disable;//未使用FIFO模式,所以不使能DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_HalfFull;DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;DMA_InitStructure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;DMA_InitStructure.DMA_Channel=DMA_Channel_0;//DMA的通道选择,因为ADC1使用DMA2,数据流0,通道0,这个是手册固定死的DMA_Init(DMA2_Stream0,&DMA_InitStructure);//初始化DMA所有参数DMA_Cmd(DMA2_Stream0,ENABLE);//使能DMA流,此后DMA可用/************ADC配置***********/ADC_InitTypeDef ADC_InitStructure;ADC_CommonInitTypeDef ADC_CommonInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启ADC1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE);//开启ADC2的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3,ENABLE);//开启ADC3的时钟RCC_AHB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE);    // ADC1复位RCC_AHB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE);   // 复位结束RCC_AHB2PeriphResetCmd(RCC_APB2Periph_ADC2, ENABLE);    // ADC2复位RCC_AHB2PeriphResetCmd(RCC_APB2Periph_ADC2, DISABLE);   // 复位结束//----------------------ADC Common结构体初始化-------------------------------------ADC_CommonInitStructure.ADC_Mode=ADC_TripleMode_RegSimult;//ADC模式,三重ADC规则同步模式ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4;//ADC时钟分频:4分频ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_1;//ADC的DMA传输模式1,参考中文参考手册可知ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;//两个ADC采样时间间隔,,交替模式才有效ADC_CommonInit(&ADC_CommonInitStructure);//初始化ADC通用参数部分//-----------------------ADC Init结构体初始化-------------------------------ADC_StructInit(&ADC_InitStructure);//初始化一遍ADC_InitStructure,使其有原始值ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b;//ADC分辨率,使用12位分辨率,最大值是4096ADC_InitStructure.ADC_ScanConvMode=DISABLE;//不使用ADC通道扫描模式,因为每个ADC只有一个通道参与转换ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//开启连续转换模式ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;//不是使用外部边沿触发ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T1_CC1;//外部触发通道选择。因为使用了软件触发,这个选项随便选就行ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//对齐方式选择右对齐ADC_InitStructure.ADC_NbrOfConversion=1;//转换通道数目,每个ADC只有1个//ADC1的结构体初始化ADC_Init(ADC1,&ADC_InitStructure);ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_3Cycles);//配置ADC1,通道8,通道转换顺序1,采样时间为3个时钟周期//ADC2的结构体初始化ADC_Init(ADC2,&ADC_InitStructure);ADC_RegularChannelConfig(ADC2,ADC_Channel_6,1,ADC_SampleTime_3Cycles);//配置ADC2,通道9,通道转换顺序1,采样时间为3个时钟周期//ADC3的结构体初始化ADC_Init(ADC3,&ADC_InitStructure);ADC_RegularChannelConfig(ADC3,ADC_Channel_0,1,ADC_SampleTime_3Cycles);//配置ADC2,通道9,通道转换顺序1,采样时间为3个时钟周期ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);//使能多重ADC模式下的DMA传输请求after last transfer (multi-ADC mode)ADC_DMACmd(ADC1,ENABLE);//使能ADC1的DMA功能ADC_Cmd(ADC1,ENABLE);//使能ADC1ADC_Cmd(ADC2,ENABLE);//使能ADC2ADC_Cmd(ADC3,ENABLE);//使能ADC3ADC_SoftwareStartConv(ADC1);//软件触发开始转换,只用触发ADC1即可,ADC23自动打开}void MY_ADC_Init(void)
{ADC_GPIO_Config();ADC_Mode_Config();
}

遇到的问题描述:
三重ADC,单通道采样,规则同时。
ADC1-CH1,ADC2-CH6,ADC3-CH0
出现的问题:
初次用三重ADC时,选用的是PB引脚做ADC的输入,但是发现数据非常乱,完全不符合实际数据,出现了两个电压数据完全相同、一个电压数据为0无变化的情况,以为是DMA和ADC在配置的时候错误,没有配置正确,但是对照网上的例子和野火、正点原子的例程发现配置是不应该有问题的,于是我选择换一个引脚组进行配置,PA组,更换之后数据开始正确采集,也没有错误,迷一样的问题呀

解决方案:参考正点原子、野火例程源码,还有一篇帖子http://www.stmcu.org.cn/module/forum/thread-603974-1-2.html

STM32F407三重ADC配置相关推荐

  1. STM32F4系列探究1——三重ADC扫描连续采样+DMA双缓冲区存储

    文章目录 前言 一.STM32F4的ADC理论知识学习 1.基础知识 2.扫描模式与连续模式 3.单ADC模式下双缓存机制的实现 4.三重同步采样模式 二.由定时器触发的单缓冲区模式 1.时钟树配置 ...

  2. STM32F407关于ADC 性能问题讨论

    最近在开发一个产品,使用STM32F407的ADC功能,在调试前期,ADC极其不稳定,波动很大.就连原子哥也对其ADC性能提出质疑.结果果真如此吗? 在软件调试之前,一个良好的硬件设计是保证ADC性能 ...

  3. ## STM32F103的光照、烟雾MQ2、有毒气体MQ135的ADC配置(寄存器版与库函数版

    STM32F103的光照.烟雾MQ2.有毒气体MQ135的ADC配置(寄存器版与库函数版 //#include "adc.h"#if 0 //寄存器编程 /************ ...

  4. 【STM32F042】ADC卡死,ADC一直为0,ADC配置的坑

    1.问题描述 最近在调试电机驱动,刚好写到电压采集这一部分,板子的主控是STM32F040K6T6.用到了ADC,使用非DMA方式.刚开始读取到的值全部是0,然后程序卡死,我在使用万用表测IO口电压后 ...

  5. 基于STM32F407使用ADC采集电压实验

    核心板:STM32F407 实验目的:使用ADC采集电压值将其打印在串口助手上 目录 ADC简介 STM32F407 ADC通道对应的引脚 STM32F407中的数据寄存器 ADC 规则数据寄存器 ( ...

  6. 基于STM32F407的ADC解析-ADC1多通道扫描模式电压采集实验(启用DMA传输数据)

    目录 一:STM32F4的ADC简介 1.1 ADC简介(不看也行) 1.2 ADC的供电及采样电压 二:实验步骤及代码 2.1实验步骤 2.2实验代码 2.2.1 ADC初始化代码 2.2.2 DM ...

  7. STM32F411核心板固件库开发(四) ADC配置

    (一)CEU6的ADC 因为之前已经和F411CEU6先生打过招呼了,这次呢,我们就让F411CEU6先生帮助我们完成电压采集的工作,我们要用一下F411CEU6的ADC模块. 这是F411CEU6的 ...

  8. STM32之ADC配置,ADC_Mode模式理解

    对于STM32,在使用ADC的时候需要配置几个参数. 第一个参数是ADC_Mode,这里设置为独立模式: ADC_InitStructure.ADC_Mode = ADC_Mode_Independe ...

  9. stm32f407引脚相关配置

    stm32f407的IO口可由软件配置成8种模式:输入浮空.输入上拉.输入下拉.模拟输入.开漏输出.推挽输出.推挽式复用功能.开漏式复用功能. 下列分别是GPIOx常用配置相关的寄存器: 1.MODE ...

最新文章

  1. grep,但只有特定的文件扩展名
  2. LeaFlet学习之GridLayer扩展
  3. php多线程解决之stream_socket_client
  4. “数据分析”如何作用于“用户研究”?--转载微博
  5. java学习(31):for循环
  6. 2019金球奖——梅西
  7. P3698 [CQOI2017]小Q的棋盘
  8. 国内开发商品基金的一些设想
  9. win10怎么改管理员名字_中控智慧考勤门禁_机器直连软件及清除管理员
  10. mac os下可能是最好的豆瓣电台——diumoo
  11. HSPICE物理模型仿真——添加variation时利用seed产生伪随机分布
  12. 检察院批准逮捕洪磊,铁杆分子不买帐
  13. 微信公众号JSAPI支付对接
  14. 好用的mysql可视化工具_介绍一款免费好用的可视化数据库管理工具
  15. 回归:最小二乘法求解回归模型代码
  16. stm32cubeide烧写程序_STM32Cube工具,覆盖开发全过程(一)
  17. openstack ubuntu虚机重启卡在booting from hard disk问题解决
  18. 与英特尔分手后,苹果收获成功
  19. Pycharm永久激活七步走
  20. 打字游戏代码_下一个打字稿代码的5大专业技巧

热门文章

  1. 6月份智能手机市场份额发布:联想超华为第二逼近三星
  2. 网上问政有用吗?如何能更快得到回复?
  3. 水果店开业如何做开店活动,新水果店开业需要做哪些促销活动
  4. 九龙证券|人工智能+国产软件+智慧城市概念股火了,欧洲资管巨头大举抄底
  5. 100Mbps 和 100Mb/s 单位Mbps和Mb/s有什么不同
  6. APICLOUD实现沉浸式导航栏在Android和ios上的兼容
  7. 考生合格证书打印的部分代码和生成证书方法
  8. 通达信VCP形态选股公式,憋了好几天才写出来
  9. Python 罗德里格矩阵的空间坐标转换——两组公共点求所属坐标系的旋转矩阵与平移矩阵
  10. 编程菜鸟到大鸟--代码积累