昨天做了一个ADC的程序一直想学习一下DMA的配置,我一直也是不懂DMA到底有什么用处,还是感觉很鸡肋。稍微配置了一下,我是这样理解DMA的。在配置了dma之后我们adc的数据不会再由cpu搬运,我们直接读取我们DMA数据是节省adc时间。直接看配置

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.5MHZ
    ADC1_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=2;                         //2个转换在规则序列中 也就是只转换规则序列2 
    ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;       //禁止不连续采样模式
    ADC1_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0
    ADC1_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_5;                                   //通道
    ADC1_ChanConf.Rank=1;                                       //第1个序列,序列1
    ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间
    ADC1_ChanConf.Offset=0;     /好像没用              
    HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置
 
ADC1_ChanConf.Channel= ADC_CHANNEL_4;                                   //通道
    ADC1_ChanConf.Rank=2;                                       //第1个序列,序列1
    ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间
    ADC1_ChanConf.Offset=0;    
    HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);

MY_ADC_DMA_Init(); 
}

__HAL_RCC_DMA2_CLK_ENABLE();

DMA2_Handler.Instance      =DMA2_Stream0;   //数据流0                
    DMA2_Handler.Init.Channel  =DMA_CHANNEL_0;  //通道0                 
    DMA2_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY; //数据传输方向:外设->内存
    DMA2_Handler.Init.PeriphInc=DMA_PINC_DISABLE;    //外设地址不变           
    DMA2_Handler.Init.MemInc=DMA_MINC_ENABLE;       //内存地址递增              
    DMA2_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;//数据半字16位    
    DMA2_Handler.Init.MemDataAlignment=DMA_PDATAALIGN_HALFWORD;  //数据半字16位    
    DMA2_Handler.Init.Mode=DMA_CIRCULAR;  //循环模式                                                                            
    DMA2_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;//DMA传输方式有关数据格式几次传输               
    DMA2_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    DMA2_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;     
    DMA2_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                
    DMA2_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;            
    __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,DMA2_Handler);     
    /* Configure DMA Stream source address */
    DMA2_Handler.Instance->PAR  = (u32)&ADC1->DR; //外设地址
    DMA2_Handler.Instance->M0AR = (vu32)ADC_DMA_ConvertedValue;//内存缓冲地址
    DMA2_Handler.Instance->NDTR =2;//数据长度
    HAL_DMA_Init(&DMA2_Handler);
HAL_DMA_Start (&DMA2_Handler,(u32)&ADC1->DR,(unsigned int)&ADC_DMA_ConvertedValue,2);//开启DMA

}

基本配置就是这样我们在

void Get_Adc_Average(u16 *temp,u8 times)
{
u32 temp_val[2]={0};
u8 t;
for(t=0;t<times;t++)
{
HAL_ADC_Start_DMA(&ADC1_Handler,(uint32_t*)&ADC_DMA_ConvertedValue,2);
temp_val[0]+=ADC_DMA_ConvertedValue[0];
temp_val[1]+=ADC_DMA_ConvertedValue[1];
delay_ms(5);
}
temp[0]=temp_val[0]/times;
temp[1]=temp_val[1]/times;
}

void ADC_DMA_Open(void)
{
         //DMA config    
          HAL_ADC_Start(&ADC1_Handler);                               //开启ADC
          MY_ADC_DMA_Init();              
         //ADC
          HAL_ADC_Start_DMA(&ADC1_Handler,(uint32_t*)&ADC_DMA_ConvertedValue,2);        
}

我在采样时取了十次求均值滤波值处理一下好像每次采样都要

HAL_ADC_Start_DMA(&ADC1_Handler,(uint32_t*)&ADC_DMA_ConvertedValue,2);这和先开启否则不会传入DMA有兴趣可以深入理解一下这个函数的用处。我也是简单学习一下就不在深究。到这配置就结束了

ADC/DMA配置:stm32f429xx_hal_adc.h

完整资料我上传到我的资源里欢迎参考修改

点击打开链接

STM32F429HAL库ADCDMA学习笔记相关推荐

  1. STM32F429HAL库定时器学习笔记

    这些基础的东西看视频很费时间而且有过基础的在学习只是库不太清楚,希望我总结的库使用的一些使用能节约一点大家的时间. void TIM3_Init(u16 arr,u16 psc) {       TI ...

  2. STM32F429HAL库UART学习笔记

    UART串口通讯作为最基本通讯协议我就不多赘述.我主要用HAL库实现串口通讯,看一下配置Uart的结构一变量 这里使用了结构体嵌套 typedef struct {   USART_TypeDef   ...

  3. 【Python-pywt】 小波变化库—Pywavelets 学习笔记

    (转载) [Python ]小波变化库--Pywavelets 学习笔记_nanbei2463776506的博客-CSDN博客 https://blog.csdn.net/nanbei24637765 ...

  4. 《C++标准库》学习笔记 — STL —流

    <C++标准库>学习笔记 - STL -流 一.操控器 1.原理 2.自定义操控器 3.控制输入的宽度 二.自定义 I/O 操作符 1.重载输出操作符 2.输入操作符 三.自定义格式化标志 ...

  5. Lib库使用学习笔记

    Lib库使用学习笔记 转自:http://blog.csdn.net/macky0668/article/details/6044867 技术前沿 2008-03-31 14:21:10 阅读177  ...

  6. 线性代数库 Armadillo 学习笔记

    线性代数库 Armadillo 学习笔记 项目环境 Xcode 项目配置 前置代码 矩阵基本操作 全零矩阵 全一矩阵 对角矩阵 打印一个矩阵 修改获取矩阵元素 获取某行某列 获取对角向量 转置矩阵 逆 ...

  7. 点云库PCL学习笔记 -- 点云滤波Filtering -- 3. StatisticalOutlierRemoval 统计滤波器

    点云库PCL学习笔记 -- 点云滤波Filtering -- 3.StatisticalOutlierRemoval 统计滤波器 StatisticalOutlierRemoval 统计滤波器相关简介 ...

  8. Python第三方库pygame学习笔记(一)

    Pygame Python最经典的2D游戏开发第三方库,也支持3D游戏开发 Pygame适合用于游戏逻辑验证.游戏入门及系统演示验证 Pygame是一种游戏开发引擎,基本逻辑具有参考价值 pygame ...

  9. CImg库快速学习笔记

    CImg库快速学习笔记 中山大学,曾坤老师的<计算机视觉>需要. 本文部分翻译自CImg_latest安装包中附带的英文文档的8 Class Documentation部分,以及互联网中的 ...

最新文章

  1. 新都一职高计算机学什么,新都第一职业高中怎么样
  2. NUXT: 视图和模板
  3. How to check table locks
  4. 自定义控件——旋转菜单
  5. android view xml,如何将View添加到XML布局android
  6. Spring缓存注解@CachePut , @CacheEvict,@CacheConfig使用
  7. dede织梦调用顶级二级栏目及下三级栏目方法!
  8. String类的流程控制
  9. 力扣-1232 缀点成线
  10. 超实用压力测试工具-ab工具
  11. 【IIS】XP系统的IIS发布
  12. excel查找命令_快速查找Excel功能区命令
  13. 5.22 对图层应用多个相同的图层样式(新) [原创Ps教程]
  14. springmvc中ajax请求406错误响应码
  15. python脚本开头怎么写_浅谈Python脚本开头及导包注释自动添加方法
  16. tomcat点击startup.bat闪退
  17. 王道考研408 数据结构 第三章 栈、队列与数组
  18. iPhone连接电脑WIN7不显示Apple iPhone便携式设备的解决办法
  19. MP-4可燃气体传感器介绍
  20. 03版计算机,office2003完整版电脑版

热门文章

  1. Ubuntu13.04配置优化(一)转贴
  2. 机器视觉核心算法——图像预处理
  3. Q140:PBRT-V3,各种渲染算法(Integrator,积分器)汇总
  4. php 操作xls,php中使用PHPExcel操作excel(xls)文件
  5. 推荐系统-Task02数据库基本使用
  6. 5.4(将英里转化位千米)
  7. 数据中台对企业意义和作用有哪些
  8. 2021年高考呼和浩特市二中成绩查询,呼和浩特市第二中学,是一所百强中学,2020年高考用实力来证明!...
  9. php android 乱码,如何解决android php 中文乱码问题
  10. android6.0原生brower_android原生browser分析(二)--界面篇