stm32f429之多通道ADC通过DMA数据采集
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数据采集相关推荐
- STM32——多通道ADC的DMA方式采集方法
前言: 最近在调试STM32F205芯片ADC多通道DMA方式采集数据,总结下STM32多通道ADC的DMA方式采集的使用方法. 硬件平台:STM32F205 软件平台:keil v5 函数库:标准库 ...
- STM32F767多通道ADC采集+DMA传输
文章目录 一.ADC简介 1.ADC采样频率 2.ADC转换时间 3.ADC寄存器 4.ADC引脚与外部通道对应关系 二.DMA简介 三.代码配置 1.ADC.DMA初始化配置 2.adc.h文件的配 ...
- dma和通道的区别_STM32 定时器触发 ADC 多通道采集,DMA搬运至内存
引言 ADC 的功能是将模拟信号采样得到数字信号,而有些时候,我们需要使用到定时采样,比如在计算一个采集的波形的频率的时候,我们需要精确的知道采样频率,也就是 1 s 内采集的点数,这个时候,就需要使 ...
- stm32之ADC应用实例(单通道、多通道、基于DMA)
硬件:STM32F103VCT6 开发工具:Keil uVision4 下载调试工具:ARM仿真器 网上资料很多,这里做一个详细的整合.(也不是很详细,但很通俗). 所用的芯片内嵌3个12位的模拟/数 ...
- 基于STM32F4:多通道ADC采集,采用DMA的形式,亲测有效
基于STM32F4的多通道ADC采集 单片机源程序如下: #include "sys.h" #include "delay.h" #include " ...
- 复旦微FM33LE0x单片机之多通道ADC DMA
一.简介 本例程以FM33LE026为例,已经过验证,其他型号不保证适用. 工欲善其事必先利其器,官方手册就是利器,在接触新开发平台时,仔细阅读手册能大幅提升开发进度,避免很多掉头发事件,光头 ...
- axi dma 寄存器配置_STM32 ADC多通道转换的DMA传输示例
这里以STM32F334 Nucleo板作为硬件平台,使用ARM keil MDK集成开发环境. 对3个ADC通道进行连续.扫描转换,转换结果通过DMA传输到内存,再作为TIM2的3个比较寄存器的值, ...
- [基础代码仓库]基于STM32C8T6的库函数ADC模拟+DMA多通道转运代码
目录 导言 理论部分 STM32F103C8T6最小系统板 代码初始化步骤 代码部分 一.1个通道PA0 二.2个通道PA0.PA1 三.3个通道PA0.PA1.PA2 四.4个通道PA0~PA3 五 ...
- 使用STM32 CUBE IDE配置STM32F7 用DMA传输多通道ADC数据
我的使用环境: 硬件:STM32F767ZGT6.串口1.ADC1.16MHz晶振.216MHz主频 软件:STM32 CUBE IDE 优点:不用定时触发采样,ADC数据是不停的实时更新,ADC数据 ...
最新文章
- B端设计指南-表格设计的常见问题
- idea设置java scala等代码自动换行
- kubernetes 集群部署
- arp 华为 查看 路由器_华为路由器运行状态查看-路由器
- 从底部上滑失灵_iPad 上这 20 个快捷操作,真正帮你提高生产力!
- MySQL8web安装_mysql 8.0.18 安装配置图文教程
- python【第三篇】迭代器、生成器、闭包
- 苹果cms怎么添加友情链接图文教程
- 战旗助手服务器代码,炉石盒子PC端人工智能战棋助手启用!
- 怎么解除计算机管理员的身份,怎么取消管理员权限(怎么取消管理员取得所有权)...
- UDP如何实现可靠性传输
- 关于gitlab报错 would clobber existing tag 的解决办法
- html5 自动设置全屏,HTML5 body如何设置自适应全屏 HTML5 body设置自适应全屏代码
- B站高管解读财报:要更快实现盈亏平衡 陈睿亲自盯减亏工作
- linux 打印进程日志,Linux系统日志管理:(2)进程统计日志
- [网络规划] 拓扑图绘图工具yED Graph Editor使用(持续更新)
- 老中医给程序员的养生指北|开奖啦
- 英特尔 超核芯显卡 620mac_显卡性能翻倍,AI能力加持:英特尔发布10代酷睿处理器...
- Ubuntu 16.04 安装 CUDA Toolkit 10.0
- Linux下Oracle 11g安装(1)—— 系统安装篇
热门文章
- vue3+element-plus动态设置字体大小
- 24微信小程序开发2
- BZOJ3168. 【HEOI2013】钙铁锌硒维生素
- unity3D数据的本地存储(xml的方式)
- 1005打印任务取消不了 hp_Windows10+HP M176N奇怪的发送打印命令不执行任务就消失的问题...
- iOS年月日、时分秒选择器
- python 矩阵拼接_Numpy基础4 矩阵取整 拉平 拼接 切分 复制等函数操作
- android 人物行走动画,android 3D 游戏实现之人物行走(MD2)
- 【miscellaneous】视频浓缩摘要简介
- 三天,我通过了Apsara Clouder基础技能认证:阿里巴巴Android开发规范