stm32f429之多通道ADC通过DMA数据采集

原来的程序使用时stm32f103的芯片,现在给为stm32f429的芯片,查看一下几家开发板例程,发现没有使用adc+dma的,在网上也搜索了一下,没找到直接可以用的,花一些时间,现在分享出来,供大家参考。
中心思想,dma循环将ADC数据存储到指定位置,需用读取adc数据值,直接从缓存区提取;
时间有限,直接上代码。

DMA初始化
void MYDMA_Config(void)
{ __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能    //Tx DMA配置ADC1_DMA_Handler.Instance=DMA2_Stream0;                            //数据流选择ADC1_DMA_Handler.Init.Channel=DMA_CHANNEL_0;                                //通道选择ADC1_DMA_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY;             //存储器到外设ADC1_DMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设增量模式ADC1_DMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式ADC1_DMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;    //外设数据长度:16位ADC1_DMA_Handler.Init.MemDataAlignment=DMA_PDATAALIGN_HALFWORD;       //存储器数据长度:16位ADC1_DMA_Handler.Init.Mode=DMA_CIRCULAR;                            //外设普通模式ADC1_DMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级ADC1_DMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              ADC1_DMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      ADC1_DMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输ADC1_DMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输__HAL_LINKDMA(&ADC1_Handler,DMA_Handle,ADC1_DMA_Handler);    //将DMA与USART1联系起来(发送DMA)ADC1_DMA_Handler.Instance->PAR = (u32)&ADC1->DR;//外设地址ADC1_DMA_Handler.Instance->M0AR = (vu32)ADC_ConvertedValue;ADC1_DMA_Handler.Instance->NDTR = 8;HAL_DMA_DeInit(&ADC1_DMA_Handler);   HAL_DMA_Init(&ADC1_DMA_Handler);HAL_DMA_Start(&ADC1_DMA_Handler, (u32)&ADC1->DR, (vu32)ADC_ConvertedValue, N*ADC_CHANNELS);
} /***************************************************************************************************
*名称: MY_ADC_Init()
*描述: 配置AD转换,使用ADC1,DMA2,转换8个通道
*入口参数:   无
*出口参数:   无
***************************************************************************************************/
void MY_ADC_Init(void)
{ ADC_ChannelConfTypeDef ADC1_ChanConf;ADC1_Handler.Instance=ADC1;ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZADC1_Handler.Init.Resolution=ADC_RESOLUTION_12B;             //12位模式ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐ADC1_Handler.Init.ScanConvMode=ENABLE;                      //扫描模式?ADC1_Handler.Init.EOCSelection=DISABLE;                      //关闭EOC中断ADC1_Handler.Init.ContinuousConvMode=ENABLE;                //开启连续转换ADC1_Handler.Init.NbrOfConversion=8;                         //8个转换在规则序列中 也就是只转换规则序列1 ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式ADC1_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;       //软件触发ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发ADC1_Handler.Init.DMAContinuousRequests=ENABLE;             //开启DMA请求HAL_ADC_Init(&ADC1_Handler);                                 //初始化 //转换序列ADC1_ChanConf.Channel = ADC_CHANNEL_8;ADC1_ChanConf.Rank = 1;                                       //第1个序列,序列1ADC1_ChanConf.SamplingTime = ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf.Offset = 0;HAL_ADC_ConfigChannel(&ADC1_Handler, &ADC1_ChanConf);ADC1_ChanConf.Channel = ADC_CHANNEL_15;ADC1_ChanConf.Rank = 2;                                        //第1个序列,序列2ADC1_ChanConf.SamplingTime = ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf.Offset = 0;HAL_ADC_ConfigChannel(&ADC1_Handler, &ADC1_ChanConf);ADC1_ChanConf.Channel = ADC_CHANNEL_14;ADC1_ChanConf.Rank = 3;                                        //第1个序列,序列3ADC1_ChanConf.SamplingTime = ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf.Offset = 0;HAL_ADC_ConfigChannel(&ADC1_Handler, &ADC1_ChanConf);ADC1_ChanConf.Channel = ADC_CHANNEL_7;ADC1_ChanConf.Rank = 4;                                     //第1个序列,序列4ADC1_ChanConf.SamplingTime = ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf.Offset = 0;HAL_ADC_ConfigChannel(&ADC1_Handler, &ADC1_ChanConf);ADC1_ChanConf.Channel = ADC_CHANNEL_6;ADC1_ChanConf.Rank = 5;                                     //第1个序列,序列5ADC1_ChanConf.SamplingTime = ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf.Offset = 0;HAL_ADC_ConfigChannel(&ADC1_Handler, &ADC1_ChanConf);ADC1_ChanConf.Channel = ADC_CHANNEL_3;ADC1_ChanConf.Rank = 6;                                     //第1个序列,序列6ADC1_ChanConf.SamplingTime = ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf.Offset = 0;HAL_ADC_ConfigChannel(&ADC1_Handler, &ADC1_ChanConf);ADC1_ChanConf.Channel = ADC_CHANNEL_9;ADC1_ChanConf.Rank = 7;                                     //第1个序列,序列6ADC1_ChanConf.SamplingTime = ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf.Offset = 0;HAL_ADC_ConfigChannel(&ADC1_Handler, &ADC1_ChanConf);ADC1_ChanConf.Channel = ADC_CHANNEL_5;ADC1_ChanConf.Rank = 8;                                     //第1个序列,序列6ADC1_ChanConf.SamplingTime = ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf.Offset = 0;HAL_ADC_ConfigChannel(&ADC1_Handler, &ADC1_ChanConf);
//  HAL_ADC_Start(&ADC1_Handler);MYDMA_Config();//初始化并开启DMAHAL_ADC_Start_DMA(&ADC1_Handler, (vu32*)&ADC_ConvertedValue, N*ADC_CHANNELS);
}//ADC,引脚配置,时钟使能
//此函数会被HAL_ADC_Init()调用
//hadc:ADC句柄
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_ADC1_CLK_ENABLE();            //使能ADC1时钟__HAL_RCC_GPIOA_CLK_ENABLE();          //开启GPIOA时钟__HAL_RCC_GPIOB_CLK_ENABLE();            //开启GPIOA时钟__HAL_RCC_GPIOC_CLK_ENABLE();            //开启GPIOA时钟GPIO_Initure.Pin=GPIO_PIN_3|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_5;            //PA3,6,7, 5用于测试GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉HAL_GPIO_Init(GPIOA,&GPIO_Initure);GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1;            //PB0,1HAL_GPIO_Init(GPIOB,&GPIO_Initure);GPIO_Initure.Pin=GPIO_PIN_4|GPIO_PIN_5;            //PC4,5HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}/***************************************************************************************************
*名称:getAdc()
*描述:读取指定通道AD值
*入口参数:通道号channel,取值分为0到(ADC_CHANNELS-1)
*出口参数:AD值
***************************************************************************************************/
uint16 getADC_CH(uint8 channel){u16 tbuf[N];__IO u32 tdat=0;u8 ti;//判断传入参数是否合法if(channel>=ADC_CHANNELS){return 0;}for(ti=0;ti<N;ti++){tbuf[ti]=ADC_ConvertedValue[ti][channel];}bubbleSort(tbuf, N);for(ti=25;ti<(N-25);ti++){tdat+=tbuf[ti];}tdat/=50;if(tdat<5){tdat=0;}return tdat;
}

源码下载 https://download.csdn.net/download/wangluo515/14158061
改程序已经在正点原子开发板上验证;

默认每通道开了100个缓存空间。

stm32f429之多通道ADC通过DMA数据采集相关推荐

  1. STM32——多通道ADC的DMA方式采集方法

    前言: 最近在调试STM32F205芯片ADC多通道DMA方式采集数据,总结下STM32多通道ADC的DMA方式采集的使用方法. 硬件平台:STM32F205 软件平台:keil v5 函数库:标准库 ...

  2. STM32F767多通道ADC采集+DMA传输

    文章目录 一.ADC简介 1.ADC采样频率 2.ADC转换时间 3.ADC寄存器 4.ADC引脚与外部通道对应关系 二.DMA简介 三.代码配置 1.ADC.DMA初始化配置 2.adc.h文件的配 ...

  3. dma和通道的区别_STM32 定时器触发 ADC 多通道采集,DMA搬运至内存

    引言 ADC 的功能是将模拟信号采样得到数字信号,而有些时候,我们需要使用到定时采样,比如在计算一个采集的波形的频率的时候,我们需要精确的知道采样频率,也就是 1 s 内采集的点数,这个时候,就需要使 ...

  4. stm32之ADC应用实例(单通道、多通道、基于DMA)

    硬件:STM32F103VCT6 开发工具:Keil uVision4 下载调试工具:ARM仿真器 网上资料很多,这里做一个详细的整合.(也不是很详细,但很通俗). 所用的芯片内嵌3个12位的模拟/数 ...

  5. 基于STM32F4:多通道ADC采集,采用DMA的形式,亲测有效

    基于STM32F4的多通道ADC采集 单片机源程序如下: #include "sys.h" #include "delay.h" #include " ...

  6. 复旦微FM33LE0x单片机之多通道ADC DMA

    一.简介   本例程以FM33LE026为例,已经过验证,其他型号不保证适用.   工欲善其事必先利其器,官方手册就是利器,在接触新开发平台时,仔细阅读手册能大幅提升开发进度,避免很多掉头发事件,光头 ...

  7. axi dma 寄存器配置_STM32 ADC多通道转换的DMA传输示例

    这里以STM32F334 Nucleo板作为硬件平台,使用ARM keil MDK集成开发环境. 对3个ADC通道进行连续.扫描转换,转换结果通过DMA传输到内存,再作为TIM2的3个比较寄存器的值, ...

  8. [基础代码仓库]基于STM32C8T6的库函数ADC模拟+DMA多通道转运代码

    目录 导言 理论部分 STM32F103C8T6最小系统板 代码初始化步骤 代码部分 一.1个通道PA0 二.2个通道PA0.PA1 三.3个通道PA0.PA1.PA2 四.4个通道PA0~PA3 五 ...

  9. 使用STM32 CUBE IDE配置STM32F7 用DMA传输多通道ADC数据

    我的使用环境: 硬件:STM32F767ZGT6.串口1.ADC1.16MHz晶振.216MHz主频 软件:STM32 CUBE IDE 优点:不用定时触发采样,ADC数据是不停的实时更新,ADC数据 ...

最新文章

  1. B端设计指南-表格设计的常见问题
  2. idea设置java scala等代码自动换行
  3. kubernetes 集群部署
  4. arp 华为 查看 路由器_华为路由器运行状态查看-路由器
  5. 从底部上滑失灵_iPad 上这 20 个快捷操作,真正帮你提高生产力!
  6. MySQL8web安装_mysql 8.0.18 安装配置图文教程
  7. python【第三篇】迭代器、生成器、闭包
  8. 苹果cms怎么添加友情链接图文教程
  9. 战旗助手服务器代码,炉石盒子PC端人工智能战棋助手启用!
  10. 怎么解除计算机管理员的身份,怎么取消管理员权限(怎么取消管理员取得所有权)...
  11. UDP如何实现可靠性传输
  12. 关于gitlab报错 would clobber existing tag 的解决办法
  13. html5 自动设置全屏,HTML5 body如何设置自适应全屏 HTML5 body设置自适应全屏代码
  14. B站高管解读财报:要更快实现盈亏平衡 陈睿亲自盯减亏工作
  15. linux 打印进程日志,Linux系统日志管理:(2)进程统计日志
  16. [网络规划] 拓扑图绘图工具yED Graph Editor使用(持续更新)
  17. 老中医给程序员的养生指北|开奖啦
  18. 英特尔 超核芯显卡 620mac_显卡性能翻倍,AI能力加持:英特尔发布10代酷睿处理器...
  19. Ubuntu 16.04 安装 CUDA Toolkit 10.0
  20. Linux下Oracle 11g安装(1)—— 系统安装篇

热门文章

  1. vue3+element-plus动态设置字体大小
  2. 24微信小程序开发2
  3. BZOJ3168. 【HEOI2013】钙铁锌硒维生素
  4. unity3D数据的本地存储(xml的方式)
  5. 1005打印任务取消不了 hp_Windows10+HP M176N奇怪的发送打印命令不执行任务就消失的问题...
  6. iOS年月日、时分秒选择器
  7. python 矩阵拼接_Numpy基础4 矩阵取整 拉平 拼接 切分 复制等函数操作
  8. android 人物行走动画,android 3D 游戏实现之人物行走(MD2)
  9. 【miscellaneous】视频浓缩摘要简介
  10. 三天,我通过了Apsara Clouder基础技能认证:阿里巴巴Android开发规范